VUE-实现一个可编辑修改的表格/清空回车默认事件/回车和换行事件冲突/失焦不修改回车保存


前言

最近做的一个功能发现,其中还挺多坑的,就写个小记录吧,也为后人少踩点坑,下面就按我的开发过程来讲述这其中的问题吧。


一、失焦不修改内容回车才保存

在这里插入图片描述
如图是一个表格,我们需要表格的单元格内容,双击或者haver到会出现编辑按键点击可以变为 input 输入框,对内容进行修改。

第一版

当时想的是需要获取到每一个单元格的位置,这就麻烦了,一个表格,可以说是一个二维的,得通过行和列来定位到每一个格子。

具体实现就不记得了,这里大概说下一开始咋想的

首先DOM的层面:我们可以通过一个v-show来进行切换,如果触发双击的行为,就把赋给 v-show 的值变为 true 就可以实现展示和编辑的切换了。这一步并不难,但难点在于我们如何定位到这个单元格里。

 <el-table-column
        :show-overflow-tooltip="true"
        align="center"
        label="英文"
      >
        <template slot-scope="scope">
          <div
            :class="b('contentStyle')"
            @dblclick="changeEnddate(scope.$index,'en', scope.row)"
          >
            <span v-if="!scope.row.is_show_en">{
  
  { scope.row.en }}</span>
            <el-input
              v-else
              :ref='scope.$index'
              v-model="scope.row.en"
              clearable
              size="mini"
              @blur="switchShow(scope.$index,'en')"
              @keyup.enter.native="$event.target.blur"
            />
          </div>
        </template>
      </el-table-column>

