首页 >> 大全

Vue进阶(幺零六):子组件处理父组件异步值传递给子组件处理

2023-12-27 大全 28 作者:考证青年

文章目录 四、其它场景问题五、拓展阅读

一、问题描述

组件通过等其他异步方式获取异步数据,并传递给子组件,子组件直接显示没有问题,若对数据进行处理,则拿到的数据都是父组件初始值。

二、原因分析

父组件通过等其他异步方式获取异步数据,在尚未等到数据返回时,子组件 已经执行完毕,故此时子组件中的数据为父组件上次的数据。

父子组件的生命周期:

一、加载渲染过程

父–> 父–>父–>子 –> 子 –>子

–>子 –>父

二、子组件更新过程

组件子传父__子组件和子组件间的传值

父 --> 子 –> 子 –> 父

三、销毁过程

父 --> 子 –> 子 –> 父

三、解决措施 3.1 方法一:v-if 判断

父组件

  <child :child-data="asyncData" v-if="asyncData"></child>

当有值得时候,再加载子组件。

评价:在为对象或数组元素,子组件获取对象属性或某一数组元素时,以上方法可行(不会报错),但仍会存在数据加载显示缓慢情形(及子组件首先显示的仍是上次父组件传值,然后才会渲染为当前父组件传值)。

3.2 方法二:watch 监听

子组件

watch:{childData(val){console.log('子组件 数据处理',val)}
}

评价: 以上方法仍会出现方法一中的数据加载缓慢问题。

3.3 方法三:子组件 watch + data 相结合

<template><div>子组件<p>{{test}}p>div>
template><script>export default {props: ['tableData'],data: () => ({test: ''}),watch: {tableData (val) {this.dataResult = val}},computed: {dataResult : {set (value) {this.update()this.test = value},get () {return this.test}}},methods: {update () {console.log(this.childObject) // {items: [1,2,3]}}}}
script>

3.4 方法四:使用事件总线 bus

<template><div>子组件<p>{{test}}p>div>
template><script>export default {props: ['childObject'],data: () => ({test: ''}),created () {// 绑定this.$bus.on('triggerChild', (parmas) => {this.test = parmas.items[0] // 1this.updata()})},methods: {updata () {console.log(this.test) // 1}}}
script>

这里使用了bus这个库,.vue和child.vue必须公用一个事件总线(也就是要引入同一个js,这个js定义了一个类似let bus = new Vue()的东西供这两个组件连接),才能相互触发。

3.5 其他方法

将数据存到store,子组件监听数据变化(watch/)。

四、其它场景问题

异步获取数据导致的报错的情况会在各个场景出现,比如:

五、拓展阅读

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了