vue3系列:(三)vue3使用watch、watchEffect实现监听

本文介绍了Vue.js中watch和watchEffect的用法。watch用于监听特定的数据源并在变化时执行回调,支持监听单个数据源、多个数据源和响应式对象。watchEffect则在依赖变化时自动运行副作用,无需指定监听内容,但无法获取之前的值。文中通过实例展示了这两个功能的使用场景和差异。
摘要由CSDN通过智能技术生成

watch

watch API 完全等同于组件侦听器 property。watch 需要侦听特定的数据源,并在回调函数中执行副作用。默认情况下,它也是惰性的,即只有当被侦听的源发生变化时才执行回调,它接受3个参数

  • 一个想要侦听的响应式引用或 getter 函数
  • 一个回调
  • 可选的配置选项

侦听单个数据源

侦听器数据源可以是返回值的 getter 函数,也可以直接是 ref


// 侦听一个 getter
const state = reactive({ count: 0 })
watch(
  () => state.count,
  (count, prevCount) => {
    /* ...do some thing... */
  }
)

// 直接侦听ref
const count = ref(0)
watch(count, (count, prevCount) => {
  /* ...do some thing... */
})

侦听多个数据源

如果你在同一个函数里同时改变这些被侦听的来源,侦听器仍只会执行一次:

setup() {
  const firstName = ref('')
  const lastName = ref('')

  watch([firstName, lastName], (newValues, prevValues) => {
    console.log(newValues, prevValues)
  })
  
 //注意多个同步更改只会触发一次侦听器
  const changeValues = () => {
    firstName.value = 'John'
    lastName.value = 'Smith'
    // 打印 ["John", "Smith"] ["", ""]
  }

  return { changeValues }
}

侦听响应式对象

使用侦听器来比较一个数组或对象的值,这些值是响应式的,要求它有一个由值构成的副本

const numbers = reactive([1, 2, 3, 4])

watch(
  () => [...numbers],
  (numbers, prevNumbers) => {
    console.log(numbers, prevNumbers)
  }
)

numbers.push(5) // logs: [1,2,3,4,5] [1,2,3,4]

watchEffect

为了根据响应式状态自动应用重新应用副作用,我们可以使用 watchEffect 函数。它立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数

  • 它是立即执行的,在页面加载时会主动执行一次,来收集依赖
  • 不需要传递需要侦听的内容,它可以自动感知代码依赖,只需要传递一个回调函数
  • 它不能获取之前数据的值
  • 它的返回值用来停止此监听
import { ref, reactive, watchEffect } from "vue"; 
const age = ref(18);
const watchAge = ref(0); 
const doubleAge = () => { 
    watchAge.value = age.value * 2; 
    }; 
const stop = watchEffect(() => { 
if (watchAge.value < 60) { doubleAge();
} else { 
stop();  //停止监听
} });

(\ _ /)
( * . *)
/>❤️

实现 Vue 3 中对 JavaScript 文件值的实时监听,可以使用 `watchEffect` API。与 `watch` API 不同,`watchEffect` API 可以自动收集响应式依赖,并在响应式依赖发生变化时重新运行回调函数。 下面是一个简单的例子: 假设你有一个 JavaScript 文件,其中定义了一个变量 `myValue`,你想要在 Vue 3 应用中实时监听这个变量的变化并做出响应。 首先,将这个文件导入到 Vue 3 组件中: ```javascript import { ref } from 'vue' import myScript from './myScript.js' ``` 然后,在 Vue 3 组件中,使用 `watchEffect` API 来实时监听 `myValue` 变量的变化: ```javascript export default { setup() { const myValue = ref(myScript.myValue) watchEffect(() => { console.log('myValue changed to', myValue.value) // 做出响应 }) // 在某个时刻改变 myValue 变量的值 setTimeout(() => { myScript.myValue = 'new value' }, 1000) return { myValue } } } ``` 在上面的例子中,我们使用 `ref` 函数将 `myValue` 变量转换为响应式对象,并在 `setup` 函数中使用 `watchEffect` API 实时监听其变化。在 `setup` 函数中,我们还使用 `setTimeout` 函数来模拟在某个时刻改变 `myValue` 变量的值。 需要注意的是,在 `watchEffect` API 中,我们直接访问了 `myValue` 变量,而不是 `$data.myValue`。这是因为在 Vue 3 中,所有的响应式数据都已经被自动封装成了 Proxy 对象,因此我们可以直接访问它们的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值