点击按钮实现新增数据表格

实现点击按钮新增数据表格

需求描述:点击添加表格按钮实现表格的新增,同时提供删除按钮可删除当前表格,也可上移或下移当前表格

实现效果:

在这里插入图片描述
代码:
TaskTable组件代码

<template>
  <div class="task_table">
    <div class="task_table_title">
      {{ title.title }}
    </div>
    <div class="task_info">
      <div class="task_info_header">
        <el-select v-model="taskType" placeholder="请选择任务类型" clearable>
          <el-option
            v-for="item in taskTypeArr"
            :key="item.code"
            :label="item.value"
            :value="item.code"
          >
          </el-option>
        </el-select>
        <el-button
          type="primary"
          class="ml10"
          size="small"
          icon="el-icon-plus"
          :disabled="!taskType"
          @click="createTask(title)"
          >生成任务</el-button
        >
      </div>
      <div class="task_info_content mt10">
        <RenderTable
          :data="taskTableData"
          :options="taskOptions"
          style="width: 95%; margin-bottom: 3%"
        />
      </div>
    </div>
    <div class="item_option_delete">
      <el-button
        type="text"
        icon="el-icon-top"
        size="medium"
        class="move_btn"
        @click.stop="handelMoveTaskTable('upMove', title)"
        :disabled="title.title_id === 0"
      ></el-button>
      <el-button
        type="text"
        icon="el-icon-bottom"
        size="medium"
        class="move_btn"
        @click.stop="handelMoveTaskTable('downMove', title)"
        :disabled="title.title_id === len - 1"
      ></el-button>
      <el-button
        type="text"
        icon="el-icon-delete"
        size="medium"
        circle
        @click.stop="handelDeleteTaskTable(title)"
      ></el-button>
    </div>
  </div>
</template>

<script>
import { RenderTable } from "@/shared/index";
export default {
  name: "TaskTable",
  components: { RenderTable },
  props: {
  //表格数据
    taskTableData: {
      type: Array,
      default: () => [],
    },
    //表格配置,包含表头
    taskOptions: {
      type: Array,
      default: () => [],
    },
    //任务类型下拉框
    taskTypeArr: {
      type: Array,
      default: () => [],
    },
    //表格前面的名字,如任务1,任务2
    title: {
      type: Object,
      default: () => { },
    },
    //循环表格的数组长度,来控制最后一个表格不可下移操作
    len: {
      type: Number,
      default: () => 0,
    },
  },
  data () {
    return {
      taskType: "",
    };
  },
  watch: {
    taskTableData (newVal) {
      if (newVal) {
        this.taskTableData = newVal;
      }
    },
  },
  methods: {
    // 点击生成任务按钮
    createTask (val) {
      const row = { taskType: this.taskType, title_id: val.title_id };
      this.$emit("creatTask", row);
      this.taskType = ""
    },
    //点击删除表格
    handelDeleteTaskTable (row) {
      this.$confirm("确定要删除吗?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          //   删除任务
          this.$emit("deleteTaskTable", row);
        })
        .catch((error) => {
          return error;
        });
    },
	//对表格进行上移下移操作
    handelMoveTaskTable (type, row) {
      const param = { type: type, title_id: row.title_id };
      if (type === "upMove") {
        console.log("点击上移", row);
        this.$emit("moveTaskTable", param);
      } else {
        console.log("点击下移", row);
        this.$emit("moveTaskTable", param);
      }
    },
  },
};
</script>

<style lang="scss" scoped>
// 任务列表

.task_table {
  display: flex;
  width: 85%;
  border: 1px solid #e4e4e4;
  align-items: center;
  margin-top: 2%;
  .task_table_title {
    width: 30px;
    font-size: 14px;
    line-height: 20px;
    padding: 0 30px 0 10px;
  }
  .task_info {
    width: 99%;
    padding: 10px 10px 0 10px;
    border-right: 1px solid #e4e4e4;
    border-left: 1px solid #e4e4e4;

    .basic_top {
      line-height: 40px;
    }
  }
  .item_option_delete {
    padding: 0 5px;
    display: flex;
    flex-direction: column;
    .el-button + .el-button {
      margin-left: 0;
    }
  }
}
// ::v-deep  .move_btn .el-icon-top {
//   padding: 2px 1px 0 0;
//   border: 1px solid;
//   border-radius: 50%;
// }
</style>

branchTableArry是个数组,里面的每一个item都是循环的一个表格

<template v-if="branchTableArry.length > 0">
          <TaskTable
            v-for="(item, index) in branchTableArry"
            :key="'branch_' + index"
            :taskOptions="taskOptions"
            :taskTypeArr="taskTypeArr"
            :len="branchTableArry.length || 0"
            @deleteTaskTable="deleteTaskTable"
            @moveTaskTable="moveTaskTable"
            :title="{ title: '任务' + (index + 1), title_id: index }"
          ></TaskTable>
        </template>
        <el-button
          class="add_btn"
          icon="el-icon-plus"
          @click="createMainTask()"
          >添加表格</el-button
        >
