Vue学习笔记 - 逻辑复用 - 组合式函数

vue3学习-3(逻辑复用) 组件是主要的构建模块,而组合式函数则侧重于有状态的逻辑。另一方面,自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。// 在模板中启用 v-highlight</script><template></p>在不使用的情况下,自定义指令需要通过directivessetup() {/*...*/},// 在模板中启用 v-highlight/* ... */// 使 v-highlight 在所有组件中都可用/* ... */}) 阅读详情

昨天参加了次视频面试,慢慢可以查漏补缺,继续学习Vue相关的知识,考虑找个实际的开源项目。

逻辑复用

组合式函数

在 Vue 应用的概念中,“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。

无状态的逻辑:它在接收一些输入后立刻返回所期望的输出
有状态的逻辑:负责管理会随时间而变化的状态,比如跟踪当前鼠标在页面中的位置

鼠标跟踪器示例

直接使用

<script setup>
import { ref, onMounted, onUnmounted } from 'vue'

const x = ref(0)
const y = ref(0)

function update(event) {
  x.value = event.pageX
  y.value = event.pageY
}

onMounted(() => window.addEventListener('mousemove', update))
onUnmounted(() => window.removeEventListener('mousemove', update))
</script>

<template>Mouse position is at: {{ x }}, {{ y }}</template>

组合式函数

// mouse.js
import { ref, onMounted, onUnmounted } from 'vue'

// 按照惯例,组合式函数名以“use”开头
export function useMouse() {
  // 被组合式函数封装和管理的状态
  const x = ref(0)
  const y = ref(0)

  // 组合式函数可以随时更改其状态。
  function update(event) {
    x.value = event.pageX
    y.value = event.pageY
  }

  // 一个组合式函数也可以挂靠在所属组件的生命周期上
  // 来启动和卸载副作用
  onMounted(() => window.addEventListener('mousemove', update))
  onUnmounted(() => window.removeEventListener('mousemove', update))

  // 通过返回值暴露所管理的状态
  return { x, y }
}

在组件中使用的方式

<script setup>
import { useMouse } from './mouse.js'

const { x, y } = useMouse()
</script>

<template>Mouse position is at: {{ x }}, {{ y }}</template>

可以嵌套多个组合式函数

// event.js
import { onMounted, onUnmounted } from 'vue'

export function useEventListener(target, event, callback) {
  // 如果你想的话,
  // 也可以用字符串形式的 CSS 选择器来寻找目标 DOM 元素
  onMounted(() => target.addEventListener(event, callback))
  onUnmounted(() => target.removeEventListener(event, callback))
}
// mouse.js
import { ref } from 'vue'
import { useEventListener } from './event'

export function useMouse() {
  const x = ref(0)
  const y = ref(0)

  useEventListener(window, 'mousemove', (event) => {
    x.value = event.pageX
    y.value = event.pageY
  })

  return { x, y }
}
异步状态示例

带参数的组合函数

未抽取组合函数前

<script setup>
import { ref } from 'vue'

const data = ref(null)
const error = ref(null)

fetch('...')
  .then((res) => res.json())
  .then((json) => (data.value = json))
  .catch((err) => (error.value = err))
</script>

<template>
  <div v-if="error">Oops! Error encountered: {{ error.message }}</div>
  <div v-else-if="data">
    Data loaded:
    <pre>{{ data }}</pre>
  </div>
  <div v-else>Loading...</div>
</template>

抽取组合逻辑

// fetch.js
import { ref } from 'vue'

export function useFetch(url) {
  const data = ref(null)
  const error = ref(null)

  fetch(url)
    .then((res) => res.json())
    .then((json) => (data.value = json))
    .catch((err) => (error.value = err))

  return { data, error }
}

外部使用

<script setup>
import { useFetch } from './fetch.js'

const { data, error } = useFetch('...')
</script>

类似网络请求的API封装

接收响应式状态

useFetch() 接收一个静态 URL 字符串作为输入——因此它只会执行一次 fetch 并且就此结束。如果我们想要在 URL 改变时重新 fetch 呢?为了实现这一点,我们需要将响应式状态传入组合式函数,并让它基于传入的状态来创建执行操作的侦听器。

传一个ref

const url = ref('/initial-url')

const { data, error } = useFetch(url)

// 这将会重新触发 fetch
url.value = '/new-url'

或者接收一个getter函数

