用el-tabs很多次了,今天才注意到tab-pane上提供了一个lazy属性,对于解决父子组件数据传递问题很有帮助。
举个例子,下面的父组件中调用了子组件child,并传递了一组数据,但这组数据是由接口请求返回的。
<!--父组件-->
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="用户" name="1">
<child :asyncData="asyncData"></child>
</el-tab-pane>
<el-tab-pane label="配置" name="2">配置</el-tab-pane>
</el-tabs>
子组件在mounted中使用由父组件传递的asyncData,由于在mounted时,父组件中的接口还没有返回所需的数据,所以asyncData的取值为undefined,导致子组件中的asyncArray被赋值了一个空数组。即使后面接口返回了所需的数据,子组件中可以取得asyncData的正常值,但由于asyncArray被赋值了空数组,与asyncData指向的不是同一个地址,所以asyncArray的值依然是空数组。
//子组件
export default{
data(){
return{
asyncArray:[]
}
},
props:{
asyncData : Array
},
mounted(){
this.asyncArray = this.asyncData || []
}
}
为了解决上面的问题,在文档中发现了tab-pane的lazy属性:
在默认值为false的情况下,标签页里的内容与标签是同时渲染的,未展开的标签页是display:none;当更改为true以后,未展开的标签并不会渲染,而是等切换之后才会渲染,这样就有足够的时间等接口返回数据了。