vue3页面渲染时:子组件请求api获取数据没有正常更新到界面问题

项目场景:

子组件在页面渲染的时候需要调用api获取数据并更新到页面

问题描述

页面渲染时完成没有报错,但子组件的数据没有在页面显示;
错误代码:
onMounted(async () => {
await infoListAPI({ deviceCode: ‘’ }).then((res: any) => {
if (res.data && res.data.length) {
deviceData = res.data;
}
})
})

原因分析:

异步问题,无论是在父组件onBeforeMount、onMounted或是子组件onMounted上使用async、await均没有正确更新到页面;

解决方案:

添加Object.assign(deviceDataReactive, res.data);在请求完成之后触发更新,infoListAPI是自己的api接口
onMounted(async() => {
await infoListAPI({ deviceCode: ‘’ }).then((res: any) => {
if (res.data && res.data.length) {
// 合并源对象的属性到目标响应式对象上,Vue 的响应式系统能够检测到这些属性的变化,并触发相应的更新
Object.assign(deviceDataReactive, res.data);
// deviceDataReactive = res.data;
}
})
});

Vue中,为了确保数据请求完成后再渲染界面,可以采用以下几种策略: 1. **使用`async/await`**: 使用`mounted`生命周期钩,在`await`关键字后放置数据请求函数,这样当请求完成并返回结果,会自动进入下一个代码块执行,此数据已准备好,可以直接用于渲染: ```javascript export default { async mounted() { try { const response = await axios.get('/your-api-url'); this.yourData = response.data; // 设置数据到组件实例中 } catch (error) { console.error(error); } }, }; ``` 2. **`$nextTick`**:在数据更新后立即执行异步操作,`$nextTick`会在DOM更新完毕后执行,确保数据已应用到视图: ```javascript axios.get('/your-api-url') .then(response => { this.$nextTick(() => { this.yourData = response.data; }); }) .catch(error => { console.error(error); }); ``` 3. **Vuex**:在状态管理库Vuex中,先dispatch一个action请求数据,然后在actions里承诺(Promise)数据返回后再通过mutation更新store,组件通过计算属性或watch监听store变化来更新视图: ```javascript // actions.js export const fetchData = ({ commit }) => { axios.get('/your-api-url').then(response => commit('SET_DATA', response.data)); }; // mutations.js const mutations = { SET_DATA(state, data) { state.yourData = data; }, }; // component.vue computed: { yourData() { return this.$store.state.yourData; }, }, methods: { fetchDataFromStore() { this.$store.dispatch('fetchData'); }, } ``` 在`mounted`钩中调用这个方法。 无论哪种方式,确保数据请求在视图更新之前完成是非常重要的,以提供更流畅的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值