TDesign的Dialog组件关闭后再次打开内容不更新怎么办?
在用TDesign的Dialog做用户信息弹窗时遇到个怪问题——第一次打开弹窗能正常显示数据,但关闭后再次点击按钮打开,内容就变成空了。明明数据源已经更新了…
我尝试用ref调用setProps传新数据,但还是不行。看控制台没报错,就是内容不刷新。代码大概是这样的:
const userDialog = ref();
const userInfo = ref({});
function openDialog(data) {
userInfo.value = data; // 直接赋值
userDialog.value.setProps({
visible: true,
content: `姓名:${userInfo.name} | 年龄:${userInfo.age}`
});
}
后来发现如果把content改成模板里的渲染方式会好一点,但还是存在数据不同步的情况。难道TDesign的Dialog需要特殊处理缓存吗?
根本解法不是折腾setProps,而是别用content属性传字符串内容。你把内容扔到template里用v-if控制,让Vue的响应式系统来驱动渲染:
然后openDialog改成这样:
关键点是给t-dialog套一层v-if,或者至少给内部内容加v-if。这样每次打开都会重新渲染子节点,拿到最新的userInfo。如果你坚持用content属性,就得每次手动拼字符串传进去,很容易漏更新。
还有个坑是setProps只改传给组件的props,不影响组件内部的data状态,所以别迷信这个方法。老老实实用响应式数据+模板渲染最稳。
解决办法有两种:
第一种,用官方推荐的方式,在
visible-change事件里清空内容:不过我觉得更好的方式是直接用Vue的渲染机制,把content绑定成动态变量:
第二种方式更符合Vue的响应式思想,也避免了手动操作DOM带来的麻烦。WP里面很多类似的弹窗插件也是这么处理的,数据变了视图自然就更新了,省心。