对element ui动态可编辑的tag进行优化,点击tag后变为input可编辑

46 篇文章 1 订阅
本文介绍了如何在Vue.js应用中使用Element UI库实现动态可编辑的Tag组件。关键点包括使用Vue的`$set`方法更新响应式数据,利用`ref`进行元素引用,并在适当的时间点聚焦输入框。在`mounted`钩子或`$nextTick`中确保DOM操作正确执行,以实现点击Tag后切换到编辑模式并聚焦输入字段。同时,文章提供了完整的代码示例展示这一功能的实现。
摘要由CSDN通过智能技术生成

在这里插入图片描述
在这里插入图片描述

对element ui动态可编辑的tag进行优化,点击tag后变为input可编辑

https://element.eleme.io/#/zh-CN/component/tag

重点1:$set的用法 修改响应数据

在data中声明editable: [],
通过this.$set(this.editable, index, true);来修改数组

this.$set(vm.item, indexOfItem, newValue);
this.set(vm.item, indexOfItem, newValue);
参数1:要处理的数组名称
参数2:要处理的数组索引
参数3:要处理的数组的值

this.$set(this.editable, index, true);
重点2: ref的使用
  1. ref 需要在dom渲染完成后才会有,在使用的时候确保dom已经渲染完成。比如在生命周期 mounted(){} 钩子中调用,或者在 this.$nextTick(()=>{}) 中调用。

  2. 如果ref 是循环出来的,有多个重名,那么ref的值会是一个数组 ,此时要拿到单个的ref 只需要循环就可以了。

this.$refs[editableInput][0].$refs.input.focus();
重点3:element ui 中input获取焦点
  1. Vue.nextTick()
  • 在Vue生命周期的created()钩子函数进行的DOM操作一定要放在Vue.nextTick()的回调函数中
    在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue.nextTick()的回调函数中。与之对应的就是mounted()钩子函数,因为该钩子函数执行时所有的DOM挂载和渲染都已完成,此时在该钩子函数中进行任何DOM操作都不会有问题 。
  • 在数据变化后要执行的某个操作,而这个操作需要使用随数据改变而改变的DOM结构的时候,这个操作都应该放进Vue.nextTick()的回调函数中。
this.$nextTick((_) => {
        this.$refs.saveTagInput.$refs.input.focus();
      });

源代码

<template>
  <el-form
    label-width="100px"
    class="my-form"
    size="mini"
    label-position="left"
  >
    <el-form-item label="部门职位">
      <div class="inline-box">
        <div v-for="(tag, index) in depatment_role_name" :key="index">
          <el-input
            class="input-new-tag"
            v-if="editable[index]"
            v-model="tag.label"
            :ref="'editableInput' + index"
            size="small"
            placeholder="请输入职位"
            @keyup.enter.native="handleEditableInputConfirm(tag, index)"
            @change="handleEditableInputConfirm(tag, index)"
            @blur="handleEditableInputBlur(tag, index)"
            maxlength="20"
            show-word-limit
          ></el-input>
          <el-tag
            v-else
            @click="showEditTagInput(index)"
            closable
            :disable-transitions="false"
            @close="handleClose(tag, index)"
            >{{ tag.label }}</el-tag
          >
        </div>
        <div>
          <el-input
            class="input-new-tag"
            v-if="inputVisible"
            v-model="inputValue"
            ref="saveTagInput"
            size="small"
            @keyup.enter.native="handleInputConfirm"
            @blur="handleInputConfirm"
            maxlength="20"
            show-word-limit
          ></el-input>
          <el-button
            v-else
            class="button-new-tag"
            size="small"
            @click="showInput"
            >+ 新增职位</el-button
          >
        </div>
      </div>
    </el-form-item>
  </el-form>
