利用 Vue 和 element 的实现table增、删、改表格数据的模糊匹配搜索

表格的删除

HTML代码

 <el-table-column label="操作" align="center">
        <template slot-scope="scope">
          <el-button
            size="mini"
            @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
          <el-button
            size="mini"
            type="danger"
            @click="handleDelete(scope.$index, scope.row)">删除</el-button>
        </template>
      </el-table-column>

处理函数

/*表格删除功能*/
      handleDelete:function(index, row) {
        this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.tableData.splice(index, 1)
          this.$message({
            type: 'success',
            message: '删除成功!',
          })
        }).catch(err => {
          this.$message({
            type: 'error',
            message: err
          })
        })
      },

表格的编辑

HTML代码

HTML代码和上面的删除一样,只是编辑功能在删除的基础上需要添加编辑的对话框,下面是对话框代码


>     <el-dialog
>       title="编辑"
>       :visible.sync="editFormVisible"//控制编辑窗口显示
>     >
>       <el-form
>         :model="editForm"
>         ref="editForm"
>       >
>         <el-form-item
>           label="姓名"
>           :label-width="formLabelWidth"
>         >
>           <el-input
>             v-model="editForm.name"
>             autocomplete="off"
>           ></el-input>
>         </el-form-item>
>         <el-form-item
>           label="生日"
>           :label-width="formLabelWidth"
>         >
>           <el-date-picker
>             v-model="editForm.date"
>             type="date"
>             placeholder="选择日期"
>             format="MM 月 dd 日"
>             value-format="MM-dd"
>           >
>           </el-date-picker>
>         </el-form-item>
>         <el-form-item
>           label="地址"
>           :label-width="formLabelWidth"
>         >
>           <el-input
>             type="textarea"
>             v-model="editForm.address"
>             autocomplete="off"
>           ></el-input>
>         </el-form-item>
>       </el-form>
>       <div>
>         <el-button @click="cancel()">取消</el-button>
>         <el-button
>           type="primary"
>           v-on:click="sumbitEditRow()"
>           :loading="addLoading"
>         >确定</el-button>
>       </div>
> 
>     </el-dialog>

处理函数

 //编辑数据
      handleEdit(index, row) {
        this.editFormVisible = true;
        this.editForm = Object.assign({}, row);
        _index = index;//将编辑行数传给全局变量
      },
      //保存编辑
      sumbitEditRow() {
        var editData = _index;
        this.tableData[editData].name = this.editForm.name;
        this.tableData[editData].date = this.editForm.date;
        this.tableData[editData].address = this.editForm.address;
        this.editFormVisible = false;
      },
  • 注意要将编辑数据的序列号,传给全局变量
  • Object.assign() 第一个参数是目标对象,后面的都是源对象。 Object.assign (target, source1,source2, source3, …);如果想详细了解他的用法,请参考Object.assign

表格的新增

HTML代码

<el-col :span="17">
      <div class="table-grid-content">
        <el-button class="add"
                   type="primary"
                   @click="addRow()"
        >新增</el-button>
      </div>
    </el-col>
    
<!-- 新增窗口 -->
<el-dialog
  title="新增"
  :visible.sync="addFormVisible"
>
  <el-form
    :model="addForm"
    ref="addForm"
  >
    <el-form-item
      label="姓名"
      :label-width="formLabelWidth"
    >
      <el-input
        v-model="addForm.name"
        autocomplete="off"
      ></el-input>
    </el-form-item>
    <el-form-item
      label="日期"
      :label-width="formLabelWidth"
    >
      <el-date-picker
        v-model="addForm.date"
        type="date"
        placeholder="选择日期"
        format="MM 月 dd 日"
        value-format="MM-dd"
      >
      </el-date-picker>
    </el-form-item>
    <el-form-item
      label="地址"
      :label-width="formLabelWidth"
    >
      <el-input
        type="textarea"
        v-model="addForm.address"
        autocomplete="off"
      ></el-input>
    </el-form-item>
  </el-form>
  <div>
    <el-button @click="cancel()">取消</el-button>
    <el-button
      type="primary"
      @click="sumbitAddRow()"
      :loading="addLoading"
    >确定</el-button>
  </div>

</el-dialog>

处理函数

 //新增数据
  addRow:function() {
    this.addFormVisible = true;
    this.addForm = {
      name: '',
      date: '',
      address: ''
    }
  },
  //将新增的数据添加到表格中
  sumbitAddRow: function () {
    this.tableData = this.tableData || []
    this.tableData.push({
      name: this.addForm.name,
      date: this.addForm.date,
      address: this.addForm.address,
    })
    this.addFormVisible = false
  },
  cancel: function () {
    this.addFormVisible = false;
    this.editFormVisible = false;
  },

