• vue3,使用watch监听props中的数据


    情况一:监听props中基本数据类型

    父组件中对传入数据的处理

    const handleClick = () => {
      testStr.value += 'P'
    }
    
    • 1
    • 2
    • 3

    子组件中监听传入的数据

    watch(
      () => props.testStr,
      (newVal, oldVal) => {
        console.log('监听基本类型数据testStr')
        console.log('new', newVal)
        console.log('old', oldVal)
      }
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    不能使用

    watch(
       props.testStr,
      () => {
        console.log('监听基本类型数据testStr')
      }
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    的形式,要使用getter函数返回值的形式才能触发监听

    情况二:监听props中引用数据类型且父组件不改变地址指向

    父组件中对传入数据的处理

    const handleClick = () => {
      let name = 'lx'
      let age = 18
      dataList.value.push({
        name: (name += '~'),
        age: (age += 1)
      })
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    子组件中监听传入的数据

    watch(props.dataList, (newVal, oldVal) => {
      console.log('监听引用类型数据dataList')
      console.log('new', newVal)
      console.log('old', oldVal)
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5

    当父组件传入的是引用类型数据,且在父组件中没有改变该数据的引用地址时,在子组件中可以直接监听传入的数据

    情况三:监听props中引用数据类型且父组件改变地址指向

    父组件中对传入数据的处理

    const handleClick = () => {
      let name = 'lx'
      let age = 18
      dataList.value=[
      	{
        	name: (name += '~'),
        	age: (age += 1)
      	}
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    子组件中监听传入的数据

    watch(
      () => props.dataList,
      (newVal, oldVal) => {
        console.log('监听引用类型数据dataList')
        console.log('new', newVal)
        console.log('old', oldVal)
      }
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    当父组件传入的是引用类型数据,且在父组件中通过赋值的形式,改变引用数据的引用地址时,在子组件中要使用getter函数返回值的形式,才能监听传入的数据

    总结

    1. watch监听props中的基本类型数据,需要通过getter函数返回值的形式(()=>props.xxx)才能监听

    2. watch监听props中的引用类型数据,且父组件中没有改变地址指向时,可以直接监听

    3. watch监听props中的引用类型数据,且父组件中改变了地址指向时,需要通过getter函数返回值的形式(()=>props.xxx)才能监听

    4. 开发情景:要做瀑布流展示

    定义变量:const dataList = ref([])

    父组件从接口获取第一页数据,将数据存在dataList中:dataList.value = res.data注意:此时,已经改变引用类型数据dataList的地址指向

    子组件通过watch监听传入的dataList,并且调用manageData()方法处理props.dataList的数据结构:

    watch(
      () => props.dataList,
      (newVal, oldVal) => {
        console.log('监听引用类型数据dataList')
        manageData()
        ... // 相应逻辑处理
      }
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意:此时可以触发监听

    用户下拉刷新操作后,继续发送接口,获取第二页,第三页等等后面的数据,父组件通过push操作,将获取到的数据push进dataList中:

    for(let item of res.data){
    	dataList.value.push(item)
    }
    
    • 1
    • 2
    • 3

    注意:此时,虽然父组件传入的dataList的值修改了,但是子组件已经不能触发watch及其处理逻辑了
    也就是说,manageData()方法不能调用,没有做到对后续push进来的数据进行数据结构的修改,导致页面展示出现问题

    解决办法:
    一、使用computed

    const dataListTest = computed(() => {
      manageData()
      return props.dataList
    })
    
    • 1
    • 2
    • 3
    • 4

    二、使用watchEffect

    watchEffect(() => {
      manageData()
    })
    
    • 1
    • 2
    • 3

    PS:本例子使用语法糖 script setup

  • 相关阅读:
    Java基于springboot+vue的共享电动车管理系统 nodejs
    硬件设计——串联直流稳压电源
    淘宝/天猫API:item_cat_get-获得淘宝商品类目
    Jetson Orin NX 开发指南(3): 安装 ROS 系统
    深度学习 精选笔记(4)线性神经网络-交叉熵回归与Softmax 回归
    热敏性聚N-乙烯基异丁酰胺(PNVIBA)/聚(N—乙烯基异丁酰胺)接枝聚苯乙烯微球的研究
    敏感信息防泄漏:透明加密与通信内容安全策略深度解析
    最新计算机java毕业设计题目选题推荐2023
    基于FPGA的有限脉冲响应(FIR)数字滤波器设计与实现(使用Matlab)
    Animate动画
  • 原文地址:https://blog.csdn.net/weixin_46683645/article/details/125481381