VUE3+ElementUI+Axios,从零开始的成绩增删改查表

1,129 阅读2分钟

目标需求:

利用vue3+elementUI-plus实现

image.png

接口如下:

(^▽^)

具体实现

第一步:创建项目

image.png

第二步:装需要的包


cnpm i axios 
//我们需要用axios来请求数据


第三步:请求数据

3.1准备好API

image.png


import  axios  from "axios";
axios.defaults.baseURL = " http://121.43.116.41/demo/php/";
axios.defaults.headers.post["Content-Type"] =
  "application/x-www-form-urlencoded";

//请求拦截
axios.interceptors.request.use(
  (config) => {
    // Do something before request is sent
    return config;
  },
  (error) => {
    // Do something with request error
    return Promise.reject(error);
  }
);

//响应拦截
axios.interceptors.response.use(
  (response) => {
    // Do something before response is sent
    return response.data;
  },
  (error) => {
    // Do something with response error
    return Promise.reject(error);
  }
);

export default axios;



API的写法相对固定


import axios from "../utils/request.ts"; // 引入axios 并使用定义好的配置(全局默认配置 请求拦截和响应拦截)

export const searchGradeOrderLimitAPI = (params:any) =>
  axios.get("/searchGradeOrderLimit.php", { params: params });
export const updateGradeByIdAPI = (data:any) =>
  axios.post("/updateGradeById.php", data);
export const deleteGradeByIdAPI = (params:any) =>
  axios.get("/deleteGradeById.php", { params: params });


export const addGradeAPI = (params: any) =>
  axios.get("/addGrade.php", { params: params });

3.2准备完成,获取数据

let searchParams = ref({
  wd: "",
  col: "id",
  type: "asc",
  page: 1,
  size: 10,
});



let searchGoodOrderLimit = () => {
  searchGradeOrderLimitAPI(searchParams.value)
    .then((res: any) => {
      console.log("请求成功38", res);

      list.value = res.list;
      
      //这里给每个数组项都增加了1个isEdit:false属性
      //为的是后续好写编辑按钮
      list.value.forEach((element: any) => {
        element.isEdit = false;
      });
      total.value = res.total;
      maxPage.value = res.maxPage;
      current.value = res.current;
      console.log("list", list);
    })
    .catch((err) => {
      console.log(err.message);
    });
};

3.3千辛万苦拿到数据,具体如下

image.png

第四步:渲染页面


//复制elementUI的表格功能,即可快速渲染页面。
//重点就是:将上述的list数据注入,后面根据list内部的
//id,name,chinese等多种属性,开始渲染页面


<el-table :data="list" style="width: 100%">
    //基础渲染,很好看懂
      <el-table-column prop="id" label="id" width="80" />
      <el-table-column prop="name" label="Name" width="80" />
      <el-table-column prop="class" label="class" width="80" />
      
      
      
      //下面使用了插槽,稍微复杂,看不懂可以往下看
      <el-table-column prop="chinese" label="语文" width="80">
        <template v-slot="{ row }">
          <span v-if="row.isEdit == false">{{ row.chinese }}</span>
          <el-input v-else v-model.number="row.chinese"></el-input>
        </template>
      </el-table-column>
      <el-table-column prop="math" label="数学" width="80">
        <template v-slot="{ row }">
          <span v-if="row.isEdit == false">{{ row.math }}</span>
          <el-input v-else v-model.number="row.math"></el-input>
        </template>
      </el-table-column>
      <el-table-column prop="english" label="英语" width="80">
        <template v-slot="{ row }">
          <span v-if="row.isEdit == false">{{ row.english }}</span>
          <el-input v-else v-model.number="row.english"></el-input>
        </template>
      </el-table-column>
      <el-table-column prop="" label="总分" width="80">
        <template v-slot="{ row }">
          {{ row.chinese + row.math + row.english }}
        </template>
      </el-table-column>
      <el-table-column prop="class" label="操作">
        <template v-slot="{ row }">
          <el-button type="primary" @click="editHandler(row)">{{
            row.isEdit ? "保存" : "编辑"
          }}</el-button>
          <el-button type="success" @click="deleteHandler(row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>

渲染成果如下

image.png

第⑤步:新增功能

image.png

利用element设置按钮和弹出层

<el-button text @click="dialogVisible = true"> 新增 </el-button>

<el-dialog v-model="dialogVisible" title="新增成绩" width="30%">
      <el-form ref="ruleFormRef">
        <el-form-item label="姓名" prop="name">
          <el-input v-model="addStu.name"></el-input>
        </el-form-item>

        <el-form-item label="语文" prop="chinese">
          <el-input v-model.number="addStu.ch"></el-input>
        </el-form-item>
        <el-form-item label="数学" prop="math">
          <el-input v-model.number="addStu.mh"></el-input>
        </el-form-item>
        <el-form-item label="英语" prop="english">
          <el-input v-model.number="addStu.eh"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="submitForm()">Submit</el-button>
          <el-button @click="resetForm">Reset</el-button>
        </el-form-item>
      </el-form>
    </el-dialog>

弹出层的数据和我们的参数数组addStu双向绑定

let addStu = reactive({
  name: "",
  class: "2304",
  ch: null,
  mh: null,
  eh: null,
});

最后按钮的提交函数submitForm()负责调用接口即可(一定要按照接口要求传数据,不然可能会出现奇怪的错误)

image.png

第⑥步:编辑功能

image.png

6.1步骤一:点击按钮,编辑和保存互相切换

首先是按钮的网页结构
其实很简单,利用插槽基本写法以及
我们上面添加的isEdit,来决定显示内容
 <el-table-column prop="class" label="操作">
        <template v-slot="{ row }">
          <el-button type="primary" @click="editHandler(row)">{{
            row.isEdit ? "保存" : "编辑"
          }}</el-button>
          <el-button type="success" @click="deleteHandler(row)">删除</el-button>
        </template>
      </el-table-column>
      
      
      
//其次,我们的语数外的页面结构,也应该用插槽&v-if/v-else来处理
如果if条件符合,那么就默认显示span
如果不符合,就显示v-else的input框,供我们修改

 <el-table-column prop="math" label="数学" width="80">
        <template v-slot="{ row }">
          <span v-if="row.isEdit == false">{{ row.math }}</span>
          <el-input v-else v-model.number="row.math"></el-input>
        </template>
  </el-table-column>




6.2步骤二:点击事件保存写好的数据

//isEdit默认为false
//当你点击按钮的时候,如果isEdit是true,我们就认为需要保存数据
//调用接口保存数据
//最后记得每次都要切换isEdit的值

let editHandler = (row: any) => {
  console.log(row.id);

  if (row.isEdit) {
    updateGradeByIdAPI({
      id: row.id,
      ch: row.chinese,
      mh: row.math,
      eh: row.english,
    }).then((res) => {
      console.log(res);
    });
  }
  row.isEdit = !row.isEdit;
};