1. 前言
在进行web前端开发过程中,我们可能会使用vue、react、angular等前端框架,为了能够在移动端也能使用同样的技术栈,我们也可以使用基于vue的uniapp进行开发。但是在进行开发时,遇到数据渲染的问题时也是常见的情况。比如说,在页面的生命周期函数onLoad中获取到数据,但是无法在页面中渲染。
2. 根本原因
我们知道,在uniapp中,为了提高应用的性能,在模板中使用了v-if等指令来决定某些元素是否需要渲染。这些指令会在数据变化时进行虚拟DOM的比对,只重新渲染那些发生了变化的元素。
然而,在页面的onLoad生命周期函数中获取到的数据一般都是异步获取的。也就是说,在页面渲染时,数据还没有获取到。因此,当我们使用{{}}语法来绑定数据时,数据还不存在,无法进行渲染。
3. 解决方法
3.1 使用v-if指令
在获取到数据后,我们可以设置一个flag来判断数据是否已经获取到。如果数据已经获取到了,我们就将flag设置为true,在模板中使用v-if指令来判断是否已经获取到数据。
export default {
data() {
return {
flag: false,
data: null
}
},
onLoad() {
getData()
.then(res => {
this.data = res.data;
this.flag = true;
})
}
}
在模板中使用v-if指令。
<template>
<div>
<div v-if="flag">{{ data }}</div>
<div v-else>Loading...</div>
</div>
</template>
这样做的好处是在数据已经获取到时,可以减少不必要的DOM更新,提高应用的性能。
3.2 使用computed计算属性
还有一种解决方法是使用computed计算属性。computed属性可以根据已经存在的数据计算一些新的数据。当依赖的数据发生变化时,computed属性会重新计算。
在组件的data中定义一个空对象。
export default {
data() {
return {
data: {}
}
},
onLoad() {
getData()
.then(res => {
this.data = res.data;
})
},
computed: {
showData() {
return this.data.id ? this.data.name : '';
}
}
}
在模板中使用计算属性。
<template>
<div>{{ showData }}</div>
</template>
计算属性在依赖的数据存在时会自动计算,不存在时返回默认值。
3.3 使用v-show指令
v-if指令在数据没有获取到时需要重新创建DOM元素,会造成性能问题。如果是在数据已经获取到后,需要根据某个条件来决定元素是否显示,可以使用v-show指令。
v-show指令只是将元素的display属性设置为none,不会重新创建元素。只有在条件变化时才会更新DOM。
export default {
data() {
return {
isShow: false,
data: null
}
},
onLoad() {
getData()
.then(res => {
this.data = res.data;
this.isShow = true;
})
}
}
在模板中使用v-show指令。
<template>
<div v-show="isShow">{{ data }}</div>
</template>
这样做的好处是当条件变化时,只会更新DOM,不会重新创建元素。
4. 总结
在uniapp中渲染数据需要注意,因为页面的生命周期函数onLoad是异步获取数据的,需要使用相应的方法来确保数据已经获取到再进行渲染,防止出现数据无法渲染的问题。具体的解决方法有使用v-if指令、computed计算属性、以及v-show指令。