el-form重置后input无法输入问题

新增用户遇到的问题:

在这里插入图片描述

如果你没有为 formData 设置默认值,而只是将其初始化为空对象 {},则在打开dialog时,正常输入,
formdata会变成如下
在这里插入图片描述
但是,打开后,直接使用 resetFields 或直接清空表单,
formdata会变成如下:
在这里插入图片描述
Vue 使用 Object.defineProperty 实现响应式系统,而这个方法只能劫持对象在初始化时存在的属性,后添加的属性不会被自动追踪。
Vue 的响应式系统无法检测到新添加的属性,从而导致输入框无法及时更新到 DOM 上。

当 formData 被清空时,后添加的属性(password、username)不会被 Vue 的响应式系统自动追踪,这会导致输入框无法及时挂载到 DOM 上。

解决方案

  • 使用 Vue.set 方法:确保在为对象添加新属性时使用 Vue.set,以确保新属性是响应式的。
this.$set(this.formData, 'name', '');`
  • 初始化默认值:在表单数据对象中预先设置好所有可能的字段,避免在运行时动态添加属性。
formdata: {
	id: null,
	username: '',
	password: '',
	roleName: ''
},

新问题(修改用户):

<el-dialog :title="formdata.id?'修改用户':'添加用户'" :visible.sync="dialogFormVisible" @close="closedialog">
  <div class="upload-div">
    <el-form :model="formdata" ref="formdata" label-width="80px" status-icon>
      <el-form-item class="formitem" label="用户名" prop="username">
        <el-input v-model="formdata.username"></el-input>
      </el-form-item>
      <el-form-item class="formitem" label="密码" prop="password">
        <el-input v-model="formdata.password"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm">提交</el-button>
        <el-button @click="resetForm('formdata')">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</el-dialog>

在这里插入图片描述

由于el-form组件进行了复用,formdata的初始值如上,在对el-table的某一行进行修改时,

changeContent (row) {
  this.dialogFormVisible = true;

  // row.password = '';
  this.$nextTick(() => {
    this.formdata = JSON.parse(JSON.stringify(row));
    // this.$set(this.formdata, 'password', '')
  })
},

formdata重新赋值变成了
在这里插入图片描述
这就导致了在重置时,由于formdata的初始值设置中是有password,所以在重置后,formdata的结构如下
在这里插入图片描述

在打开dialog直接点击重置后,我们再往password的input中输入,发现会无法输入,这是因为此时password不具有响应式,是新添加的属性。
如果打开dialog后,正常操作,则不会有上述问题。在输入password后password才会加入formdata,并变成响应式。

解决办法:
 // 第一种方式:row.password = '';
this.$nextTick(() => {
  this.formdata = JSON.parse(JSON.stringify(row));
  console.log("formdata", this.formdata);
  // 第二种方式:this.$set(this.formdata, 'password', '')
})

这两种方式都能将password变为响应式的。

重置是在重置前的formdata的基础上进行的,重置前的formdata与初始化进行比较,将初始化的属性和属性值赋值到现在的formdata中,而方法不会赋值过来,这也就是password为什么没有响应式的原因。
并且重置只会将在el-form中展示的属性进行重置,对上面的el-form进行重置,发现id和roleName并没有重置到初始状态,这是因为这两个属性并没有设置prop和v-model绑定。
在这里插入图片描述

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用 Element UI 组件库来创建精美的登录界面。通过组合使用 `el-form`、`el-form-item` 和 `el-input` 组件,可以轻松地构建一个具有表单验证和美观样式的登录界面。 首先,你需要在你的项目中引入 Element UI 组件库。可以通过 CDN 的方式引入,也可以通过 npm 安装并导入组件。 下面是一个示例代码,演示如何使用这些组件创建一个简单的登录界面: ```html <template> <el-form ref="loginForm" :model="loginData" :rules="loginRules" label-width="80px"> <el-form-item label="用户名" prop="username"> <el-input v-model="loginData.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="loginData.password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="login">登录</el-button> <el-button @click="resetForm"></el-button> </el-form-item> </el-form> </template> <script> export default { data() { return { loginData: { username: '', password: '' }, loginRules: { username: [ { required: true, message: '请输入用户名', trigger: 'blur' } ], password: [ { required: true, message: '请输入密码', trigger: 'blur' } ] } }; }, methods: { login() { // 处理登录逻辑 // ... }, resetForm() { this.$refs.loginForm.resetFields(); } } }; </script> ``` 在上面的示例代码中,`el-form` 组件包裹了登录表单,并通过 `ref` 属性绑定了一个名为 "loginForm" 的引用。`el-form-item` 是每个表单项的容器,其中 `label` 属性用于显示表单项的标签,`prop` 属性用于进行表单验证。 `el-input` 组件用于获取用户输入的用户名和密码。通过 `v-model` 指令将输入框的值绑定到 `loginData` 对象的属性上。 `loginRules` 对象定义了表单的验证规则,以确保用户输入的有效性。 登录按钮和按钮使用 `el-button` 组件创建,并绑定了相应的点击事件。 通过这样的组合使用,你可以创建一个具有表单验证和美观样式的登录界面。可以根据自己的需求进行进一步的样式定制和功能扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值