Vue table表格模板

本文详细介绍如何使用Element UI框架实现数据表格的增删改查功能,包括分页、筛选和批量操作,提供了完整的代码示例和API封装教程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

el-标签总结:https://blog.youkuaiyun.com/Tom__cy/article/details/89680067
el-pagination 封装: https://blog.youkuaiyun.com/Tom__cy/article/details/89926274
axios 封装请求数据:https://blog.youkuaiyun.com/Tom__cy/article/details/89918964

可以直接复制源码上手使用—数据的增删改查!
在这里插入图片描述

<template>
  <div>
    <!-- 把整体看作一个table -->
    <el-col class="el-col">
      <!-- 头部区域 -->
      <div class="colhead">
        <el-tag>信息报表</el-tag>
        <!-- <svg-icon icon-class="mark" style="margin-left:10px; "></svg-icon> -->
        <el-input placeholder="搜索图表" style="width:100px;display:inline-block;margin-left:200px;"></el-input>
      </div>

      <el-main>
        <el-input v-model="select_word" placeholder="姓名" style="display:inline-block;width:150px;"></el-input>
        <el-button type="primary" style="margin-left:10px;" @click="baonewAdd">新增</el-button>
        <el-button type="warning" @click="baodeleteAll">批量删除</el-button>
      </el-main>
      <el-table
        border
        ref="multipleTable"
        tooltip-effect="dark"
        @select="select"
        @select-all="select"
        :data="data.slice((currentPage-1)*pagesize,currentPage*pagesize)"
      >
        <el-table-column type="selection"></el-table-column>
        <el-table-column prop="name" label="姓名" width="100%"></el-table-column>
        <el-table-column prop="date" label="时间"></el-table-column>
        <el-table-column prop="address" label="地址"></el-table-column>
        <el-table-column label="操作">
          <template slot-scope="scope">
            <el-button
              @click="handleClick(scope.$index,scope.row)"
              icon="el-icon-bottom"
              type="text"
              size="small"
            >查看</el-button>
            <el-button
              @click="handleEdit(scope.$index, scope.row)"
              icon="el-icon-edit"
              type="text"
              size="small"
            >编辑</el-button>
            <el-button
              @click="handleDelete(scope.$index, scope.row)"
              icon="el-icon-circle-close"
              type="text"
              size="small"
            >删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <!-- </el-container> -->
      <el-footer style="margin-top:20px;">
        <template>
          <div class="block">
            <el-pagination
              @size-change="handleSizeChange"
              @current-change="handleCurrentChange"
              :current-page="currentPage"
              :page-sizes="[5, 10, 20, 40]"
              :page-size="pagesize"
              layout="total, sizes, prev, pager, next, jumper"
              :total="data.length"
            ></el-pagination>
          </div>
        </template>
      </el-footer>
    </el-col>

    <!-- ----查看个人信息---- -->
    <el-dialog title="查看个人信息" :visible.sync="bao1look">
      <el-form :model="LookInfo">
        <el-form-item label="姓名">
          <el-input style="display:inline-block;width:33%;" v-model="LookInfo.name"></el-input>
        </el-form-item>
        <el-form-item label="时间">
          <el-date-picker type="date" value-format="yyyy-MM-dd" v-model="LookInfo.date"></el-date-picker>
        </el-form-item>
        <el-form-item label="地址">
          <el-input style="display:inline-block;width:80%;" v-model="LookInfo.address"></el-input>
        </el-form-item>
      </el-form>
    </el-dialog>
    <!-- 修改个人信息 -->
    <el-dialog title="修改个人信息" :visible.sync="bao1edit">
      <el-form :model="EditInfo" ref="EditInfo">
        <el-form-item label="姓名">
          <el-input style="display:inline-block;width:33%;" v-model="EditInfo.name"></el-input>
        </el-form-item>
        <el-form-item label="时间">
          <el-date-picker type="date" value-format="yyyy-MM-dd" v-model="EditInfo.date"></el-date-picker>
        </el-form-item>
        <el-form-item label="地址">
          <el-input style="display:inline-block;width:80%;" v-model="EditInfo.address"></el-input>
        </el-form-item>
      </el-form>
      <!-- 按钮确定和取消 -->
      <span slot="footer">
        <el-button type="primary" @click.native="bao1editSure">确定</el-button>
        <el-button @click.native="bao1edit = false">取消</el-button>
      </span>
    </el-dialog>
    <!-- 删除确定按钮 -->
    <el-dialog title="是否删除个人信息" :visible.sync="bao1detele">
      <!-- 按钮确定和取消 -->
      <span slot="footer">
        <el-button type="primary" @click.native="bao1DeteleSure">确定</el-button>
        <el-button @click.native="bao1detele = false">取消</el-button>
      </span>
    </el-dialog>

    <!-- ----新增个人信息---- -->
    <el-dialog title="新增个人信息" :visible.sync="bao1newadd">
      <el-form :model="AddInfo" ref="AddInfo">
        <el-form-item label="姓名">
          <el-input style="display:inline-block;width:33%;" v-model="AddInfo.name"></el-input>
        </el-form-item>
        <el-form-item label="时间">
          <el-date-picker value-format="yyyy-MM-dd" type="date" v-model="AddInfo.date"></el-date-picker>
        </el-form-item>
        <el-form-item label="地址">
          <el-input style="display:inline-block;width:80%;" v-model="AddInfo.address"></el-input>
        </el-form-item>
      </el-form>
      <!-- 按钮确定和取消 -->
      <span slot="footer">
        <el-button type="primary" @click.native="bao1AddSure">确定</el-button>
        <el-button @click.native="bao1newadd = false">取消</el-button>
      </span>
    </el-dialog>
  </div>