// 当 props.id 改变时重新 fetch
const { data, error } = useFetch(() => `/posts/${props.id}`)

可以用 watchEffect() 和 toValue() API 来重构我们现有的实现

// fetch.js
import { ref, watchEffect, toValue } from 'vue'

export function useFetch(url) {
  const data = ref(null)
  const error = ref(null)

  const fetchData = () => {
    // reset state before fetching..
    data.value = null
    error.value = null

    fetch(toValue(url))
      .then((res) => res.json())
      .then((json) => (data.value = json))
      .catch((err) => (error.value = err))
  }

  watchEffect(() => {
    fetchData()
  })

  return { data, error }
}

toValue() 使3.3版本新增的API。设计目的是将ref或getter规范化为值

是一个分段函数

  1. 当参数是ref类型,返回ref的值
  2. 当参数是函数,调用函数并返回其返回值
  3. 返回原参数

watchEffect 是 Vue 3 引入的一个函数,它会立即执行传入的函数,并响应式地追踪函数内部依赖的所有响应式数据,这里就是会跟踪url的变化

小结

  1. 带实现带参数的响应式组合函数,可以传ref或getter
  2. toValue函数可以接收静态 URL 字符串、ref 和 getter
  3. watchEffect函数会立即执行传入的函数,并响应式的追踪函数内部依赖的所有响应式数据
约定和最佳实践
命名

组合式函数约定用驼峰命名法命名,并以“use”作为开头。

输入参数

即便不依赖于 ref 或 getter 的响应性,组合式函数也可以接收它们作为参数。如果你正在编写一个可能被其他开发者使用的组合式函数,最好处理一下输入参数是 ref 或 getter 而非原始值的情况。可以利用 toValue() 工具函数来实现:

import { toValue } from 'vue'

function useFeature(maybeRefOrGetter) {
  // 如果 maybeRefOrGetter 是一个 ref 或 getter,
  // 将返回它的规范化值。
  // 否则原样返回。
  const value = toValue(maybeRefOrGetter)
}

为了正确追踪,请确保要么使用 watch() 显式地监视 ref 或 getter,要么在 watchEffect() 中调用 toValue()。

返回值

组合式函数始终返回一个包含多个 ref 的普通的非响应式对象,而不是reactive,这样该对象在组件中被解构为 ref 之后仍可以保持响应性

从组合式函数返回一个响应式对象会导致在对象解构过程中丢失与组合式函数内状态的响应性连接。与之相反,ref 则可以维持这一响应性连接。

ref() 与 reactive()

两者都用于跟踪其参数的更改。

不同之处

  1. ref()函数可以接受原始类型(最常见的是布尔值,字符串和数字)以及对象作为参数,而reactive()函数只能接受对象作为参数
  2. ref()有一个.value 属性,必须使用.value属性获取内容,但是使用reactive()可以直接访问
  3. 使用ref()函数可以替换整个对象实例,但是在使用reactive()函数时就不行

关于第2个的差异如下

// 有效
const x = reactive({ name: 'John'})
x.name = 'Amy'
// x => { name: 'Ammy' }

// 有效
const x = ref({ name: 'John'})
x.value.name = 'Amy'
// x.value => { name: 'Ammy' }

第3点就是返回值用ref

// 无效 - x 的更改不会被 Vue 记录
let x = reactive({name: 'John'})
x = reactive({todo: true})

// 有效
const x = ref({name: 'John'})
x.value = {todo: true}

我理解的就是把原始的数据给出去,交给接收者考虑就好

const mouse = reactive(useMouse())
// mouse.x 链接到了原来的 x ref
console.log(mouse.x)
副作用
  • 如果你的应用用到了服务端渲染 (SSR),请确保在组件挂载后才调用的生命周期钩子中执行 DOM 相关的副作用,例如:onMounted()。这些钩子仅会在浏览器中被调用,因此可以确保能访问到 DOM。
  • 确保在 onUnmounted() 时清理副作用。举例来说,如果一个组合式函数设置了一个事件监听器,它就应该在 onUnmounted() 中被移除 (就像我们在 useMouse() 示例中看到的一样)。当然也可以像之前的 useEventListener() 示例那样,使用一个组合式函数来自动帮你做这些事
使用限制
  1. <script setup> 或 setup() 钩子中被调用
  2. 同步
在选项式API中使用组合函数

组合式函数必须在 setup() 中调用,且其返回的绑定必须在setup()中返回

