Element-ui directly clicks on the cell in the table to edit

Element-ui directly clicks on the cell in the table to edit

Recently, because the company started using elementUI, it is necessary to edit the cells of the table during the development process. The following is my own way to make the table editable. If you are interested, you can learn about it.

Achieve results

insert image description here

After editing, the value of the corresponding table data field will also change. The console outputs all data to view the changes

Implementation Code

1. Custom editing components

<template>
  <div class="editCell">
    <div class="canEdit" v-if="CanEdit" @click="beginEdit">
      <label v-show="!editStatus">
        <span v-if="this.value!== null && this.value !== undefined && this.value !== ''">{{ value }}{{this.suffix}}</span>
        <span v-else style="padding-left: 100%;padding-top: 100%;"/>
      </label>
      <label v-show="editStatus">
        <input
          type="text"
          class="inputClass"
          ref="input"
          v-on:keyup.13="loseFocus"
          :value="value"
          @blur="loseFocus"
        />
      </label>
    </div>

    <label class="cannotEdit" v-else>
      <span>{{ value }}{{ suffix }}</span>
    </label>
  </div>
</template>

<script>
export default {
  name: "EditCell",
  props: {
    /**
     * Binding value */
    value: {
      required: true
    },
    /**
     * Editable? */
    CanEdit:
      type: Boolean,
      default: true
    },
    /**
     * Format function */
    formatData: {
      type: Function,
      default: value => {
        return value;
      }
    },
    /**
     * Editing event */
    afterEdit: {
      type: Function,
      default: () => {}
    },
    /**
     * Whether to format initially */
    initFormat: {
      type: Boolean,
      default: false
    },
    suffix: {
      default: ""
    }
  },
  data() {
    return {
      editStatus: false,
      showData: "",
      defaultData: "",
      timeout: null
    };
  },
  methods: {
    /**
     * Click to start editing */
    beginEdit() {
      this.editStatus = true;
      setTimeout(() => {
        this.$refs.input.focus();
      }, 1);
    },

    /**
     * @param {event} event
     * Close the editing state when focus is lost and save the data*/
    loseFocus(event) {
      let value = this.formatData(event.target.value);
      this.editData(value);
      this.closeEditStatus(value);
      this.afterEdit(value);
    },

    /**
     * Publish input event to modify data * @param value
     */
    editData(value) {
      this.$emit("input", value);
    },

    /**
     * Close editing state * @param value
     */
    closeEditStatus(value) {
      this.editStatus = false;
    },
    /**
     * Initial formatting data */
    initData() {
      let newValue = this.formatData(this.value);
      this.$emit("input", newValue);
    }
  },
  mounted() {
    if (this.initFormat) {
      this.initData();
    }
  },
  watch:
    'value': function(newVal){
      this.$emit("input", this.formatData(newVal));
    }
  }
};
</script>

<style scoped>
.editCell {
  height: 100%;
  width: 100%;
}
.inputClass {
  height: 30px;
  width: 100%;
  background-color: #fff;
  border-radius: 4px;
  border: 1px solid #dcdfe6;
  color: #606266;
  display: inline-block;
  font-size: inherit;
  line-height: 30px;
  outline: 0;
  padding: 0 15px;
  transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
  overflow: visible;
  touch-action: manipulation;
  margin: 0;
}
</style>

Page call

import EditCell from "@/components/EditCell/EditCell";
components: { EditCell},

 <el-table-column
    v-for="item in tableColumn"
      :prop="item.dataIndex"
      :label="item.title"
      :width="item.width"
      :align="item.align"
      :key="item.id"
      :fixed="item.fixed"
  >
  	  //Call the custom component here (dataIndex is the field in the header data, which is equivalent to displaying the teacher name corresponding to the header teacher)
      <template slot-scope="scope">
          <span v-if="item.dataIndex !== 'batchInvest' && item.dataIndex !== 'remark'">{{scope.row[item.dataIndex]}}</span>
          // If you need to format the data, you can set: format-data="formatFun" formatFun This method can be defined in the methods of the current page <edit-cell v-else v-model="scope.row[item.dataIndex]" :can-edit="true"/>
      </template>
      <el-table-column
          v-for="item2 in item.children"
          :prop="item2.dataIndex"
          :label="item2.title"
          :width="item2.width"
          :align="item2.align"
          :key="item2.id"
          :fixed="item2.fixed"
      >
      </el-table-column>
  </el-table-column>

This is the end of this article about element-ui directly clicking on a cell to edit in a table. For more content related to element cell editing, please search for previous articles on 123WORDPRESS.COM or continue to browse the following related articles. I hope you will support 123WORDPRESS.COM in the future!

You may also be interested in:
  • Vue element-ui table embedded progress bar function implementation method
  • About the issue of line break in element-ui form or table label in vue
  • Detailed explanation of the use of element-ui component el-autocomplete
  • VUE+element-ui file upload sample code
  • Detailed explanation of the code for dynamic skinning based on element-ui

<<:  Example of adding attributes using style in html

>>:  CSS 3.0 text hover jump special effects code

Recommend

Detailed explanation of DIV+CSS naming rules can help achieve SEO optimization

1. CSS file naming conventions Suggestion: Use le...

How to maintain MySQL indexes and data tables

Table of contents Find and fix table conflicts Up...

Detailed process analysis of docker deployment of snail cinema system

Environmental Statement Host OS: Cetnos7.9 Minimu...

Detailed explanation of Nginx version smooth upgrade solution

Table of contents background: Nginx smooth upgrad...

MySQL index for beginners

Preface Since the most important data structure i...

Detailed tutorial on installing MySQL 8.0.19 in zip version on win10

Table of contents 1. After downloading, unzip it ...

Some CSS questions you may be asked during an interview

This article is just to commemorate those CSS que...

Solve the compatibility issue between MySQL 8.0 driver and Alibaba Druid version

This article mainly introduces the solution to th...

Detailed explanation of nginx installation, deployment and usage on Linux

Table of contents 1. Download 2. Deployment 3. Ng...

Detailed tutorial on installing mysql on centos 6.9

1. Confirm whether MySQL has been installed. You ...

React encapsulates the global bullet box method

This article example shares the specific code of ...