</template>



<script>
export default {
  data() {
    return {
      biaoData: [],
      currentPage: 1,
      pagesize: 10,
      bao1look: false,
      bao1edit: false,
      bao1detele: false,
      bao1newadd: false,
      idx: null,
      deleteAll: [],
      del_list: [],
      //   通过姓名查询
      select_word: "",
      //   定义初始个人信息
      LookInfo: {
        name: "",
        date: "",
        address: ""
      },
      EditInfo: {
        name: "",
        date: "",
        address: ""
      },
      AddInfo: {
        name: "",
        date: "",
        address: ""
      }
    };
  },
  mounted() {
    this.getbiaoData();
  },
  methods: {
    //   得到所有的数据---------------
    getbiaoData() {
      this.$fetch("/biao1", {}).then(respone => {
        this.biaoData = respone.data.projects;
      });
    },
    // 分页------------------------
    // 初始页currentPage、初始每页数据数pagesize和数据data
    handleSizeChange: function(size) {
      this.pagesize = size;
    },
    handleCurrentChange: function(currentPage) {
      this.currentPage = currentPage;
    },
    // 操作界面 ----------- 查看
    // 当点击查看时,让dialog显示,同时赋值数据
    handleClick(index, row) {
      this.bao1look = true;
      this.LookInfo = {
        name: row.name,
        date: row.date,
        address: row.address
      };
    },
    // 操作界面 ----------- 编辑-----通过改变数据并且驱动视图更新$set方法
    handleEdit(index, row) {
      this.idx = index;
      this.bao1edit = true;
      this.EditInfo = {
        name: row.name,
        date: row.date,
        address: row.address
      };
    },
    // 操作界面 ----------- 编辑 -------确定按钮
    bao1editSure() {
      this.$set(this.data, this.idx, this.EditInfo);
      this.bao1edit = false;
      this.$message.success("修改成功");
    },
    // 操作界面 ----------- 删除 -------
    handleDelete(index, row) {
      this.bao1detele = true;
      this.idx = index;
    },
    // 操作界面 ----------- 删除 -------确定按钮
    bao1DeteleSure() {
      this.data.splice(this.idx, 1);
      this.bao1detele = false;
      this.$message.warning("删除成功");
    },
    // 新增按钮-----
    baonewAdd() {
      this.bao1newadd = true;
    },
    // 新增按钮----- 新增 ----确定按钮
    bao1AddSure() {
      //this.$refs.AddInfo 这个数据上有一个validate方法,这个方法可以判断数据是否存在
      this.$refs.AddInfo.validate(valid => {
        if (valid) {
          // 删除尾部数据,并且在头部添加
          this.data.pop();
          this.data.unshift(this.AddInfo);
          this.bao1newadd = false;
          this.$message.success("新增用户成功");
        }
      });
    },
    // 当用户手动勾选数据行的 Checkbox 时触发的事件, 将所有的勾选的数据集中到一个数组中
    select(selection, row) {
      this.deleteAll = selection;
    },
    // 批量删除-----all
    baodeleteAll() {
      // console.log(this.deleteAll);
      if (this.deleteAll.length) {
        this.del_list = this.del_list.concat(this.deleteAll);
        this.deleteAll = [];
        this.$message.success("删除成功");
      } else {
        this.$message.warning("请选择删除目标");
      }
    }
  },
  computed: {
    data() {
      return this.biaoData.filter(item => {
        // return item;
        let is_del = false;
        for (let i = 0; i < this.del_list.length; i++) {
          if (item.name === this.del_list[i].name) {
            is_del = true;
            break;
          }
        }
        if (!is_del) {
          if (
            item.name.indexOf(this.select_word) > -1 ||
            item.address.indexOf(this.select_word) > -1
          ) {
            return item;
          }
        }
      });
    }
  }
};
</script>


