“src/views/contractManage/compensationCompare/index.vue”中,为什么"el-tab-pane"的key为Math.random()时会出现"compensate-dereliction"要添加两次才能成功的问题?
//dom结构:
<el-tab-pane
v-for="(item, index) in tabData"
:key="(_=>{
const aa = index+Math.random();
console.log('key',aa);
return aa
})()"
:label="item.title"
:name="item.name">
<!-- 货币补偿 -->
<compensate-dereliction
:planId="forms.planId"
@success="(val) => { tabData[index].hbbc = val }" />
//查看源码,生产的渲染函数如下:
return _c(
"el-tab-pane",
{
key: (function(_) {
var aa = index + Math.random()
_vm.console.log("key", aa)
return aa
})(),
attrs: { label: item.title, name: item.name }
},
[
_c("compensate-dereliction", {
attrs: { planId: _vm.forms.planId },
on: {
success: function(val) {
_vm.tabData[index].hbbc = val
}
}
}),
分析原因:
因为添加"compensate-dereliction"时设置了_vm.tabData[index].hbbc
第一次添加其值从0->xx值,提交时handleSubmit调用了sumTotal中的this.$emit('success', total),进而影响"el-tab-pane"中tabData[index].hbbc的值,
进而影响src/views/contractManage/compensationCompare/index.vue中元素的渲染,进而触发"el-tab-pane"key的Math.random(),
使整个"el-tab-pane"重新渲染,使得作为其子组件的"compensate-dereliction"刚添加的渲染vdom被刷没了,
但是它的_vm的数据作为闭包里被引用的变量还在,本来是在close回调去重置数据的,但是close因为整个"el-tab-pane"重新渲染没有被调用到。
第二次添加其值从xx值->xx值,没有触发变化,进而没有影响"el-tab-pane"中tabData[index].hbbc的值,
进而没有影响src/views/contractManage/compensationCompare/index.vue中元素的渲染,进而只刷新"compensate-dereliction"的渲染vdom,
进而成功地显示出来了