首页IT科技vue watch监听数组(vue3,使用watch监听props中的数据)

vue watch监听数组(vue3,使用watch监听props中的数据)

时间2025-06-14 08:48:57分类IT科技浏览5196
导读:情况一:监听 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, () => { 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() })

写在最后

最后的瀑布流展示中                      ,我是直接修改了 props 中的数据                ,虽然从展示来说没有发现什么问题,但是在 Vue 的官网中是这样说的:

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

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
About me 英语作文(About The Python Challenge) 千牛找货源怎么直接上架淘宝苹果商品(千牛在哪进货_千牛的货源信息在哪看)