dynamicHtmlSlider.vue 4.84 KB
<template>
  <div>
    <el-button
      type="primary"
      size="small"
      icon="el-icon-plus"
      plain
      @click="handleAddClick"
    >新增</el-button
    >
    <el-table :data="formData" style="width: 100%" row-key="name">
      <el-table-column prop="name" label="大屏名称" width="170" />
      <el-table-column label="操作" width="100">
        <template slot-scope="scope">
          <div class="button-group">
            <el-button
              @click="handleEditorClick(scope.$index, scope.row)"
              type="text"
              size="small"
            >编辑</el-button
            >
            <el-button
              type="text"
              size="small"
              @click="handleDeleteClick(scope.$index, scope.row)"
            >删除</el-button
            >
          </div>
        </template>
      </el-table-column>
    </el-table>

    <el-dialog
      title="新增"
      :visible.sync="dialogVisible"
      width="30%"
      :before-close="handleClose"
    >
      <el-form :model="rowFormData" label-width="70px">
        <el-form-item label="大屏名称:">
          <el-input
            v-model.trim="rowFormData['name']"
            placeholder="请输入大屏名称"
            size="mini"
          >
          </el-input>
        </el-form-item>
        <el-form-item label="地址URL:" label-width="70px">
          <el-input
            v-model.trim="rowFormData['url']"
            placeholder="请输入地址URL"
            size="mini"
          >
          </el-input>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button size="mini" @click="dialogVisible = false">取 消</el-button>
        <el-button size="mini" type="primary" @click="handleSaveClick"
        >确 定</el-button
        >
      </span>
    </el-dialog>
  </div>
</template>
<script>
import Sortable from 'sortablejs'//引入拖拽插件
export default {
  model: {
    prop: "formData",
    event: "input"
  },
  props: {
    formData: Array
  },
  data() {
    return {
      dialogVisible: false,
      rowFormData: {
        name: "",
        url: ""
      },
      flag: true, // true 新增, false 编辑
      indexEditor: -1, // 编辑第几个数据
      tableData: []
    };
  },
  created() {
    this.$nextTick(() => {
      this.rowDrop()
    });
  },
  methods: {
    // 新增
    handleAddClick() {
      this.rowFormData = {};
      this.flag = true;
      this.dialogVisible = true;
    },
    // 编辑
    handleEditorClick(index, row) {
      this.flag = false;
      this.rowFormData = this.deepClone(row);
      this.indexEditor = index;
      this.dialogVisible = true;
    },
    // 关闭
    handleClose() {
      this.dialogVisible = false;
    },
    // 保存
    handleSaveClick() {
      if (this.flag) {
        // 新增
        this.formData.push(this.rowFormData);
        this.dialogVisible = false;
      } else {
        // 编辑
        this.formData[this.indexEditor] = this.rowFormData;
        this.$set(this.formData, this.indexEditor, this.rowFormData);
        this.dialogVisible = false;
      }
      this.$emit("input", this.formData);
      this.$emit("change", this.formData);
    },
    // 删除
    handleDeleteClick(index) {
      this.formData.splice(index, 1);
      this.$emit("input", this.formData);
      this.$emit("change", this.formData);
    },
    //行拖拽
    rowDrop () {
      // 此时找到的元素是要拖拽元素的父容器
      const tbody = document.querySelector('.el-table__body-wrapper tbody');
      const _this = this;
      Sortable.create(tbody, {
        //指定父元素下可被拖拽的子元素
        draggable: ".el-table__row",
        onEnd ({ newIndex, oldIndex }) {
          const currRow = _this.formData.splice(oldIndex, 1)[0];
          _this.formData.splice(newIndex, 0, currRow);
          //渲染父页面
          _this.$emit("input", _this.formData);
          _this.$emit("change", _this.formData);
        }
      });
    },
  }
};
</script>
<style lang="scss" scoped>
:deep(::-webkit-scrollbar-track-piece) {
  background-color: transparent;
}

:deep(.el-table__body-wrapper::-webkit-scrollbar) {
  width: 0; // 横向滚动条
  height: 8px; // 纵向滚动条 必写
}

// 滚动条的滑块
:deep(.el-table__body-wrapper::-webkit-scrollbar-thumb) {
  border-radius: 5px;
  background-color: rgba(144, 146, 152, 0.3);
}

:deep(.el-table),
:deep(.el-table__expanded-cell),
:deep(.el-table th),
:deep(.el-table tr) {
  background-color: transparent !important;
  color: #859094 !important;
  font-size: 12px !important;
}

:deep(.el-table td),
:deep(.el-table th.is-leaf) {
  border-bottom: none;
  line-height: 26px;
}

:deep(.el-table tbody tr:hover),
:deep(.el-table tbody tr:hover > td) {
  background-color: #263445 !important;
}

:deep(.el-table::before) {
  height: 0;
}

.button-group .el-button {
  padding: 0;
}
</style>