栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

const handleClick = () => {
  testStr.value += 'P'
}

子组件中监听传入的数据

watch(
  () => props.testStr,
  (newVal, oldVal) => {
    console.log('监听基本类型数据testStr')
    console.log('new', newVal)
    console.log('old', oldVal)
  }
)

不能使用

watch(
   props.testStr,
  () => {
    console.log('监听基本类型数据testStr')
  }
)

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

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

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

const handleClick = () => {
  let name = 'lx'
  let age = 18
  dataList.value.push({
    name: (name += '~'),
    age: (age += 1)
  })
}

子组件中监听传入的数据

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

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

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

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

const handleClick = () => {
  let name = 'lx'
  let age = 18
  dataList.value=[
  	{
    	name: (name += '~'),
    	age: (age += 1)
  	}
  ]
}

子组件中监听传入的数据

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

当父组件传入的是引用类型数据,且在父组件中通过赋值的形式,改变引用数据的引用地址时,在子组件中要使用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()
    ... // 相应逻辑处理
  }
)

注意:此时可以触发监听

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

for(let item of res.data){
	dataList.value.push(item)
}

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

解决办法:
一、使用computed

const dataListTest = computed(() => {
  manageData()
  return props.dataList
})

二、使用watchEffect

watchEffect(() => {
  manageData()
})

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/996240.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号