为什么父组件“el-tab-pane“的key为Math.random()时, 会出现子组件“compensate-dereliction“的数据要添加两次才能成功显示的问题?第一次显示不出来?

“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,
        进而成功地显示出来了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值