表格的模糊查询

HTML代码

 <!--搜索栏-->
    <div class="search-wrap">
      <el-row>
        <el-col :span="1" class="grid label-search">
          <el-span type="success" icon="el-icon-search">搜索:</el-span>
        </el-col>
        <el-col :span="6" class="grid">
          <el-input v-model="search" placeholder="请输入内容"></el-input>
        </el-col>
        <el-col :span="17">
          <div class="table-grid-content">
            <el-button class="add"
                       type="primary"
                       @click="addRow()"
            >新增</el-button>
          </div>
        </el-col>
      </el-row>
    </div>

处理函数

  computed: {
      // 模糊搜索
      tables () {
        const search = this.search
        if (search) {
          // filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
          // 注意: filter() 不会对空数组进行检测。
          // 注意: filter() 不会改变原始数组。
          return this.tableData.filter(data => {
            // some() 方法用于检测数组中的元素是否满足指定条件;
            // some() 方法会依次执行数组的每个元素:
            // 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测;
            // 如果没有满足条件的元素,则返回false。
            // 注意: some() 不会对空数组进行检测。
            // 注意: some() 不会改变原始数组。
            return Object.keys(data).some(key => {
              // indexOf() 返回某个指定的字符在某个字符串中首次出现的位置,如果没有找到就返回-1;
              // 该方法对大小写敏感!所以之前需要toLowerCase()方法将所有查询到内容变为小写。
              return String(data[key]).toLowerCase().indexOf(search) > -1
            })
          })
        }
        return this.tableData
      }
    },

注意这里的代码不能放在方法函数里,这是一个计算属性

整个代码

<template>
  <div class="dormitory">
    <!--搜索栏-->
    <div class="search-wrap">
      <el-row>
        <el-col :span="1" class="grid label-search">
          <el-span type="success" icon="el-icon-search">搜索:</el-span>
        </el-col>
        <el-col :span="6" class="grid">
          <el-input v-model="search" placeholder="请输入内容"></el-input>
        </el-col>
        <el-col :span="17">
          <div class="table-grid-content">
            <el-button class="add"
                       type="primary"
                       @click="addRow()"
            >新增</el-button>
          </div>
        </el-col>
      </el-row>
    </div>
    <!--表格-->
    <el-table
      :data="tables"
      ref="tableData"
      style="width: 100%"
      :row-class-name="tableRowClassName"  border>
      <el-table-column
        type="index"
        align="center"
        label="序号"
        width="180">
      </el-table-column>
      <el-table-column
        align="center"
        prop="date"
        label="日期"
        width="180">
      </el-table-column>
      <el-table-column
        align="center"
        prop="name"
        label="姓名"
        width="180">
      </el-table-column>
      <el-table-column
        align="center"
        prop="address"
        label="地址">
      </el-table-column>
      <el-table-column label="操作" align="center">
        <template slot-scope="scope">
          <el-button
            size="mini"
            @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
          <el-button
            size="mini"
            type="danger"
            @click="handleDelete(scope.$index, scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 新增窗口 -->
    <el-dialog
      title="新增"
      :visible.sync="addFormVisible"
    >
      <el-form
        :model="addForm"
        ref="addForm"
      >
        <el-form-item
          label="姓名"
          :label-width="formLabelWidth"
        >
          <el-input
            v-model="addForm.name"
            autocomplete="off"
          ></el-input>
        </el-form-item>
        <el-form-item
          label="日期"
          :label-width="formLabelWidth"
        >
          <el-date-picker
            v-model="addForm.date"
            type="date"
            placeholder="选择日期"
            format="MM 月 dd 日"
            value-format="MM-dd"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item
          label="地址"
          :label-width="formLabelWidth"
        >
          <el-input
            type="textarea"
            v-model="addForm.address"
            autocomplete="off"
          ></el-input>
        </el-form-item>
      </el-form>
      <div>
        <el-button @click="cancel()">取消</el-button>
        <el-button
          type="primary"
          @click="sumbitAddRow()"
          :loading="addLoading"
        >确定</el-button>
      </div>

    </el-dialog>
    <!-- 编辑窗口 -->
    <el-dialog
      title="编辑"
      :visible.sync="editFormVisible"
    >
      <el-form
        :model="editForm"
        ref="editForm"
      >
        <el-form-item
          label="姓名"
          :label-width="formLabelWidth"
        >
          <el-input
            v-model="editForm.name"
            autocomplete="off"
          ></el-input>
        </el-form-item>
        <el-form-item
          label="生日"
          :label-width="formLabelWidth"
        >
          <el-date-picker
            v-model="editForm.date"
            type="date"
            placeholder="选择日期"
            format="MM 月 dd 日"
            value-format="MM-dd"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item
          label="地址"
          :label-width="formLabelWidth"
        >
          <el-input
            type="textarea"
            v-model="editForm.address"
            autocomplete="off"
          ></el-input>
        </el-form-item>
      </el-form>
      <div>
        <el-button @click="cancel()">取消</el-button>
        <el-button
          type="primary"
          v-on:click="sumbitEditRow()"
          :loading="addLoading"
        >确定</el-button>
      </div>

    </el-dialog>
  </div>


