vue在mounted中无法获取$refs绑定的dom元素

Vue中v-if与v-show的选择
本文通过一个具体的例子对比了Vue中v-if与v-show的区别,特别是它们对DOM渲染的影响。阐述了如何根据需求选择合适的条件渲染方式,并解决了一个与$refs相关的常见问题。

分析问题、解决问题

根据vue中的钩子函数来说,mounted是渲染完成之后再执行的,这时候dom元素是加载完成了的。根据$refs去获得绑定的元素,如果元素已经是加载完成的话,那绝对是能够获取到的。所以出现这种情况,只有一种可能:你的$refs所在的标签并未被渲染。

这时候就需要检查你的渲染条件是使用了v-if还是v-showv-if只有当条件成立才去渲染dom元素,所以在条件不成立时,该元素并未被渲染。而且,当条件成立,渲染完成之后,若所选择的条件不成立,该dom元素还会被销毁。
v-show会由始到终都加载该dom元素,只是不可见(可以理解为display=none)。
在这里插入图片描述
根据需求去选择你所需要条件渲染方式。

记录自己踩过的一个坑:

首先我在表格数据加载中使用了v-if作为条件渲染,当有数据时渲染数据,没有数据时显示No Data。可能有人问,这个要条件渲染?el-table不是自带的吗?我不想显示表头好吧。表格中也开启了多选框功能。

<div v-if="haveData">
    <el-table ref="tableData" @selection-change="haveSelectionChange" :data="tableData">
        <el-table-column type="selection"></el-table-column>
        ....
    </el-table>
</div>
<div v-else>
    No Data
</div>

问题复现:当我一开始条件成立,渲染出数据的时候,我点击了多选框,这时候,this.$refs.table.selection里面是有数据的,当我表格绑定的数据发生变化时,this.$refs.table.selection会自动置空,多选框恢复未选中状态,除非你自己又调用了toggleAllSelection方法。然而神奇的一幕出现了,当条件成立表格渲染成功后,点击多选框,触发一次条件不成立,再触发条件成立时,多选框恢复未选中状态,但是this.$refs.table.selection里面是有数据,保存的是刚才点击多选的数据。

导致这个问题出现的原因,我尝试去理解,或许这有点超出我的能力范畴了。我知道一定是dom渲染出了某些问题,不过具体原因有待研究。解决方案很简单,只要把v-if改为v-show即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值