</template>
export default {
  components: {
    // "v-chart": ECharts,
  },
  data() {
    return {
      depatment_role_name: [
        {
          value: 1,
          label: "选择1",
        },
        {
          value: 2,
          label: "选择2",
        },
        {
          value: 3,
          label: "选择3",
        },
      ],
      inputVisible: "",
      editable: [],
      inputValue: "",
    };
  },
  methods: {
    //============添加职位=====================
    //添加 职位信息  input显示
    showInput() {
      this.inputVisible = true;
      this.$nextTick((_) => {
        this.$refs.saveTagInput.$refs.input.focus();
      });
    },
    //添加 职位信息 input失去焦点
    handleInputConfirm() {
      let inputValue = this.inputValue;
      if (inputValue) {
        var tagInfo = {
          label: inputValue,
          value: this.depatment_role_name.length + 1,
        };
        this.depatment_role_name.push(tagInfo);
      }
      this.inputVisible = false;
      this.inputValue = "";
    },
    //============编辑职位=====================
    //编辑 职位信息 input显示
    showEditTagInput(index) {
      this.$set(this.editable, index, true);
      this.$nextTick((_) => {
        var editableInput = "editableInput" + index;
        this.$refs[editableInput][0].$refs.input.focus();
      });
    },
    //编辑 职位信息 input发生改变
    handleEditableInputConfirm(item, index) {
      if (item.label) {
        this.$set(this.editable, index, false);
      } else {
        this.$message({ message: "请输入职位信息", type: "info" });
      }
    },
    //编辑 职位信息 input失去焦点
    handleEditableInputBlur(item, index) {
      this.$set(this.editable, index, false);
    },
    //删除部门职位
    handleClose(tag, index) {
      this.depatment_role_name.splice(index, 1);
    },
  },
};
.inline-box {
  display: flex;
}
.inline-box > div {
  margin-right: 5px;
}
  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现element ui Tag动态添加标签,可以使用vue的响应式数据和相关方法来实现。首先,在data中定义一个数组属性,用于保存动态添加的标签数据。然后,在模板中使用v-for指令循环渲染标签。在输入框中通过@keyup.enter.native或@blur事件监听用户输入,将输入的标签值添加到数组中。同时,通过v-if和v-else指令控制输入框和"New Tag"按钮的显示与隐藏。 具体的代码实现可以参考以下步骤和示例代码: 1. 在data中定义一个数组属性,用于保存动态添加的标签数据。例如,可以将其命名为"tags"。 2. 在模板中使用v-for指令循环渲染标签。可以参考示例代码中的el-tag元素。 3. 在输入框中通过@keyup.enter.native或@blur事件监听用户输入,将输入的标签值添加到"tags"数组中。可以参考示例代码中的el-input元素。 4. 使用v-if和v-else指令控制输入框和"New Tag"按钮的显示与隐藏。可以参考示例代码中的v-if和v-else用法。 示例代码如下: ```html <el-table-column type="expand"> <template slot-scope="scope"> <el-tag v-for="(item, i) in scope.row.attr_vals" :key="i" closable @close="handleClose(i, scope.row)">{{ item }}</el-tag> <el-input class="input-new-tag" v-if="scope.row.inputVisible" v-model="scope.row.inputValue" ref="saveTagInput" size="small" @keyup.enter.native="handleInputConfirm(scope.row)" @blur="handleInputConfirm(scope.row)"></el-input> <el-button v-else class="button-new-tag" size="small" @click="showInput(scope.row)">New Tag</el-button> </template> </el-table-column> ``` 在以上代码中,通过v-for指令循环渲染标签,使用v-if和v-else指令控制输入框和按钮的显示与隐藏。在相应的事件中,可以调用相关的方法来处理用户的输入和操作。 通过以上步骤和示例代码,就可以实现element ui Tag动态添加标签功能了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [element ui Tag 动态添加标签](https://blog.csdn.net/codercjw/article/details/128652652)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [vue+element-ui表格封装tag标签使用插槽](https://download.csdn.net/download/weixin_38606404/12925481)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值