弹窗编辑表单数据不更新怎么办?
我在用 Vue 做一个用户列表,点击编辑会弹出模态框,里面是表单。但每次点编辑,输入框里的值还是旧的,明明我传了新数据进去。
试过用 v-model 绑定,也用了 watch 监听 props 变化去更新本地 data,但第一次打开没问题,第二次就卡在上一次的数据了。
这是我的组件关键部分:
<template>
<div v-if="showModal">
<input v-model="formData.name" />
</div>
</template>
<script>
export default {
props: ['user'],
data() {
return {
formData: { name: '' }
}
},
watch: {
user: {
handler(newVal) {
this.formData.name = newVal.name
},
immediate: true
}
}
}
</script>
是不是哪里没处理好响应式?还是弹窗复用导致的问题?
首先,确保每次打开模态框时,
formData都能被正确初始化。可以考虑在showModal变为 true 时手动更新formData。你可以在watch中监听showModal的变化,或者使用beforeUpdate或updated生命周期钩子。不过,更简单的方法可能是使用
key属性强制重新渲染组件。你可以在模板中给模态框的容器添加一个动态的key,这样每次user变化时,都会重新创建模态框组件实例,从而避免数据残留的问题。修改后的代码如下:
注意这里给模态框的
div添加了:key="user.id",假设user对象中有一个唯一的id属性。这样可以确保每次user变化时,Vue 会销毁并重新创建这个模态框组件,从而解决数据不更新的问题。另外,虽然这个问题不涉及直接的安全风险,但保持良好的编码习惯有助于预防潜在的安全漏洞,比如防止注入攻击。确保从用户输入获取的数据经过适当的验证和清理后再使用。
deep: true,Vue 默认只监听对象引用变化,你修改了 user 对象的属性但引用没变,watch 根本不会触发。改这样:
或者更省事儿的做法:别用 watch,在每次打开弹窗的时候重置:
第二种写法更清晰,watch 深度监听有性能开销,能避则避。