import { useMouse } from './mouse.js'
import { useFetch } from './fetch.js'

export default {
  setup() {
    const { x, y } = useMouse()
    const { data, error } = useFetch('...')
    return { x, y, data, error }
  },
  mounted() {
    // setup() 暴露的属性可以在通过 `this` 访问到
    console.log(this.x)
  }
  // ...其他选项
}

参考

  1. Vue.js文档
  2. js 传递多个不定个数的参数应该怎么写
  3. vue watch 和 watchEffect的区别和用法
  4. Vue3: 如何在 ref() 与 reactive() 之间做正确选择?
vue3组合式API与vue2选项式API有什么区别 【代码】vue3组合式API与vue2选项式API有什么区别。 阅读详情

相关推荐

Vue3 组合式函数

:“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。这里需要提一下的概念:它只包括了可重用的逻辑 (数据获取、分页等) 而不需要自己渲染内容,视图输出通过作用域插槽全权交给了消费者组件。大部分能用无渲染组件实现的功能都可以通过组合式 API 以另一种更高效的方式实现,并且还不会带来额外组件嵌套的开销。

前端知识分享喵 2636

Vue——组合式函数

Vue的组合式函数

hulin的博客 2966

【Vue知识点总结】Vue 组合式函数:逻辑复用的“异曲同工”与“和而不同”

在 Vue 中,组合式函数是一个利用 Vue 组合式 API 来封装和复用有状态逻辑的函数。简单来说,它就是一个普通的 JavaScript(或 TypeScript)函数,但它的内部使用了 Vue 的响应式 API(如refreactivecomputedwatch等),并且按照约定,它的命名通常以use开头。</script><template>组合式函数不是银弹,它不替代组件,而是组件的最佳拍档。

这是个栗子的博客 118

【vue3】组合式函数

vue3中提出了关于组合式函数的方法,与react中的hooks相同功能,比较常见的钩子有:windows 系统的钩子能监听到系统的各种事件,浏览器提供的 onload 或 addEventListener 能注册在浏览器各种时机被调用的方法。

zhaohb2016的博客 4184

ACPWorkbench_for_BP10

ADC支持9种采样率:8000Hz、11025Hz、12000Hz、16000Hz、22050Hz、24000Hz、32000Hz、44100Hz 以及 48000Hz。选择5种MCLK源时, 模块内部的MCLK源无效。I2S 采样率支持:8K,11.025K,12K,16K, 22.05K, 24K, 32K, 44.1K, 48K, 88.2K, 96K, 176.4K 和 192K。DAC采样率支持:8K,11.025K,12K,16K,22.05K, 24K, 32K, 44.1K和48K。

dddds222_的博客 4548

DSP28335做FFT傅里叶变换

1. 看了一下例程,居然没有FFT的例程,难道这个DSP28335不能做FFT吗?对了C2000系列是有C2000 ware这个库的。方便很多,不过目前不确定在C5000上运行的FFT能直接迁移到DSP28335上行不?测试了一下,是可以的,因为都是用的math.h,下面的一些正弦函数基本一样的 2. 硬件简介,其中DSP28335和TLV320AIC23B之间使用I2C接口进行寄存器配置,...

weixin_30390075的博客 3331

10 【异步组件 组合式函数(hooks)】

10 【异步组件 组合式函数(hooks)】

DSelegent的博客 687

ROS2实战:构建模块化启动文件(launch file)以驱动复杂机器人系统

本文详细介绍了ROS2中构建模块化启动文件(launch file)的最佳实践,帮助开发者高效管理复杂机器人系统的节点启动。通过功能分解、参数化设计和嵌套启动等技术,实现批量管理、依赖控制和配置统一,显著提升系统稳定性和调试效率。文章包含实战代码示例和工程化建议,特别适合自动驾驶、物流机器人等场景应用。

weixin_28744613的博客 214

Vue 组合式函数边界:复用逻辑,不要顺手复用混乱

A[Composable] --> B[状态封装]A --> C[副作用]A --> D[事件暴露]A --> E[清理机制]一个 composable 可以封装状态和行为,但不要偷偷操作太多外部环境。比如如果同时改路由、弹 toast、写全局 store,就很难复用。这种函数只负责查询状态,调用方决定怎么展示错误和跳转。Vue 组合式函数要明确职责、控制副作用、提供清理机制、保持返回值稳定,并用测试保护复用边界。复用逻辑很好,但不要顺手把混乱也复用出去。

