vue3 watchEffect

阅读数:135 评论数:0

跳转到新版页面

分类

html/css/js

正文

一、概述

watchEffect和watch都是监听器,但在写法和使用上有所区别。

  • watch- 显式指定依赖源,依赖源更新时执行回调函数
  • watchEffect - 自动收集依赖源,依赖源更新时重新执行自身

1、watch在监听ref和reactive类型时写法有所不同

import { watch } from 'vue'

// 监听
watch(
  source, // 必传,要侦听的数据源
  callback // 必传,侦听到变化后要执行的回调函数
  // options // 可选,一些侦听选项
  //{
	//	immediate: false,// 不立刻监听,即刚进来第一次不监听,第二次变化时才开始监听操作
		//deep: true // 深度监听
	//}
)

(1)watch监听ref类型

<script>
import {ref, watch} from 'vue'
export default {
    setup() { 
        const state = ref(0)

        watch(state, (newValue, oldValue) => {
          console.log(`原值为${oldValue}`)
          console.log(`新值为${newValue}`)
          /* 1秒后打印结果:
                  原值为0
                  新值为1
          */
        })

        // 1秒后将state值+1
        setTimeout(() => {
          state.value ++
        }, 1000)
    }
}
</script>

(2)watch监听reactive类型时

<script>
import {reactive, watch} from 'vue'
export default {
    setup() { 
        const state = reactive({count: 0})

        watch(() => state.count, (newValue, oldValue) => {
          console.log(`原值为${oldValue}`)
          console.log(`新值为${newValue}`)
          /* 1秒后打印结果:
                  原值为0
                  新值为1
          */
        })

        // 1秒后将state.count的值+1
        setTimeout(() => {
          state.count ++
        }, 1000)
    }
}
</script>

(3)监听多个数据源

watch(
  [() => state.count, count], 
  ([curCount, newVal], [preCount, oldVal]) => {
    console.log("新值:", curCount, "老值:", preCount); console.log("新值:", newVal,
"老值:", oldVal); }
);

2、watchEffect与watch的区别

(1)不需要手动传入依赖

(2)每次初始化时会执行一次回调函数和自动获取依赖

(3)无法获取到原值,只能得到变化后的值。

二、watchEffect的使用

1、基本使用

在组件初始化时, 会先执行一次来收集依赖,与watch的immediate类似。 然后当收集到的依赖中数据发生变化时, 就会再次执行回调函数。

watchEffect(() => {
    console.log(`当${sum.person.age}的值变化的时候调用,初始化
    的时候也调用一次
     `)
}) 

2、onInvalidate

清除副作用,就是在触发监听之前会调用一个函数可以处理你的逻辑

watchEffect(onInvalidate => {
    console.log(`${sum.person.age} 的值变化了!`)
    onInvalidate(() => {
        console.log('清除函数执行了!')
    })
},{
    //'pre' 在组件更新前运行,默认为'pre'
    //'post'在组件更新后运行,watchPostEffect
    //'sync'强制效果始终同步触发。然而,这是低效的,应该很少需要。watchSyncEffect
    flush:'post'
})



相关推荐

一、computed和watch应用场景 1、computed computed拥有缓存属性,擅长的处理的场景是一个数据受多个数据影响。 2、watch 擅长处理的场景是一个数据影响多个数据,另外可以

1、安装依赖 npm install svg-sprite-loader --save-dev 2、配置build文件夹中的webpack.base.conf.js 3、在src/component

在列表渲染时使用key属性 当Vue.js用v-for正在更新已渲染过的元素列表时,它默认用&ldquo;就地复用&rdquo;策略,如果数据项的顺序被改变,Vue将不会移动D

一、vue.js devtools开发工具的使用 1、安装 在chrome或firefox浏览器的扩展插件仓库里搜索vue devtool。 2、debugger的使用 假设我们想调试App.vue这

在一些情况下,我们可能会需要对一个prop进行双向绑定,但它破坏了单向数据流。 在vue 2.3.0,重新引入了.sync修饰符,这是一个语法糖。 例子: <

&lt;div id="app"&gt; &lt;div v-on:click="dodo"&gt;

在登陆页的mouted生命周期方法中,添加 <pre class

ref被用来给元素或子组件注册引用信息,引用信息将会注册在父组件的$refs对象上。如果在普通的DOM元素上使用,引用指向的就是DOM元素,如果用在子组件上,引用就指向组件实例。 <!-- `vm.$

在使用Vue中经常看到HTML中有标签属性前面添加了“:”,有些没有。 其实是v-bind的缩写。 v-bind 缩写: ‘:’ 用法:动态绑定一个或多个特性,或一个组件prop到表达式。在绑定cl

module.exports = { "plugins": { "postcss-import": {},