<style scoped>
  .colhead {
    padding-bottom: 10px;
    border-bottom: 1px solid #ccc;
}
</style>

请求数据的封装:API.js

import axios from 'axios';

axios.defaults.timeout = 5000;
axios.defaults.baseURL ='https://www.easy-mock.com/mock/5cbd90c278a48d0396a92f28/yunwei_test';

//http request 拦截器
axios.interceptors.request.use(
  config => {
    // const token = getCookie('名称');注意使用的时候需要引入cookie方法,推荐js-cookie
    config.data = JSON.stringify(config.data);
    config.headers = {
      'Content-Type':'application/x-www-form-urlencoded'
    }
    // if(token){
    //   config.params = {'token':token}
    // }
    return config;
  },
  error => {
    return Promise.reject(err);
  }
);


//http response 拦截器
axios.interceptors.response.use(
  response => {
    if(response.data.errCode ==2){
      router.push({
        path:"/login",
        querry:{redirect:router.currentRoute.fullPath}//从哪个页面跳转
      })
    }
    return response;
  },
  error => {
    return Promise.reject(error)
  }
)


/**
 * 封装get方法
 * @param url
 * @param data
 * @returns {Promise}
 */

export function fetch(url,params={}){
  return new Promise((resolve,reject) => {
    axios.get(url,{
      params:params
    })
    .then(response => {
      resolve(response.data);
    })
    .catch(err => {
      reject(err)
    })
  })
}


/**
 * 封装post请求
 * @param url
 * @param data
 * @returns {Promise}
 */

 export function post(url,data = {}){
   return new Promise((resolve,reject) => {
     axios.post(url,data)
          .then(response => {
            resolve(response.data);
          },err => {
            reject(err)
          })
   })
 }

 /**
 * 封装patch请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function patch(url,data = {}){
  return new Promise((resolve,reject) => {
    axios.patch(url,data)
         .then(response => {
           resolve(response.data);
         },err => {
           reject(err)
         })
  })
}

 /**
 * 封装put请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export function put(url,data = {}){
  return new Promise((resolve,reject) => {
    axios.put(url,data)
         .then(response => {
           resolve(response.data);
         },err => {
           reject(err)
         })
  })
}

main.js中调用

import {
  post,
  fetch,
  patch,
  put
} from './api/api'
//定义全局变量
Vue.prototype.$post = post;
Vue.prototype.$fetch = fetch;
Vue.prototype.$patch = patch;
Vue.prototype.$put = put;
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值