vue2跟vue3生命函数 watch computed

1、生命函数

Vue2和Vue3钩子变化不大,beforeCreate 、created  两个钩子被setup()钩子来替代

    vue2           ------->          vue3
 
beforeCreate(){}   -------->      setup(()=>{})
created(){}        -------->      setup(()=>{})
beforeMount(){}    -------->      onBeforeMount(()=>{})
mounted(){}        -------->      onMounted(()=>{})
beforeUpdate(){}   -------->      onBeforeUpdate(()=>{})
updated(){}        -------->      onUpdated(()=>{})
beforeDestroy(){}  -------->      onBeforeUnmount(()=>{})
destroyed(){}      -------->      onUnmounted(()=>{})
activated(){}      -------->      onActivated(()=>{})
deactivated(){}    -------->      onDeactivated(()=>{})
errorCaptured(){}  -------->      onErrorCaptured(()=>{})

2、watch

(1)vue2

使用watch创建一个监听器,可以定义一个或多个被监听的数据,并指定一个处理函数响应数据变化;

watch可以是一个对象,也可以是一个函数;

可以使用deep(深度监听)和immediate(立即执行函数)

// 写法一
watch: {
    divisionCode(newVal, oldVal) {
      // 处理函数
    }
  }
// 写法二
watch: {
     list: {
         handler(newVal) {
             this.number++
         },
         deep: true
     }
 }
// 写法三
watch: {
     data: 'change' // 值可以为methods的方法名
 }

 数组(一维、多维)的变化不需要通过深度监听,对象的属性变化则需要deep深度监听

(2)vue3

在组件的setup函数中使用watch函数创建一个监听器;

watch函数接受两个参数:要监听的数据或者表达式,一个回调函数响应数据变化

watch函数内部使用响应式用来追踪依赖关系,只有在回调函数中使用的响应式数据发生变化,才会执行回调函数

可以使用以下参数:

immediate:是否在初始化时立即执行一次回调函数,默认为false。
deep:是否深度观察对象或数组的变化,默认为false。
flush:在触发回调函数之前进行何种操作,默认为"pre"。可选值有:"pre"(立即更新DOM)、"post"(延迟到队列中的所有回调函数执行完毕后再更新DOM)和"sync"(在变更时同步应用更改)。
onTrigger:在触发回调函数之前执行的函数。
onStop:当停止观察时执行的函数。
lazy:是否初始不触发回调函数,默认为false。

 <script setup>
   import { ref, watch } from 'vue'
   const count = ref(0)
   const name = ref('cp')


   // 监听单个数据
   watch(count, (newValue, oldValue)=>{
     console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
   })

   // 监听多个数据
   watch([count, name], ([newCount, newName],[oldCount,oldName])=>{
       console.log(count或者name变化了,[newCount, newName],[oldCount,oldName])
   })

   // 参数使用
   watch(count, (newValue, oldValue)=>{
          console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
   },{
        immediate: true
   })

   // 监听对象内数据
   const data = ref({
       phone: "",
       password: ""
   })
   watch(() => data.value.phone, (newValue, oldValue) => {
        if (newValue.length == 11) {
             disabled.value = false
        } else {
            disabled.value = true
        }
    })
   // 监听对象的所有属性
   watch(() => data, (newValue, oldValue) => {
     console.log('watch 已触发', newValue)
   }, { deep: true })
   
 </script>

(3)watchEffect

watchEffect 是 Vue3 中的一个响应式 API,允许你监听响应式状态的变化,并在其发生变化时触发作用函数。

相当于将watch的依赖源和回调函数合并,当任何你有用到的响应式依赖更新时,该回调函数便会重新执行。不同于 watch,watcheffect的回调函数会被立即执行(即 {immediate: true})

watcheffect初始化时,一定会执行一次收集要监听的数据

<script setup>
import { ref, watchEffect } from 'vue';

const count = ref(0);

// 当count的值变化时,这个函数会被调用
watchEffect(() => {
   console.log(`Count is: ${count.value}`);
});

// 手动停止监听器
unwatch()

// 用一个变量接收监听器函数的返回值,然后调用该函数,即可关闭当前监听器
</script>

3、computed

计算一个值并将结果缓存起来的方法,当依赖的数据发生变化时,缓存会被重新计算。

computed 具有 getter 和 setter 属性

①getter 属性在使用时分别有两次调用:

  • 第一次:初始化,初次访问该属性
  • 第二次:当 computed 中的数据发生变化时调用

②setter 属性的调用:

  • 当 computed 属性被修改时调用

③注意事项

  • setter 属性本身不会修改属性的值,只用于修改属性本身,而 computed 属性的值被修改并不会更新setter 属性的值。
  • getter 和 setter 属性不能使用箭头函数,箭头函数中的this不是指向vm,而是window。

(1)vue2

computed:{
  fullName(){
    return this.name1 + '~' + this.name2
  }

  // 完整写法
  sum: {
    get(){
       return this.name1 + '~' + this.name2
    },
    set(value){
        var arr = value.split('~')
        this.name1= arr[0]
        this.name2 = arr[1]
      }
  }
}

(2)vue3

<script setup>
import { ref, computed } from 'vue';
const name1 = ref('黄')
const name2 = ref('晓明')

let fullName = computed(() => {
     return name1.value + '~' + name2.value
    })


// 完整写法
let fullName = computed(() => {
    get(){
       return name1.value + '~' + name2.value
    },
    set(value){
        var arr = value.split('~')
        name1.value = arr[0]
        name2.value = arr[1]
      }
  })

</script>

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值