//添加表格按钮
createMainTask(){
   // flage在data中定义默认是0,
   this.branchTableArry.push({ branchtask: "branchtask" + this.flage });
   ++this.flage;
}

//删除表格
deleteTaskTable (row) {
	//row拿到的是当前表格的信息,title_id是当前第几个表格
  console.log(this.branchTableArry);
  this.branchTableArry.splice(row.title_id - 1, 1);
},
//表格上移下移操作
moveTaskTable (row) {
  // 获取当前点击的元素数据
  const now_arr = this.branchTableArry[row.title_id];
  // 点击上移
   if (row.type === "upMove") {
        // 获取上一个元素下标和数据
         const pre_index = row.title_id - 1;
   	     const pre_data = this.branchTableArry[pre_index];
         // 交换数据
         const exchange_predata = pre_data;
      	 this.branchTableArry[pre_index] = now_arr;
         this.branchTableArry[row.title_id] = exchange_predata;
   // 点击下移
   } else if (row.type === "downMove") {
        // 获取下一个元素下标和数据
        const next_index = row.title_id + 1;
        const next_data = this.branchTableArry[next_index];
        // 交换数据
        const exchange_nextdata = next_data;
        this.branchTableArry[next_index] = now_arr;
        this.branchTableArry[row.title_id] = exchange_nextdata;
      }
    },
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是一个使用 Vue.js 和 Mock.js 实现新增、编辑和删除表格数据的示例。 首先,确保你已经安装了 Vue.js 和 Mock.js。然后,创建一个 Vue 组件,包含一个表格和相应的按钮用于新增、编辑和删除数据HTML 模板代码如下: ```html <div id="app"> <table> <thead> <tr> <th>Name</th> <th>Age</th> <th>Email</th> <th>Action</th> </tr> </thead> <tbody> <tr v-for="(item, index) in items" :key="index"> <td>{{ item.name }}</td> <td>{{ item.age }}</td> <td>{{ item.email }}</td> <td> <button @click="editItem(index)">Edit</button> <button @click="deleteItem(index)">Delete</button> </td> </tr> </tbody> </table> <form @submit.prevent="addItem" v-show="showForm"> <input type="text" v-model="formData.name" placeholder="Name"> <input type="number" v-model="formData.age" placeholder="Age"> <input type="email" v-model="formData.email" placeholder="Email"> <button type="submit">Add</button> </form> <button @click="showForm = true">Add New</button> </div> ``` JavaScript 代码如下: ```javascript // 引入 Mock.js 库 const Mock = require('mockjs'); // 使用 Mock.js 拦截 AJAX 请求并返回随机数据 Mock.mock('/api/items', 'get', { 'items|5-10': [{ 'name': '@cname', 'age|18-60': 0, 'email': '@email' }] }); // 创建 Vue 实例 new Vue({ el: '#app', data() { return { items: [], showForm: false, formData: { name: '', age: '', email: '' }, editingIndex: -1 }; }, mounted() { // 发送 AJAX 请求获取表格数据 this.fetchItems(); }, methods: { fetchItems() { // 模拟发送 AJAX 请求 axios.get('/api/items') .then(response => { this.items = response.data.items; }) .catch(error => { console.error(error); }); }, addItem() { // 模拟发送 AJAX 请求 axios.post('/api/items', this.formData) .then(() => { this.fetchItems(); this.resetForm(); }) .catch(error => { console.error(error); }); }, editItem(index) { this.editingIndex = index; this.formData = { ...this.items[index] }; this.showForm = true; }, updateItem() { // 模拟发送 AJAX 请求 axios.put(`/api/items/${this.editingIndex}`, this.formData) .then(() => { this.fetchItems(); this.resetForm(); }) .catch(error => { console.error(error); }); }, deleteItem(index) { // 模拟发送 AJAX 请求 axios.delete(`/api/items/${index}`) .then(() => { this.fetchItems(); }) .catch(error => { console.error(error); }); }, resetForm() { this.formData = { name: '', age: '', email: '' }; this.editingIndex = -1; this.showForm = false; } } }); ``` 在上述代码中,我们使用 Mock.js 来拦截 `/api/items` 的 GET 请求,并返回随机生成的数据。你可以根据需要修改这个接口的 URL 和响应数据。 注意,在实际的项目中,你需要使用真实的后端 API 来处理新增、编辑和删除数据的请求,并更新前端的表格数据。这里的代码只是一个简单的示例,使用 Mock.js 模拟这些操作。 当你运行这个示例时,你将看到一个包含表格按钮的界面。点击 "Add New" 按钮将显示一个表单,你可以在表单中输入数据点击 "Add" 按钮新增一行数据点击表格中的 "Edit" 按钮可以编辑对应行的数据点击 "Delete" 按钮可以删除对应行的数据。 请注意,示例中使用的是 Mock.js 来模拟 AJAX 请求和返回随机数据,实际项目中需要替换成真实的后端接口。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值