当前位置:   article > 正文

Vue3的computed和watch_vue3的watch和computed

vue3的watch和computed

目录

1、computed

2、computed完整写法

 3、watch

4、watch监听对象具体属性

5、watch 监听reactive数据


1、computed

基于现有的数据计算出新的数据

  1. <script setup >
  2. import {ref,computed} from 'vue'
  3. const num=ref(1)
  4. const doubleNum=computed(()=>{
  5. return num.value*2
  6. })
  7. const goods=ref([
  8. {
  9. id:1001,
  10. price:5000,
  11. name:'小米手机'
  12. },
  13. {
  14. id:1002,
  15. price:4000,
  16. name:'华为手机'
  17. },
  18. {
  19. id:1003,
  20. price:6000,
  21. name:'三星手机'
  22. }
  23. ])
  24. //筛选出价格大于等于5000的商品
  25. const filterGoods=computed(()=>{
  26. return goods.value.filter(item=>item.price>=5000)
  27. })
  28. </script>
  29. <template>
  30. <div>hello,world</div>
  31. <p>{{ num }}- {{ doubleNum }}</p>
  32. <p>{{ filterGoods }}</p>
  33. </template>
  34. <style scoped>
  35. </style>

2、computed完整写法

  1. <script setup >
  2. import {ref,computed} from 'vue'
  3. const firstName=ref('')
  4. const lastName=ref('')
  5. //简写 只提供get
  6. // const fulName=computed(()=>{
  7. // return firstName.value+lastName.value
  8. // })
  9. //完整写法
  10. const fulName=computed({
  11. //get:function(){} 与 get() {} 等价
  12. //get:()=>{} 箭头函数不可简写
  13. get(){
  14. return firstName.value+lastName.value
  15. },
  16. set(newV){
  17. firstName.value=newV.substring(0,1)
  18. lastName.value=newV.substring(1)
  19. }
  20. })
  21. </script>
  22. <template>
  23. <div>hello,world</div>
  24. <input type="text" v-model="firstName">
  25. <input type="text" v-model="lastName">
  26. <input type="text" v-model="fulName">
  27. </template>
  28. <style scoped>
  29. </style>

 3、watch

1 . 侦听一个数据

第一个参数:监听的数据 第二个回调函数

2.侦听多个数据

第一个参数监听的数据构成的数组 ​ 第二个参数回调函数

3.立刻调用 (第三个参数位一个对象,里面可放immediate:true)

4.深度监听 (第三个参数位一个对象,里面可放 deep:true)

  1. <script setup >
  2. import {ref,watch} from 'vue'
  3. const num=ref(1)
  4. // const age=ref(10)
  5. const obj=ref({
  6. id:1,
  7. name:'电视',
  8. price:3000
  9. })
  10. // 1 侦听一个数据
  11. //第一个参数:监听的数据 第二个回调函数
  12. watch(num,(newV,oldV)=>{
  13. console.log(newV,oldV)
  14. })
  15. //2 侦听多个数据
  16. //第一个参数监听的数据构成的数组
  17. //第二个参数回调函数
  18. // watch([num,age],([newNum, newAge],[oldNum, oldAge])=>{
  19. // console.log(newNum, newAge);
  20. // })
  21. // watch([num,age],([newNum,newAge],[oldNum,oldAge])=>{
  22. // console.log(newNum,newAge)
  23. // })
  24. //3 立刻调用 immediate
  25. // watch(num,(newV,oldV)=>{
  26. // console.log('立刻调用')
  27. // console.log(newV,oldV)
  28. // },{
  29. // immediate:true
  30. // })
  31. //4 深度监听
  32. watch(obj,(newV,oldV)=>{
  33. console.log(newV,oldV)
  34. },{
  35. deep:true
  36. })
  37. const changeObj=()=>{
  38. obj.value.price -=200
  39. }
  40. </script>
  41. <template>
  42. <div>hello,world</div>
  43. <p>{{ num }}</p>
  44. <p>{{ obj }}</p>
  45. <button @click="changeObj">修改obj</button>
  46. </template>
  47. <style scoped>
  48. </style>

4、watch监听对象具体属性

  1. <script setup >
  2. import {ref,watch} from 'vue'
  3. const obj=ref({
  4. id:1,
  5. name:'电视',
  6. price:3000
  7. })
  8. //深度监听
  9. // 第一个参数 可以是函数,函数的返回值就是被侦听的数据
  10. //分开监听数据的变化
  11. //只有价格改变才监听
  12. // watch(()=>obj.value.price,(newV,oldV)=>{
  13. // console.log(newV,oldV)
  14. // },{
  15. // deep:true
  16. // })
  17. // watch(()=>obj.value.name,(newV,oldV)=>{
  18. // console.log(newV,oldV)
  19. // },{
  20. // deep:true
  21. // })
  22. //监听数据变化写在一起
  23. watch([()=>obj.value.price,()=>obj.value.name,()=>obj.value.id],(newV,oldV)=>{
  24. console.log(newV[0],oldV)
  25. },{
  26. deep:true
  27. })
  28. const changeObj=()=>{
  29. // obj.value.price -=200
  30. obj.value.name='手机'
  31. // obj.value.id=200
  32. }
  33. </script>
  34. <template>
  35. <div>hello,world</div>
  36. <button @click="changeObj">修改obj</button>
  37. </template>
  38. <style scoped>
  39. </style>

5、watch 监听reactive数据

watch监控reactive数据,假如需要深层次监控属性需要手动开启deep:true或省略

watch监控ref数据,深层次监控属性 ,必须手动开启deep:true,不能省略,省略相当于默认 false

  1. <script setup >
  2. import {reactive,watch} from 'vue'
  3. const user=reactive({
  4. name:'admin',
  5. age:18,
  6. job:{
  7. jobName:'web前端工程师',
  8. salary:6000
  9. }
  10. })
  11. //侦听的是reactive数据,默认对第一层属性开启deep:true,此时无论有没有传入deep选项
  12. //侦听的是ref引用数据,默认deep:false,监控的对象属性发生改变不会被监控到
  13. watch(user,(newV,oldV)=>{
  14. console.log(newV)
  15. },{
  16. deep:true //关闭深度监控无效
  17. })
  18. const changeAge=()=>{
  19. user.age++
  20. //假如需要侦听深层次数据,需要手动开启deep:true
  21. user.job.salary += 2000
  22. }
  23. </script>
  24. <template>
  25. <div>hello,world</div>
  26. <p>{{ user }}</p>
  27. <button @click="changeAge">修改age</button>
  28. </template>
  29. <style scoped>
  30. </style>

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/318638
推荐阅读