VUE问题:父组件异步请求后,数据通过props向子组件传递数据,子组件接收到不展示的问题!

问题:父组件在挂载后,通过http请求,得到数据后通过prop传递给子组件,但是子组件不显示内容。

分析下原因:

这个必定是生命周期这块的问题。

罗列下组件加载时,生命周期的排序:

1.开始加载

  • 父组件beforeCreate
  • 父组件created
  • 父组件beforeMount
  • 子组件beforeCreate
  • 子组件created
  • 子组件beforeMount
  • 子组件mounted
  • 父组件mounted

2.加载后,如果要更新数据,重新渲染的情况下

  • 父组件beforeUpdate
  • 子组件beforeUpdate
  • 子组件updated
  • 父组件updated

3.组件卸载销毁的时候

  • 父组件beforeUnmount
  • 子组件beforeUnmount
  • 子组件unmounted
  • 父组件unmounted

综上说看:

数据渲染过程可知子组件的mounted是先于父组件的mounted,所以获取不到异步请求后获取到的数据

开始解决问题

1.v-if解决

<MainReport v-if="content.length>0" :title="title" :content="content" >
</MainReport>

当获取到的content的值后,在渲染子组件。写法简单,也不用涉及到子组件的改造。

2.使用watch对父组件传递过来的数据进行监控

watch: {
			
			content(newVal, oleVal){
				console.log("content 发生变化")
				console.log(newVal)
				console.log(oleVal)
			},
			
		},

这样也可以监听到数据的变化,然后在改变后,重新赋值,也可以解决问题。但是要在子组件中修改。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下方式将异步获取的数据传递给组件: 1. 使用 props数据传递给组件 组件中,可以通过异步请求获取数据后,在渲染组件时通过 props数据传递给组件。示例代码: ```vue <template> <div> <child-component :data="data"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue' export default { components: { ChildComponent }, data() { return { data: [] } }, async created() { const response = await fetch('https://api.example.com/data') this.data = await response.json() } } </script> ``` 在组件中,通过 props 接收传递过来的数据并进行渲染。示例代码: ```vue <template> <ul> <li v-for="item in data" :key="item.id">{{ item.name }}</li> </ul> </template> <script> export default { props: { data: { type: Array, required: true } } } </script> ``` 2. 使用 provide/inject 在组件中提供数据组件中注入数据组件中,可以通过 provide 方法提供数据组件中通过 inject 方法注入数据。示例代码: ```vue // 组件 <template> <div> <child-component></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue' export default { components: { ChildComponent }, data() { return { data: [] } }, async created() { const response = await fetch('https://api.example.com/data') this.data = await response.json() }, provide: { fetchData: this.fetchData // 将 fetchData 方法提供给组件 }, methods: { fetchData() { return this.data } } } </script> // 组件 <template> <ul> <li v-for="item in dataList" :key="item.id">{{ item.name }}</li> </ul> </template> <script> export default { inject: ['fetchData'], // 注入 fetchData 方法 computed: { dataList() { return this.fetchData() // 获取组件提供的数据 } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值