• 【Vue3】computed计算属性和watch监视


    目录

    computed函数

    watch函数

    监视ref所定义的响应式数据 

    监视reactive所定义的响应式数据

    watchEffect函数


    computed函数

    • 与Vue2.x中computed配置功能一致
    • 写法:
    1. <template>
    2. <h1>一个人的信息</h1>
    3. 姓:<input type="text" v-model="person.firstName">
    4. 名:<input type="text" v-model="person.lastName">
    5. <br>
    6. <span>全名:{{person.fullName}}</span>
    7. </template>
    8. <script>
    9. import {reactive,computed} from 'vue'
    10. export default {
    11. name: 'HelloWorld',
    12. setup(){
    13. //数据
    14. let person = reactive({
    15. firstName:'张',
    16. lastName:'三'
    17. })
    18. //计算属性(简写 没有考虑计算属性被修改的情况)
    19. person.fullName = computed(()=>{
    20. return person.firstName +'-'+person.lastName
    21. })
    22. //计算属性(完整写法 考虑读和写)
    23. person.fullName = computed({
    24. get(){
    25. return person.firstName +'-'+person.lastName
    26. },
    27. set(){
    28. const nameArr = value.split('-')
    29. person.firstName = nameArr[0]
    30. person.lastName = nameArr[1]
    31. }
    32. })
    33. //返回一个对象(常用)
    34. return {
    35. person,
    36. }
    37. }
    38. }
    39. </script>

    watch函数

    1. 与Vue2.x中watch配置功能一致
    2. 两个小坑:
    • 监视reactive定义的响应式数据时,oldValue无法正确获取、强制开启了深度监视(deep配置无效)
    • 监视reactive定义的响应式数据中某个属性时:deep配置有效。 

    下面有六种情况: 

    监视ref所定义的响应式数据 

    1. <template>
    2. <h1>当前求和为:{{sum}}</h1>
    3. <button @click="sum++">点我+1</button>
    4. <hr>
    5. <h1>当前信息:{{msg}}</h1>
    6. <button @click="msg+='!'">点我修改</button>
    7. </template>
    8. <script>
    9. import {ref,watch} from 'vue'
    10. export default {
    11. name: 'HelloWorld',
    12. setup(){
    13. //数据
    14. let sum = ref(0)
    15. let msg = ref('你好啊')
    16. //情况1:监视ref所定义的一个响应式数据
    17. watch(sum,(newValue,oldValue)=>{
    18. console.log('sum变了',newValue,oldValue)
    19. },{immediate:true})
    20. //情况2:监视ref所定义的多个响应式数据
    21. watch([sum,msg],(newValue,oldValue)=>{
    22. console.log('sum或msg变了',newValue,oldValue)
    23. },{immediate:true})
    24. //返回一个对象(常用)
    25. return {
    26. sum,
    27. msg
    28. }
    29. }
    30. }
    31. </script>
    32. <!-- Add "scoped" attribute to limit CSS to this component only -->

    监视reactive所定义的响应式数据

    1. <template>
    2. <h1>姓名:{{person.name}}</h1>
    3. <h1>年龄:{{person.age}}</h1>
    4. <h1>薪资:{{person.job.j1.salary}}</h1>
    5. <button @click="person.name+='!'">点我改姓名</button>
    6. <button @click="person.age++">点我增长年龄</button>
    7. <button @click="person.job.j1.salary++">增长薪资</button>
    8. </template>
    9. <script>
    10. import {reactive,watch} from 'vue'
    11. export default {
    12. name: 'HelloWorld',
    13. setup(){
    14. //数据
    15. let person = reactive({
    16. name:'张三',
    17. age:18,
    18. job:{
    19. j1:{
    20. salary:20
    21. }
    22. }
    23. })
    24. //情况3:监视reactive所定义的一个响应式数据
    25. // 1、注意:此处无法正确获取oldValue
    26. // 2、注意:强制开启了深度监视(deep配置无效)
    27. watch(person,(newValue,oldValue)=>{
    28. console.log('peson变了',newValue,oldValue)
    29. },{deep:false}) //此处的deep配置无效
    30. //情况4:监视reactive所定义的一个响应式数据中的某一个属性
    31. watch(()=>person.name,(newValue,oldValue)=>{
    32. console.log('peson的name变了',newValue,oldValue)
    33. })
    34. //情况5:监视reactive所定义的一个响应式数据中的某些属性
    35. watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{
    36. console.log('peson的name和age变了',newValue,oldValue)
    37. })
    38. //特殊情况
    39. watch(()=>person.job,(newValue,oldValue)=>{
    40. console.log('peson的job变了',newValue,oldValue)
    41. },{deep:true}) //此处由于监视的是reactive所定义的对象的某个属性,所以deep
    42. 配置有效
    43. //返回一个对象(常用)
    44. return {
    45. person
    46. }
    47. }
    48. }
    49. </script>

    watchEffect函数

    1. watch的套路是:既要指明监视的属性,也要指明监视的回调
    2. watchEffect的套路是:不用指明监视的属性,监视的回调中用到哪个属性,那就监视哪个属性
    3. watchEffect有点像computed:
    • 但是computed注重的是计算出来的值(回调函数的返回值),所以要写返回值
    • 而watchEffect更注重的是过程(回调函数的函数体),所以不用写返回值
    1. //watchEffect所指定的回调中用到的数据只要发生了变化,则直接重新执行回调。
    2. watchEffect(()=>{
    3. const x1 = sum.value
    4. const x2 = person.job.j1.salary
    5. console.log('watchEffect执行了')
    6. })

     函数内用到了sum和person下的salary,所以只要这两个数据变化了,就会执行监视。点击其他的就不会执行

     

     

  • 相关阅读:
    OKK---生物信息研究之ClinVar的下载,Annovar的下载和使用
    卷积神经网络超详细介绍(转载)
    医疗服务全面升级,这个方法绝了!
    年度顶级赛事来袭:2023 CCF大数据与计算智能大赛首批赛题上线!
    《征服数据结构》栈
    AOP的切入点Pointcut中的execution表达式详解
    目录自动清洗
    软件测试的方法详细介绍
    Halcon中涉及的数字图像十大理论知识
    sparksql insertinto 源码解析
  • 原文地址:https://blog.csdn.net/qiaoyangla/article/details/125509306