大山哥 4411

前端监控体系:从Sentry到LogRocket错误追踪

Sentry是一款开源的实时错误追踪系统,支持多种语言和框架,包括JavaScript、React、Vue等。它提供了丰富的错误信息、堆栈跟踪和环境数据,帮助开发者快速定位和解决问题。LogRocket是一款前端监控和用户行为分析工具,它提供了视频回放、性能监控、错误追踪等功能。与Sentry不同,LogRocket更注重用户行为的全面分析。前端监控体系是确保应用稳定性和用户体验的重要保障。通过集成Sentry和LogRocket等监控工具,开发者可以实时追踪应用中的错误和用户行为,快速定位和解决问题。

shejizuopin的博客 1312

Spring Boot 与 Redisson 版本适配深度解析

Spring Boot 与 Redisson 的版本适配是一个动态演进的过程。开发者需要密切关注两者官方的版本更新日志,建立完善的版本验证机制。本文提供的适配方案基于当前最新技术状态(2024年1月),建议在实际生产环境中通过灰度发布策略验证版本兼容性。只有深入理解底层技术原理,才能在分布式系统的星辰大海中稳健航行。延伸阅读Spring Boot 官方迁移指南。

fudaihb的博客 1078

Vue3 组合式函数(逻辑复用)

Vue3组合式函数(Composables)是通过组合式API封装可复用状态逻辑的函数。文章通过鼠标追踪和异步获取数据两个示例,展示了从组件逻辑到组合式函数的封装过程,包括:1)基本组合式函数的创建和使用;2)通过函数嵌套实现逻辑的进一步拆分复用;3)支持响应式参数的组合式函数实现,利用watchEffect和toValue实现参数监听。组合式函数使得状态逻辑可以像组件一样被复用,同时保持组件间的状态独立性。这种模式提高了代码的可维护性和复用性,是Vue3组合式API的重要应用方式。

qq_39055970的博客 1089

【制作100个unity实战之2】实现一款简单的FPS游戏

你将学到: fps武器脚本 基础瞄准功能 僵尸敌人AI 巡逻范围 攻击间 搜寻半径 追击 枪声吸引周围的僵尸 击中僵直效果

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3548

在 Vue 3 中巧用组合式 API 实现高效逻辑复用

通过上面的介绍,相信大家已经对 Vue 3 中如何使用组合式 API 进行逻辑复用有了更深入的理解。组合式 API 为我们提供了一种强大且灵活的方式,让我们可以把相似的逻辑封装成组合函数,轻松实现代码的复用,提高代码的可读性和可维护性。在未来的前端开发中,随着 Vue 3 的持续普及,熟练掌握组合式 API 将成为开发者必备的技能。希望大家在实际项目中多多运用组合式 API,不断优化代码,打造出更加健壮、高效的应用程序。

qq_73376107的博客 1430

Calibre 3Dstack Flow Example(5-2)

本文详细介绍了Calibre3DSTACK工具在3D-IC设计验证中的应用。主要内容包括:1)连通性检查(LVS)规则编写,重点说明connected命令的使用方法和多文本标签处理;2)设计规则检查(DRC)实现,涵盖层间距检查和焊盘重叠检查;3)系统网表生成器操作流程,从芯片导入到网连通性定义;4)两种规则文件语法(扩展语法和传统语法)的编写示例;5)验证报告文件格式解析。通过具体案例演示了如何建立完整的3D-IC验证流程,包括芯片定义、装配操作、电气连接验证和物理规则检查等关键步骤,为3D-IC设计验证

u013620135的博客 2335

[PCIE5.0] 4.2.3.2 Encoding of Presets

• 发射器预设:发射器预设值用4位二进制编码,表示不同的预设设置(P0 到 P10),这些设置定义了信号的传输特性。• 接收器预设提示:接收器预设提示是通过3位二进制编码告诉接收器建议的增益值,用于调整接收器的灵敏度(适用于8.0 GT/s数据速率)。

系统固件工程师 574

vue3组合式API

组合式 API通过setup函数,提供了更加灵活的方式来组织和复用组件逻辑。它增强了代码的可复用性和可维护性,特别是在复杂的应用场景下,能更好地组织代码。响应式系统更加灵活,ref和reactive简化了状态管理。组合式函数(Composable)提供了更简洁的逻辑复用模式,替代了传统的mixin。

