vue中form表单支持回车键提交踩坑

平时我们项目中的列表页面通常都有条件搜索,为了使用方便通常都会支持回车搜索.

此功能的实现普遍做法是:为form表单添加 @keydown.enter.native="自定义方法名称"
然后在方法触发时判断keyCode是否等与13 如果是13则证明触发了回车键

例如:

<Form :label-width="100" :model="searchForm" inline ref="searchForm" @keydown.enter.native="searchEnterFun" @submit.native.prevent>
   <FormItem label="搜索关键词:" prop="keyword">
      <Input clearable placeholder="支持模糊搜索" style="width: 200px" type="text" v-model="searchForm.keyword"/>
   </FormItem>
   <FormItem style="margin-left: -75px">
      <Button @click="handleSearch" icon="md-search" type="primary">搜索</Button>
      <Button @click="handleResetSearch">重置</Button>
   </FormItem>
</Form>
searchEnterFun(e) {
  //which 和 keyCode 属性提供了解决浏览器的兼容性的方法。
   //keyCode属性返回onkeypress事件触发的键的值的字符代码,或者 onkeydown 或 onkeyup 事件的键的代码
   var keyCode = window.event? e.keyCode:e.which;
   if (keyCode == 13) {
       this.getCustomList();  //搜索事件
   }
},

嗯,回车触发表单提交的实际应用就简单介绍这么多,接下来我们来说说这里面的坑

1.使用vue开发,页面文本框在点击回车时会刷新页面,而且只有第一次会触发刷新。
2.回车后页面进行了刷新并且在跳转 URL中也多出了 ?
3.再次回车查询正常,不会刷新了

那么我们来说说产生此bug的原因以及解决方案

bug原因:在当前页面元素中只有一个文本框时,点击回车时会自动提交表单

资料依据:

W3C 标准中有如下规定:

  1. When there is only one single-line text input field in a form,

  2. the user agent should accept Enter in that field as a request to submit the form.

  3. 当表单中只有一个单行文本输入框时,客户端应该接受该区域中的Enter作为提交表单的请求

解决方案:

在FORM标签中加入@SUBMIT.NATIVE.PREVENT阻止事件即可

大家仔细看我最上面的示例代码不难发现本人已经添加,实在是这个坑跌的我差点爬不出来!!!

因此特做此纪录,防止自己重复跌坑,也方便给已经跌坑的道友扔出"希望之梯"......

Vue 框架中,表单输入框(如 `el-input`)无法编辑是一个较为常见的问题,通常与 Vue 的响应式系统有关。以下是常见的原因及对应的解决方案: ### 1. 数据未在 `data` 中定义 Vue 无法自动追踪对象属性的新增或删除,因此如果输入框绑定的属性未在 `data` 中提前定义,会导致无法响应式更新。例如: ```javascript data() { return { form: {} } } ``` 如果在后续通过方法添加了 `form` 的属性(如 `this.form.newField = 'value'`),Vue 无法自动追踪该变化,从而导致输入框无法编辑。解决方案是使用 `Vue.set` 或其别名 `this.$set`: ```javascript this.$set(this.form, 'newField', 'value'); ``` 该方法会触发 Vue 的响应式更新机制,确保新增属性是响应式的[^2]。 --- ### 2. 使用 `reactive` 时直接替换响应式对象 在 Vue 3 中,如果使用 `reactive` 创建响应式对象,并在赋值时替换了整个对象,可能会导致响应式失效。例如: ```javascript const formUser = reactive({ name: '' }); formUser = { name: 'John' }; // 错误:直接替换响应式对象 ``` 正确的做法是保持引用不变,仅修改对象属性值: ```javascript formUser.name = 'John'; ``` 或者使用 `ref` 来包装对象,并通过 `.value` 修改其内容: ```javascript const formUser = ref({ name: '' }); formUser.value = { name: 'John' }; ``` 这样可以确保 Vue 能够追踪到数据变化[^4]。 --- ### 3. 表单验证中 `ref` 和 `model` 使用相同变量名 在使用 `el-form` 和 `el-form-item` 时,如果 `ref` 和 `model` 使用了相同的变量名,可能会导致输入框无法编辑。例如: ```html <el-form :model="form" ref="form"> <el-form-item label="姓名"> <el-input v-model="form.name"></el-input> </el-form-item> </el-form> ``` 应确保 `ref` 和 `model` 的命名不冲突,避免覆盖或干扰响应式数据。 --- ### 4. 输入框绑定的数据是嵌套对象的动态属性 当输入框绑定的是嵌套对象的动态属性时,如果该属性未被正确初始化,也可能导致无法编辑。例如: ```javascript data() { return { dataform: { son1: '', son2: '' } }; } ``` 如果通过方法动态添加属性: ```javascript addSonFun() { this.dataform['son3'] = ''; } ``` 建议使用 `this.$set` 来确保新属性是响应式的: ```javascript this.$set(this.dataform, 'son3', ''); ``` 这样可以避免因属性未响应式而导致输入框无法编辑的问题[^5]。 --- ### 5. 使用 `v-model` 时未正确绑定数据 如果输入框使用 `v-model` 绑定的数据未正确初始化,或者在组件内部被修改但未触发更新,也可能导致无法编辑。例如: ```html <el-input v-model="inputValue"></el-input> ``` 确保 `inputValue` 在 `data` 中被正确初始化: ```javascript data() { return { inputValue: '' }; } ``` 同时,如果在组件内部通过方法修改了 `inputValue`,应确保使用 `this.$set` 或直接赋值以触发响应式更新。 --- ### 6. 强制更新渲染 在某些特殊情况下,Vue 的响应式系统可能无法检测到数据变化,导致输入框未更新。此时可以使用 `this.$forceUpdate()` 强制重新渲染组件: ```html <el-input v-model="inputNode.business_org_code" @input="onInput"></el-input> ``` ```javascript methods: { onInput() { this.$forceUpdate(); } } ``` 虽然这不是最佳实践,但在某些复杂场景下可以作为一种临时解决方案[^3]。 --- ### 7. 表单提交行为导致页面刷新 当表单中只有一个输入框时,按下回车键可能会触发表单的默认提交行为,导致页面刷新。这可能会影响输入框的编辑状态。可以通过阻止默认提交行为来解决: ```html <el-form @submit.native.prevent> <el-input v-model="value" @keyup.enter.native="handleEnter"></el-input> </el-form> ``` 这样可以避免因页面刷新而导致输入框状态丢失的问题[^1]。 --- ### 总结 输入框无法编辑的根本原因通常与 Vue 的响应式机制有关,特别是在动态添加属性、替换响应式对象、表单验证冲突等场景下容易出现问题。通过使用 `Vue.set`、避免直接替换响应式对象、正确命名 `ref` 和 `model`、以及在必要时强制更新渲染,可以有效解决这些问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值