vue调用组件遇到的坑

今天再用element-ui的el-tab调用不同的组件时遇到一个奇怪的问题,

上述图片中,一个组件被重复渲染了多次,代码如下:

<el-tabs ref="tabRef" v-model="activeName" @tab-click="handleClick">
      <el-tab-pane
        v-for="item in options.tabs"
        :key="item.name"
        :label="item.label"
        :name="item.name"
      >
        <!-- <keep-alive>
          <div :is="item.name"></div>
        </keep-alive> -->

        <QualificationDetail v-if="activeName == 'QualificationDetail'" :isEdit="item.isEdit" />
        <WarehousingDetail v-if="activeName == 'WarehousingDetail'" />
        <AuditProcess v-if="activeName == 'AuditProcess'" />
        <SampleRegist v-if="activeName == 'SampleRegist'"></SampleRegist>
        <SampleRegistDetail v-if="activeName == 'SampleRegistDetail'"></SampleRegistDetail>
        <InspectRegist v-if="activeName == 'InspectRegist'" v-on="$listeners"></InspectRegist>
        <InspectRegistDetail v-if="activeName == 'InspectRegistDetail'"></InspectRegistDetail>
        <InspectReview v-if="activeName == 'InspectReview'" :isEdit="item.isEdit"></InspectReview>
      </el-tab-pane>
    </el-tabs>

虽然上述代码没有问题,没有报错,但是这样明显是不对的,查询了下,然后做了改正:

<el-tabs ref="tabRef" v-model="activeName" @tab-click="handleClick">
      <el-tab-pane
        v-for="item in options.tabs"
        :key="item.name"
        :label="item.label"
        :name="item.name"
      >
        <keep-alive>
          <div :is="item.name"></div>
        </keep-alive>
      </el-tab-pane>
    </el-tabs>

这样DOM树渲染就正常了,

原因是:使用v-if会本身就会造成多次渲染

看了下官网解释的很好,给出的例子也很好:https://cn.vuejs.org/v2/guide/components-dynamic-async.html

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,父组件可以通过使用子组件的引用来调用组件的方法。可以使用this.$refs来获取子组件的引用,并通过引用调用组件的方法。例如,可以使用this.$refs.child.$emit("childmethod")来触发子组件中的名为childmethod的事件。 当父组件调用组件方法时,可能会遇到组件调用组件方法时子组件还未渲染成功的情况。这是因为父子组件的生命周期不同,需要确保在正确的生命周期阶段调用组件的方法。在加载和渲染过程中,父组件的生命周期顺序是beforeCreate、created、beforeMount,而子组件的生命周期顺序是beforeCreate、created、beforeMount、mounted。 在子组件更新过程中,父组件的生命周期顺序是beforeUpdate、updated,而子组件的生命周期顺序是beforeUpdate、updated。当父组件更新时,会先触发子组件的更新,然后再触发父组件的更新。 在销毁过程中,父组件的生命周期顺序是beforeDestroy、destroyed,而子组件的生命周期顺序是beforeDestroy、destroyed。 所以,如果在父组件调用组件方法时出现提示"not a function"的错误,可能是因为父组件在错误的生命周期阶段调用了子组件的方法。需要确保在子组件已经渲染成功之后再调用组件的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue组件调用组件this.$refs报错,undefined、not a function问题解决方法](https://blog.csdn.net/he1234555/article/details/126452841)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [vue组件调用组件的方法](https://blog.csdn.net/qq_32766999/article/details/126031008)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值