当前位置:首页 > VUE

vue实现双击编辑

2026-01-16 06:28:19VUE

Vue 实现双击编辑功能

基本实现思路

通过监听元素的 dblclick 事件触发编辑状态,结合 v-ifv-else 切换显示模式。以下是核心实现方案:

vue实现双击编辑

<template>
  <div>
    <span v-if="!isEditing" @dblclick="startEditing">{{ content }}</span>
    <input
      v-else
      ref="inputField"
      v-model="editableContent"
      @blur="stopEditing"
      @keyup.enter="stopEditing"
    />
  </div>
</template>

<script>
export default {
  data() {
    return {
      content: '双击编辑这段文字',
      isEditing: false,
      editableContent: ''
    }
  },
  methods: {
    startEditing() {
      this.isEditing = true
      this.editableContent = this.content
      this.$nextTick(() => {
        this.$refs.inputField.focus()
      })
    },
    stopEditing() {
      this.isEditing = false
      this.content = this.editableContent
    }
  }
}
</script>

进阶优化方案

自动选中文本 在获得焦点时自动全选输入框内容:

vue实现双击编辑

startEditing() {
  this.isEditing = true
  this.editableContent = this.content
  this.$nextTick(() => {
    const input = this.$refs.inputField
    input.focus()
    input.select()
  })
}

ESC 键取消编辑

<input
  v-else
  @keyup.esc="cancelEditing"
/>
cancelEditing() {
  this.isEditing = false
}

封装为可复用组件

创建 EditableText.vue 组件:

<template>
  <div class="editable-text">
    <slot v-if="!isEditing" name="display" @dblclick="startEditing">
      <span @dblclick="startEditing">{{ value }}</span>
    </slot>
    <slot v-else name="edit">
      <input
        ref="input"
        v-model="editableValue"
        @blur="handleBlur"
        @keyup.enter="handleBlur"
        @keyup.esc="cancelEdit"
      />
    </slot>
  </div>
</template>

<script>
export default {
  props: {
    value: {
      type: String,
      required: true
    }
  },
  data() {
    return {
      isEditing: false,
      editableValue: this.value
    }
  },
  methods: {
    startEditing() {
      this.isEditing = true
      this.editableValue = this.value
      this.$nextTick(() => {
        this.$refs.input.focus()
      })
    },
    handleBlur() {
      this.$emit('input', this.editableValue)
      this.isEditing = false
    },
    cancelEdit() {
      this.isEditing = false
    }
  }
}
</script>

使用示例

<editable-text v-model="textContent" />

样式优化建议

.editable-text {
  display: inline-block;
}
.editable-text span {
  padding: 2px 5px;
  cursor: text;
}
.editable-text input {
  border: 1px solid #ddd;
  padding: 2px 5px;
}

注意事项

  • 对于表格单元格等场景,可能需要调整事件冒泡
  • 移动端需要额外考虑触摸事件处理
  • 复杂内容编辑可替换为 contenteditable 属性或富文本编辑器

标签: 双击编辑
分享给朋友:

相关文章

vue实现画布编辑

vue实现画布编辑

Vue 实现画布编辑 使用 HTML5 Canvas 和 Vue 结合 在 Vue 中可以通过封装 HTML5 Canvas 实现画布编辑功能。创建一个 Vue 组件,在 mounted 钩子中初始化…

vue实现商品规格编辑

vue实现商品规格编辑

实现商品规格编辑功能 在Vue中实现商品规格编辑功能通常涉及动态表单生成、数据绑定和交互逻辑处理。以下是一个典型的实现方案: 数据结构设计 商品规格数据通常采用嵌套结构,例如: data() {…

vue实现编辑提示功能

vue实现编辑提示功能

实现编辑提示功能的步骤 使用v-model绑定数据 在Vue中,可以通过v-model指令实现双向数据绑定。在编辑模式下,将输入框与数据绑定,非编辑模式下显示文本内容。 <template&g…

vue实现md编辑展示

vue实现md编辑展示

Vue 实现 Markdown 编辑与展示 安装依赖 在 Vue 项目中安装 marked 和 highlight.js,用于解析 Markdown 语法和高亮代码: npm install mar…

react如何将下拉框可编辑

react如何将下拉框可编辑

实现可编辑下拉框的方法 在React中实现可编辑下拉框通常需要结合<select>和<input>元素的功能。以下是几种常见方法: 使用datalist元素 HTML5的&l…