这里就是先获取到列和再来获取到行来定位的。

 methods: {
   
   
    //  双击编辑
    // 切换input框的显示状态
    switchShow(index
<think>我们参考用户提供的引用内容,但用户当前使用的是Vue 3,而引用中的例子是Vue 2(使用.native修饰符)。在Vue 3中,.native修饰符已被移除,因此我们需要采用同的方式。 用户需求:在Vue 3中,实现输入框敲回车键触发事件,且回车在输入框显示。 解决方案: 1.Vue 3中,我们可以直接使用`@keyup.enter`事件绑定,无需使用.native修饰符(因为Vue 3中,对于自定义组件,v-on监听的事件都是原生事件,除非组件内部声明了自定义事件)。 2. 但是,用户提到“回车在输入框显示”,这通常意味着在输入框内按回车键时,希望触发表单的提交(因为表单提交会导致页面刷新,从而可能清空输入框或刷新页面,导致回车键的默认为被阻止而会显示在输入框中)。 3. 因此,我们需要阻止回车默认为(即提交表单)。在Vue中,我们可以使用事件修饰符`.prevent`来阻止默认为。 步骤: - 如果输入框在表单中,那么按回车键会触发表单的提交事件(submit),导致页面刷新。为了避免刷新,我们需要在表单的提交事件上使用`.prevent`,或者在输入框的回车事件上使用`.prevent`。 - 如果输入框在表单中,那么按回车会导致页面刷新,但为了确保显示回车字符(实际上在输入框中回车通常会显示为字符,而是触发事件),我们只需要绑定回车事件即可。 具体实现: 情况一:输入框在表单中 我们可以这样写: ```html <form @submit.prevent> <el-input v-model="inputValue" @keyup.enter="handleEnter" placeholder="请输入" ></el-input> </form> ``` 或者,如果想在表单级别阻止,可以在输入框的事件上阻止: ```html <el-input v-model="inputValue" @keyup.enter.prevent="handleEnter" placeholder="请输入" ></el-input> ``` 注意:使用`.prevent`修饰符可以阻止默认为(即表单提交),从而避免页面刷新。 情况二:输入框在表单中 这时回车默认会刷新页面,所以可以直接: ```html <el-input v-model="inputValue" @keyup.enter="handleEnter" placeholder="请输入" ></el-input> ``` 另外,用户提到使用Element Plus(因为用户示例中使用了`el-input``el-button`,所以推断使用的是Element UI,而Vue 3对应的是Element Plus)。在Element Plus中,`el-input`组件已经内置了处理,所以我们直接使用`@keyup.enter`即可。 但是,有时候在组件上使用`@keyup.enter`可能会生效,因为组件可能没有将原生事件正确传递。在Element Plus中,我们可以使用`@keyup.enter.native`(在Vue 2中)但在Vue 3中,我们需要使用`@keyup.enter`或者使用事件穿透(因为Element Plus的输入框组件已经将原生事件暴露出来)。实际上,Element Plus的输入框组件内部已经处理了,所以我们直接使用`@keyup.enter`即可。 然而,根据Element Plus的文档,它支持直接使用键盘事件,所以我们无需使用.native(Vue 3也支持)。 因此,我们可以这样写: ```html <template> <el-input v-model="inputValue" @keyup.enter="handleEnter" placeholder="请输入" clearable /> </template> <script setup> import { ref } from 'vue'; const inputValue = ref(''); const handleEnter = () => { console.log('按下了回车键'); // 执搜索或其他操作 }; </script> ``` 为了防止页面刷新(如果输入框在表单中,并且表单只有一个输入框,那么按回车会触发表单提交),我们可以在`@keyup.enter`事件处理函数中调用`event.preventDefault()`,或者使用修饰符`.prevent`。 所以,如果遇到页面刷新的问题,我们就加上`.prevent`: ```html <el-input v-model="inputValue" @keyup.enter.prevent="handleEnter" placeholder="请输入" clearable /> ``` 注意:在模板中,如果使用`@keyup.enter.prevent`,那么事件处理函数`handleEnter`将会接收到原始事件对象。如果需要事件对象,可以显式传递`$event`: ```html <el-input v-model="inputValue" @keyup.enter.prevent="handleEnter($event)" placeholder="请输入" clearable /> ``` 然后在方法中: ```javascript const handleEnter = (event) => { // 可以使用event // 但是因为我们阻止了默认为,所以会刷新页面 // 执搜索操作 }; ``` 但是,通常我们需要事件对象,除非需要获取按键的详细信息。 总结: 在Vue 3中,使用Element Plus的`el-input`组件,要实现回车触发事件显示回车字符(实际上是避免页面刷新),我们可以直接使用`@keyup.enter`,如果遇到页面刷新问题,则添加`.prevent`修饰符。 另外,如果用户希望在任何情况下都出现回车字符(比如在输入多文本时,回车换行,但这里显然是多输入),那么对于单输入框,回车本来就是用来提交的,而是输入换行符,所以会显示为字符。所以这个需求的关键在于避免页面刷新。 因此,我们给出以下示例代码: ```html <template> <el-input v-model="orgNameInput" @keyup.enter.prevent="search" placeholder="请输入" clearable /> <el-button type="primary" @click="search" size="medium">搜索</el-button> </template> <script setup> import { ref } from 'vue'; const orgNameInput = ref(''); const search = () => { // 执搜索操作,比如请求数据 console.log('搜索内容:', orgNameInput.value); }; </script> ``` 这样,在输入框中按回车键就会触发`search`方法,同时阻止了默认为(表单提交导致的页面刷新),因此会刷新页面,也就会出现输入框内容被重置的情况。回车键被阻止了默认为,所以会在输入框中显示(实际上在单输入框中回车会显示为字符,但是会触发表单提交,这里阻止了表单提交)。 注意:用户提供的引用中使用了`@keyup.enter.native`,这是Vue 2的写法,在Vue 3中我们需要`.native`,直接使用`@keyup.enter`即可。 如果用户使用的是原生的`<input>`标签,那么写法更简单: ```html <input type="text" v-model="inputValue" @keyup.enter.prevent="handleEnter" /> ``` 综上所述,Vue 3中的实现方法就是使用`@keyup.enter`事件,并根据需要添加`.prevent`修饰符。 生成相关问题: 1.Vue 3中,如何监听Element Plus组件的键盘事件? 2. 为什么在Vue 3中再需要.native修饰符? 3. 如何在Vue 3中阻止事件默认为? </think>### Vue 3 实现输入框回车键触发事件显示回车符的方法 在 Vue 3 中,实现输入框回车键触发事件且避免回车符显示的解决方案如下: #### 核心代码实现 ```html <template> <!-- 方案1:使用原生 input + Vue 事件修饰符 --> <input v-model="inputValue" @keyup.enter.prevent="handleSearch" <!-- 关键修饰符 --> placeholder="单输入框" /> <!-- 方案2:Element Plus 组件 --> <el-input v-model="inputValue" @keyup.enter.native.prevent="handleSearch" <!-- 注意 .native 修饰符 --> placeholder="Element Plus 输入框" /> </template> <script setup> import { ref } from 'vue'; const inputValue = ref(''); // 搜索处理函数 const handleSearch = () => { console.log("触发搜索:", inputValue.value); // 这里添加实际搜索逻辑 }; </script> ``` #### 关键点说明 1. **`.prevent` 修饰符** 阻止回车键的默认为(提交表单/页面刷新),从根源上避免回车符显示: `@keyup.enter.prevent` 2. **`.native` 修饰符(组件库专用)** 在 Element Plus 等第三方组件上使用时,需添加 `.native` 监听原生事件: `@keyup.enter.native.prevent` 3. **单输入框限制** 使用 `<input type="text">` 而非 `<textarea>`,因为: -输入框默认会显示回车-文本框需要额外处理换行符 #### 完整解决方案 ```html <template> <div class="search-container"> <!-- 原生输入框方案 --> <input v-model="searchText" @keyup.enter.prevent="executeSearch" class="search-input" placeholder="输入关键词回车搜索" /> <!-- Element Plus 方案 --> <el-input v-model="searchText" @keyup.enter.native.prevent="executeSearch" placeholder="Element 输入框" clearable /> <el-button @click="executeSearch">搜索</el-button> </div> </template> <script setup> import { ref } from 'vue'; const searchText = ref(''); const executeSearch = () => { if (!searchText.value.trim()) return; console.log("执搜索:", searchText.value); // 实际搜索逻辑(API请求等) }; </script> <style scoped> .search-container { display: flex; gap: 10px; } .search-input { padding: 8px 12px; border: 1px solid #dcdfe6; border-radius: 4px; } </style> ``` #### 注意事项 1. **避免页面刷新** 如果输入框位于 `<form>` 内,需同时在 form 上添加 `@submit.prevent`: ```html <form @submit.prevent> <input @keyup.enter.prevent="search" /> </form> ``` 2. **多文本框的特殊处理** 如需使用 `<textarea>`,需在事件中过滤回车符: ```javascript const handleInput = (e) => { searchText.value = e.target.value.replace(/\n/g, ""); } ``` 3. **浏览器兼容性** 现代浏览器(Chrome/Firefox/Edge)均支持此方案,无需 polyfill [^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值