vue+elementui 实现表格上移、下移和移除功能

需求:有时我们会面对类似这样的表格

 图中的上移,下移功能需求明显要求我们改变两行数据的顺序。在实际开发中这种功能一般由后台来做,因为列表数据一般从后台获取刷新。即是我们点击”上移“,向后台请求接口,后台将数据库表格中的项交换位置,再把新的数据返回,前端拿到数据,重新刷新表格数据。

在此这篇博文仅设计到前端的数据处理及展示效果。因为我在开发过程中遇到了类似的需求,上移、下移功能不局限于表格,它也能是一个循环展示模块中的内容。

核心的JavaScript方法是:splice 对数组处理方法,删除或插入内容

  • 第一个参数是目标位置
  • 第二个参数是从目标位置开始删除的元素个数,0代表不删除元素
  • 第三个参数是选择插入的内容,插入位置自然是第一个参数
  • 前两个参数必选,第三个参数可选

代码例子

<template>
  <el-table :data="tableData" border style="width: 58%">
    <el-table-column fixed prop="date" label="日期" width="150"></el-table-column>
    <el-table-column prop="name" label="姓名" width="120"></el-table-column>
    <el-table-column prop="province" label="省份" width="120"></el-table-column>
    <el-table-column prop="city" label="市区" width="120"></el-table-column>
    <el-table-column prop="address" label="地址" width="300"></el-table-column>
    <el-table-column prop="zip" label="邮编" width="120"></el-table-column>
    <el-table-column fixed="right" label="操作" width="150">
      <template slot-scope="scope">
        <el-button
          type="text"
          size="small"
          @click="moveUp(scope.row, scope.$index)"
          :disabled="scope.$index === 0"
        >上移</el-button>
        <!-- 这里分别展示了判断是否上移下移的两种方案 -->
        <el-button
          type="text"
          size="small"
          @click="moveDown(scope.row, scope.$index)"
          :disabled="getFormLength(scope.$index)"
        >下移</el-button>
        <el-button type="text" size="small" @click="deleteItem(scope.$index)">移除</el-button>
      </template>
    </el-table-column>
  </el-table>
</template>

<script>
export default {
  name: "splice",

  data() {
    return {
      disabled: true,
      tableData: [
        {
          date: "2016-05-02",
          name: "王小虎",
          province: "上海",
          city: "普陀区",
          address: "上海市普陀区金沙江路 1518 弄",
          zip: 200333,
        },
        {
          date: "2016-05-04",
          name: "张小龙",
          province: "深圳",
          city: "福田区",
          address: "车公庙",
          zip: 200333,
        },
        {
          date: "2016-05-01",
          name: "李牧",
          province: "江南",
          city: "鑫林",
          address: "南山区",
          zip: 200333,
        },
        {
          date: "2016-05-03",
          name: "哪吒",
          province: "普拉达",
          city: "纽约",
          address: "国家公园",
          zip: 200333,
        },
      ],
    };
  },

  methods: {
    // 上移
    moveUp(item, index) {
      this.tableData.splice(index - 1, 0, item);  // 定位到点击位置的上一行,0即不删除如何元素,在此位置插入item
      this.tableData.splice(index + 1, 1); // 此时数组中有重复元素,把原来被挤下去的元素删除
    },
    // 下移
    moveDown(item, index) {
      this.tableData.splice(index + 2, 0, item);
      this.tableData.splice(index, 1);
    },
    // 添加
    // addItem() {
    //   let item = {
    //     date: "",
    //     name: "",
    //     province: "",
    //     city: "",
    //     address: "",
    //     zip: "",
    //   };
    //   this.tableData.push(item);
    // },
    // 删除
    deleteItem(index) {
      console.log("delete");
      this.tableData.splice(index, 1);
    },
    // 控制下移按钮的显示于隐藏
    getFormLength(index) {
      if (index === this.tableData.length - 1) return true;
      else return false;
    },
  },
};
</script>

<style lang="scss" scoped>
</style>

例子的基础是elementui中表格的例子,添加了自定义的上移、下移和移除方法,做得完善一些,自然要处理隐藏掉第一行的上移按钮和最后一行的下移按钮,并提供相关的判别方法

  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,我们需要安装 `vue` 和 `element-ui`。 ```bash npm install vue element-ui --save ``` 然后,我们在 `main.js` 文件中引入并使用它们: ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import App from './App.vue' Vue.use(ElementUI) new Vue({ el: '#app', render: h => h(App) }) ``` 接下来,我们在 `App.vue` 文件中实现表格的增删改查功能。 ```vue <template> <div> <el-input v-model="searchText" placeholder="请输入搜索关键字"></el-input> <el-button type="primary" @click="handleAdd">添加</el-button> <el-table :data="tableData" style="width: 100%"> <el-table-column label="姓名" prop="name"></el-table-column> <el-table-column label="年龄" prop="age"></el-table-column> <el-table-column label="操作"> <template slot-scope="scope"> <el-button type="text" @click="handleEdit(scope.$index, scope.row)">编辑</el-button> <el-button type="text" @click="handleDelete(scope.$index)">删除</el-button> </template> </el-table-column> </el-table> <el-dialog :visible.sync="dialogVisible" title="添加/编辑"> <el-form :model="form" :rules="rules" ref="form"> <el-form-item label="姓名" prop="name"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item label="年龄" prop="age"> <el-input v-model.number="form.age"></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">取消</el-button> <el-button type="primary" @click="handleSubmit">确定</el-button> </div> </el-dialog> </div> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 18 }, { name: '李四', age: 20 }, { name: '王五', age: 22 }, ], searchText: '', dialogVisible: false, form: { name: '', age: 0, }, rules: { name: [{ required: true, message: '请输入姓名', trigger: 'blur' }], age: [{ required: true, message: '请输入年龄', trigger: 'blur' }], }, editIndex: -1, } }, methods: { handleAdd() { this.form.name = '' this.form.age = 0 this.dialogVisible = true this.editIndex = -1 }, handleEdit(index, row) { this.form.name = row.name this.form.age = row.age this.dialogVisible = true this.editIndex = index }, handleSubmit() { this.$refs.form.validate(valid => { if (valid) { if (this.editIndex === -1) { this.tableData.push({ name: this.form.name, age: this.form.age }) } else { this.tableData.splice(this.editIndex, 1, { name: this.form.name, age: this.form.age }) } this.dialogVisible = false } }) }, handleDelete(index) { this.tableData.splice(index, 1) }, }, computed: { filteredData() { return this.tableData.filter(item => item.name.indexOf(this.searchText) !== -1) }, }, } </script> ``` 在上面的代码中,我们使用了 `el-table` 组件来展示数据,并用 `el-table-column` 组件来定义表格列。`el-dialog` 组件用于添加和编辑数据。我们用 `el-input` 组件来实现输入框,用 `el-button` 组件来实现按钮。 表格数据使用了 `tableData` 数组来存储,可以通过 `filteredData` 计算属性来实现搜索过滤。 添加和编辑数据时,我们使用了表单验证和表单重置。可以通过 `el-form` 组件来实现表单验证,用 `el-form-item` 组件来定义表单项。用 `ref` 属性来引用表单实例,用 `$refs` 来获取表单实例。 最后,我们可以通过 `handleAdd`、`handleEdit`、`handleSubmit` 和 `handleDelete` 方法来实现增删改功能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值