</template>
<style>
  .el-table .warning-row {
    background: oldlace;
  }

  .el-table .success-row {
    background: #f0f9eb;
  }

  .add{
    float: right;
  }
  .search-wrap{
    margin: 10px 40px;
  }
  .label-search{
    margin-top: 7px;
  }
</style>

<script>
  var _index;//定义全局变量
  export default {
    data() {
      return {
        tableData: [{
          date: '2016-05-02',
          name: '王小虎1',
          address: '上海市普陀区金沙江路 1518 ',
        }, {
          date: '2016-05-04',
          name: '王小虎2',
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-01',
          name: '王小虎3',
          address: '上海市普陀区金沙江路 1518 弄',
        }, {
          date: '2016-05-03',
          name: '王小虎4',
          address: '上海市普陀区金沙江路 1518 弄'
        }],
        formLabelWidth: '120px',
        addFormVisible: false,//是否显示新增窗口
        name:"tableList",
        addForm: [],
        addLoading: false,
        editFormVisible: false,//是否显示编辑窗口
        editForm: [],
        search: '',
      }
    },
    computed: {
      // 模糊搜索
      tables () {
        const search = this.search
        if (search) {
          // filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
          // 注意: filter() 不会对空数组进行检测。
          // 注意: filter() 不会改变原始数组。
          return this.tableData.filter(data => {
            // some() 方法用于检测数组中的元素是否满足指定条件;
            // some() 方法会依次执行数组的每个元素:
            // 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测;
            // 如果没有满足条件的元素,则返回false。
            // 注意: some() 不会对空数组进行检测。
            // 注意: some() 不会改变原始数组。
            return Object.keys(data).some(key => {
              // indexOf() 返回某个指定的字符在某个字符串中首次出现的位置,如果没有找到就返回-1;
              // 该方法对大小写敏感!所以之前需要toLowerCase()方法将所有查询到内容变为小写。
              return String(data[key]).toLowerCase().indexOf(search) > -1
            })
          })
        }
        return this.tableData
      }
    },
    methods: {
      tableRowClassName:function({row, rowIndex}) {
        if (rowIndex === 1) {
          return 'warning-row';
        } else if (rowIndex === 3) {
          return 'success-row';
        }
        return '';
      },
      handleEdit:function(index, row) {
        console.log(index, row);
      },
      /*表格删除功能*/
      handleDelete:function(index, row) {
        this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.tableData.splice(index, 1)
          this.$message({
            type: 'success',
            message: '删除成功!',
          })
        }).catch(err => {
          this.$message({
            type: 'error',
            message: err
          })
        })
      },
      //新增数据
      addRow:function() {
        this.addFormVisible = true;
        this.addForm = {
          name: '',
          date: '',
          address: ''
        }
      },
      //将新增的数据添加到表格中
      sumbitAddRow: function () {
        this.tableData = this.tableData || []
        this.tableData.push({
          name: this.addForm.name,
          date: this.addForm.date,
          address: this.addForm.address,
        })
        this.addFormVisible = false
      },
      cancel: function () {
        this.addFormVisible = false;
        this.editFormVisible = false;
      },
      //编辑数据
      handleEdit(index, row) {
        this.editFormVisible = true;
        this.editForm = Object.assign({}, row);
        _index = index;
      },
      //保存编辑
      sumbitEditRow() {
        var editData = _index;
        this.tableData[editData].name = this.editForm.name;
        this.tableData[editData].date = this.editForm.date;
        this.tableData[editData].address = this.editForm.address;
        this.editFormVisible = false;
      },
    }
  }
</script>
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值