Vue3技术之 setup、computed、watch 容易踩坑的点!

 聊点不一样的东西,面试中vue3容易踩坑的点!

setup的两个注意点

  • setup执行的时机
  • 在beforeCreate之前执行一次,this是undefined

 setup的参数

  • props: 值为对象,包含: 组件外部传递过来,且组件内部声明接收了的属性
  • context:上下文对象
  • attrs: 值为对象,包含: 组件外部传递过来,但没有在props配置中声明的属性,相当于 this.$attrs
  • slots: 收到的插槽内容,相当于 this.$slots
  • emit: 分发自定义事件的函数,相当于 this.emit
setup(props,context){
    console.log('context.attrs',context.attrs)//相当于vue2中的$attrs
    console.log('context.emits',context.emits)//触发自定义事件的$emits
    console.log('context.slots',context.slots) //插槽
}

计算属性与监视

computed函数

注意:与Vue2.x中computed配置功能一致,写法

import {computed} from 'vue'
setup()(
//计算属性一简写  (没有考虑计算属性被修改的情况——是只读的)
let fullName = computed(()=>{return person.firstName + '-' + person.lastName})
//计算属性一完整  (考虑读和写)
let fullName = computed({
  get(){
     return person .firstName + '-+ person.lastName
  },
  set(value){
     const nameArr = value .split('-')
     person.firstName = nameArr[0]
     person.lastName = nameArr[1]
  }
 })
}

watch函数

 watch 三个参数:

  •    第一个参数: 监视的对象
  •    第二个参数:监事的回调
  •    第三个参数:监视的配置

两个小“坑”:

  •  监视reactive定义的响应式数据时: oldValue无法正确获取、强制开启了深度监视 (deep配置失效)
  •  监视reactive定义的响应式数据中某个属性时:deep配置有效
watch 监听数据有以下五种情况:

1、监视ref定义的响应式数据:

watch(sum,(newValue, oldValue)=>{
    console.log('sum变化了',newValue,oldValue)
},{immediate:true})

2、监视多个ref定义的响应式数据 ( vue2中的 watch 是个配置项 不可写两个):

watch([sum,msg],(newValue ,oldValue)=>{
    console.log('sum或msg变化了',newValue,oldValue)
})

3、监视reactive定义的响应式数据的全部数据:   

watch(person,(newValue,oldValue)=>{
   console.log('person变化了',newValue,oldValue)
},{immediate:true,deep:false}) 
  • 注意:此处无法正确获取oldValue
  • 若watch监视的是reactive定义的响应式数据,则无法正确获得oldValue
  • 若watch监视的是reactive定义的响应式数据,则强制开启了深度监视

4、监视reactive定义的响应式数据中的某个属性:

watch(()=>person.job,(newValue,oldValue)=>{
   console.log('person的job变化了', newValue,oldValue)
},{immediate:true,deep:true})

5、监视reactive定义的响应式数据中的某些属性:

watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{
   console.log('person的name或age变化了', newValue,oldValue)
},{immediate:true,deep:true})

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Vue 3 中,`watch` 和 `computed` 的用法和 Vue 2 中略有不同。 ## watch ### 监听单个响应式数据 在 Vue 3 中,你可以使用 `watch` 函数来监听一个响应式数据的变化。例如: ```javascript import { watch } from 'vue'; // 在 setup 函数中使用 watch setup() { const count = ref(0); watch(count, (newValue, oldValue) => { console.log(`count 从 ${oldValue} 变为 ${newValue}`); }); return { count }; } ``` 在上面的例子中,我们使用 `watch` 函数监听了 `count` 的变化,并在回调函数中输出了新旧值。 ### 监听多个响应式数据 如果需要监听多个响应式数据的变化,你可以传入一个对象,对象的属性名是需要监听的数据,属性值是回调函数。例如: ```javascript import { watch, ref } from 'vue'; // 在 setup 函数中使用 watch setup() { const count1 = ref(0); const count2 = ref(0); watch({ count1: (newValue, oldValue) => { console.log(`count1 从 ${oldValue} 变为 ${newValue}`); }, count2: (newValue, oldValue) => { console.log(`count2 从 ${oldValue} 变为 ${newValue}`); } }); return { count1, count2 }; } ``` ### 监听非响应式数据 如果需要监听非响应式数据的变化,你可以使用 `watchEffect` 函数。例如: ```javascript import { watchEffect } from 'vue'; // 在 setup 函数中使用 watchEffect setup() { let count = 0; watchEffect(() => { console.log(`count 变为 ${count}`); }); return { count }; } ``` ## computedVue 3 中,你可以使用 `computed` 函数来创建计算属性。例如: ```javascript import { computed, ref } from 'vue'; // 在 setup 函数中使用 computed setup() { const count = ref(0); const doubleCount = computed(() => { return count.value * 2; }); return { count, doubleCount }; } ``` 在上面的例子中,我们创建了一个计算属性 `doubleCount`,它的值是 `count` 的两倍。当 `count` 改变时,`doubleCount` 也会自动更新。 需要注意的是,计算属性的返回值必须是一个响应式数据。如果返回的是普通数据,那么计算属性就没有意义了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值