今日热闻!v-if与v-show造成部分元素丢失的问题——v-if复用元素问题
2023-04-13 06:30:51来源:博客园
【资料图】
在写tab切换时遇到了一个问题,以下为简化后的问题所在的代码:
当页面加载时,先向id为content的div中添加了一些元素:
function addContent() { const newDiv = document.createElement("div"); newDiv.innerHTML = "123456789"; document.getElementById("content").appendChild(newDiv);}如果当tabIndex为2时执行addContent(),上述123456789能够正常显示;但如果:在此时将tabIndex改为1,再将tabIndex改为2,或者在tabIndex不为2时执行addContent(),再将tabIndex改为2,这两种情况下,123456789都无法正常显示。问题探索首先尝试将目标元素输出到控制台。在切换tabIndex前,先获取原来的元素:
var oldT4 = document.getElementById("t4");var oldContent = document.getElementById("content");此时输出显然能得到正确的结果。然后在切换tabIndex后,再获取新的元素:
var newT4 = document.getElementById("t4");var newContent = document.getElementById("content");console.log(oldT4, newT4);console.log(oldContent, newContent);此时会发现:
oldContent元素虽然能正常输出,但在页面上已经不存在了,此时oldContent仅仅是引用了一个不存在的元素;newContent元素就是当前页面上的content元素,但其中的内容已被清空。newT4元素就是当前页面上的t4元素。oldT4却离奇的变为了t2元素,console.log(oldT4 === document.getElementById("t2"))的结果为true。问题原因这是因为t4在tabIndex切换时,复用了被v-if隐藏的t2元素,复用时会重新渲染t4内的所有内容,这种情况下,动态添加到content元素中的内容就会被清空。这里复用的顺序则是从第一个同样为div的被v-if隐藏的元素开始复用,即t2元素。类似的,如果此时进一步将t2元素的v-if修改成v-show,则oldT4就会去复用t3元素。
要保留content元素中的内容,可以考虑:
t2、t3的v-if改成v-show。如果确实不方便修改v-if,则可以给t2、t3添加key属性,使其不会被复用。
关键词:





南宁铁路公安“寻包达人”两年收到旅客锦旗116面
福建平潭海警出击 破获一起涉嫌走私冻品案
齐齐哈尔市龙江县警方破获一涉案200余万元的“帮信”案件
北京市新增本土确诊病例7例、无症状感染者2例
浙江东阳警方通报:剧组因拍摄致猫死亡等事实不成立
天津大学留学生志愿者:同天津人民一起守护共同的家园
永远意气风发!平均年龄62岁的教授合唱团重阳节唱响
我国首颗太阳探测科学技术试验卫星“羲和号”成功发射
人社部副部长李忠:加强对中小微企业的服务 营造鼓励创新氛围
中国驻俄使馆与新疆维吾尔自治区政府共同举办“新疆是个










