iView的Tooltip在动态内容更新后不显示新文字怎么办?
我在用iView的Tooltip组件时,发现当绑定的提示文字是动态数据(比如从接口返回的)时,Tooltip第一次能正常显示,但数据更新后,鼠标移上去还是显示旧的内容。明明data里的值已经变了,页面其他地方都更新了,就Tooltip没反应。
我试过加:key强制刷新,也试过this.$forceUpdate(),都不行。是不是哪里用错了?下面是我的代码:
export default {
data() {
return {
tooltipContent: '加载中...'
}
},
mounted() {
setTimeout(() => {
this.tooltipContent = '新提示内容'; // 这时候Tooltip点开还是“加载中...”
}, 1000);
}
}
问题原因:Tooltip组件在初始化时绑定了content值,但后续更新时没有触发内部重新渲染。这是组件本身实现的问题,不是你的用法问题。
解决方案有两个:
方案一:用slot插槽代替content属性(推荐)
这是最干净的做法,插槽是Vue原生的,响应性没问题:
把提示内容放在slot="content"里,数据更新后Tooltip就能正确显示了。
方案二:用v-if强制销毁重建
如果必须用content属性,可以加个v-if配合key来强制重新创建组件:
然后在数据更新后稍微延迟一下重置visible状态:
不过这个方案会有闪烁问题,体验不太好。
方案三:监听数据变化手动触发
也可以用watch监听数据变化,然后通过refs操作Tooltip的内部方法:
不过这个方案比较hack,不建议使用。
综合来看,直接用slot是最稳妥的方案。iView官方其实也推荐用插槽的方式,只是文档可能没强调这点。你改改试试,应该能解决。
v-if,数据变了就让它销毁重建,最省事:或者用
:key="tooltipContent"绑定内容当 key 也行,反正只要让它觉得「这是个新组件」就对了。