ngczx的博客 3207

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

18 VUE学习:组合式函数

在 Vue 应用的概念中,“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。当构建前端应用时,我们常常需要复用公共任务的逻辑。例如为了在不同地方格式化时间,我们可能会抽取一个可复用的日期格式化函数。这个函数封装了无状态的逻辑:它在接收一些输入后立刻返回所期望的输出。复用无状态逻辑的库有很多,比如你可能已经用过的 [lodash]或是 [date-fns]。相比之下,有状态逻辑负责管理会随时间而变化的状态。

百锦再的博客 10万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

. 如何在 Vue 3 中使用组合式 API 进行代码的逻辑复用?

组合式API是Vue3中引入的一种新特性,它允许开发者使用JavaScript函数组织代码,将逻辑捆绑起来,从而提高可读性和可重用性。通过setup函数,开发者可以使用ref和reactive创建响应式数据、使用computed来计算属性,并使用组合函数来复用逻辑。

有我更精彩的博客 1668

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Vue组合式函数,详细解析

​在 Vue 应用的概念中,“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。当构建前端应用时,我们常常需要复用公共任务的逻辑。例如为了在不同地方格式化时间,我们可能会抽取一个可复用的日期格式化函数。这个函数封装了无状态的逻辑:它在接收一些输入后立刻返回所期望的输出。复用无状态逻辑的库有很多,比如你可能已经用过的 loadsh 或是 date-fns。相比之下,有状态逻辑负责管理会随时间而变化的状态。一个简单的例子是跟踪当前鼠标在页面中的位置。

nibabaoo的博客 2081

深入探索Vue 3组合式API:提升组件逻辑复用与组织能力

Vue 3的组合式API让我们能够在组件内部或者跨组件之间更高效地组织和复用逻辑,使得大型项目能保持良好的架构和易于维护。通过熟练掌握这一系列新特性,开发者能够充分发挥Vue 3的优势,编写出更具扩展性与灵活性的现代Web应用程序。

聚焦于深度解析最新的编程语言特性、框架升级、架构设计、开发工具和最佳实践,涵盖Web前端(如Vue3, React, Angular等)、后端开发(如Node.js, Java, Python等)、移动端开发(iOS, Android原生及跨平台开发) 3万+

Vue3 组合式函数设计:复用逻辑之前先定义副作用

Vue3 组合式函数设计要先区分纯状态和副作用,让调用者知道它会请求什么、监听什么、清理什么。可复用不是把代码搬到useXxx里,而是让边界更清楚。

qq_34803115的博客 1321

vue3逻辑复用

Vue中的逻辑复用可以通过组合式函数和自定义指令实现。组合式函数(Composables)利用Vue的组合式API封装有状态逻辑,遵循"use"前缀命名规范,只能在setup上下文中同步调用,解决了mixin的数据来源不清晰等问题。而自定义指令主要用于复用底层DOM访问逻辑,通过定义包含生命周期钩子的对象来实现,可以局部或全局注册。两者分别适用于不同场景:组合式函数侧重逻辑复用,自定义指令专注DOM操作。

licongmingli的博客 1133

vue3-逻辑复用

无状态逻辑的函数_:它在接收一些输入后立刻返回所期望的输出。比如 时间格式化的函数。有状态逻辑的函数: 有状态逻辑负责管理会随时间而变化的状态。比如 跟踪当前鼠标在页面中的位置。在 Vue 应用的概念中,“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。一个简单的例子是跟踪当前鼠标在页面中的位置。在实际应用中,也可能是像触摸手势或与数据库的连接状态这样的更复杂的逻辑。

wdk996的博客 1399

深入探索Vue 3组合式API

(1)响应式核心原理// 收集依赖// 通知更新},Proxy代理:基于ES6 Proxy实现属性访问拦截依赖追踪:通过WeakMap建立目标对象->属性->依赖的映射关系批量更新:Vue的调度机制确保多次状态变更合并为单次更新(2)ref的进阶用法// DOM元素引用// 组件挂载后访问.focus()})// 模板引用<template>// 复杂类型处理user: {})// 自动解包模板引用:替代this.$refs的声明方式类型标注。

Science prince的博客 1856
上一篇: Vue学习笔记 - 深入组件 - 注册,透传Attribute,异步组件
下一篇: Vue学习笔记 - 插件
忘川三
博客等级 码龄12年 208粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值