table表格与model框结合实现数据的增加和修改

需求:
1.进入页面加载table表格数据
2.点击编辑按钮,弹出编辑内容的model框;model框的内容要与table选中行的内容一致,作出修改后,table的内容要相应变化
3.点击增加按钮,弹出增加内容的model框
4.点击作废按钮,删除当前整行内容
html部分代码如下:

<template>
  <keep-alive>
    <router-view v-if="$route.meta.subPage" />
    <a-row :gutter="[16, 16]">
      <a-col :span="24">
        <a-card title="结果" :bordered="false">
          <div slot="extra">
            <a-button type="primary" ghost icon="plus" class="margin-right10" @click="addNew">新增</a-button>
          </div>
          <a-table :row-selection="rowSelection" :columns="columns" :data-source="data">
            <div slot="operator" slot-scope="text">{{ text.content1 }}</div>
            <div slot="billNo" slot-scope="text">{{ text.content2 }}</div>
            <div slot="containerType" slot-scope="text">{{ text.content3 }}</div>
            <div slot="reason" slot-scope="text">{{ text.content4 }}</div>
            <div slot="startTime" slot-scope="text">{{ text.content5 }}</div>
            <div slot="endTime" slot-scope="text">{{ text.content6 }}</div>
            <div slot="creater" slot-scope="text">{{ text.content7 }}</div>
            <div slot="state" slot-scope="text">{{ text.content8 }}</div>
            <div slot="action" slot-scope="text, record, index">
              <a @click="reviseRecord(record, index)" class="margin-right15">修改</a>
              <a @click="delRecord(record, index)" class="color-error">作废</a>
            </div>
          </a-table>
          <!-----model框------>
          <a-modal v-model="visible" title="提单拒发编辑" ok-text="保存" @ok="handleOk"  @cancel="handleCancel">
            <a-form-model
              ref="ruleFormModel"
              :model="formModel"
              :rules="rules"
              :label-col="labelCol"
              :wrapper-col="wrapperCol"
              style="width:95%;"
            >
              <a-form-model-item label="箱经营人" prop="modelOperator">
                <a-select v-model="formModel.modelOperator" placeholder="请选择箱经营人">
                  <a-select-option v-for="item in chargeOperatorList" :key="item.value" :value="item.value">
                    {{ item.name }}
                  </a-select-option>
                </a-select>
              </a-form-model-item>
              <a-form-model-item label="箱型箱类" prop="modelType">
                <a-select v-model="formModel.modelType" placeholder="请选择箱型箱类">
                  <a-select-option v-for="item in chargemodelType" :key="item.value" :value="item.value">
                    {{ item.name }}
                  </a-select-option>
                </a-select>
              </a-form-model-item>
              <a-form-model-item label="提单号" prop="modelBillNo">
                <a-input v-model="formModel.modelBillNo" placeholder="请输入提单号" />
              </a-form-model-item>
              <a-form-model-item label="开始时间" prop="modelStartTime">
                <a-date-picker
                  v-model="formModel.modelStartTime"
                  format="YYYY-MM-DD"
                  placeholder="请选择开始时间"
                  valueFormat="YYYY-MM-DD"
                  style="width:100%;"
                />
              </a-form-model-item>
              <a-form-model-item label="结束时间" prop="modelEndTime">
                <a-date-picker
                  v-model="formModel.modelEndTime"
                  format="YYYY-MM-DD"
                  valueFormat="YYYY-MM-DD"
                  :allowClear="false"
                  placeholder="请选择结束时间"
                  style="width:100%;"
                />
              </a-form-model-item>
              <a-form-model-item label="创建人">
                <a-input v-model="formModel.ModelAuthor" disabled="disabled" />
              </a-form-model-item>
              <a-form-model-item label="拒发原因" prop="modelReason">
                <a-input type="textarea" v-model="formModel.modelReason" placeholder="请输入拒发原因" />
              </a-form-model-item>
            </a-form-model>
          </a-modal>
        </a-card>
      </a-col>
    </a-row>
  </keep-alive>
</template>

js部分代码如下:

<script>
export default {
  data() {
    return {
      labelCol: { span: 8 },
      wrapperCol: { span: 14 },
      // model框form表单
      formModel: {
        modelOperator: '',
        modelType: '',
        modelBillNo: '',
        modelStartTime: '',
        modelEndTime: '',
        modelReason: ''
      },
      rules: {
        modelOperator: [{ required: true, message: '请选择箱经营人', trigger: 'blur' }],
        modelType: [{ required: true, message: '请选择箱型箱类', trigger: 'blur' }],
        modelBillNo: [{ required: true, message: '请输入提单号', trigger: 'blur' }],
        modelStartTime: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
        modelEndTime: [{ required: true, message: '请选择结束时间', trigger: 'change' }],
        modelReason: [{ required: true, message: '请输入拒发原因', trigger: 'blur' }]
      },
      // model框 箱经营人
      chargeOperatorList: [
        {
          name: '马士基',
          value: 1
        },
        {
          name: '达飞',
          value: 2
        },
        {
          name: '全部',
          value: 3
        }
      ],
      // model框 箱型箱类
      chargemodelType: [
        {
          name: '45`HC',
          value: 1
        },
        {
          name: '20`OT',
          value: 2
        },
        {
          name: '全部',
          value: 3
        }
      ],
      //  table标题
      columns: [
        {
          title: '箱经营人',
          dataIndex: 'operator',
          scopedSlots: { customRender: 'operator' },
          align: 'center'
        },
        {
          title: '提单号',
          dataIndex: 'billNo',
          scopedSlots: { customRender: 'billNo' },
          align: 'center'
        },
        {
          title: '箱型箱类',
          dataIndex: 'containerType',
          scopedSlots: { customRender: 'containerType' },
          align: 'center'
        },
        {
          title: '拒发原因',
          dataIndex: 'reason',
          scopedSlots: { customRender: 'reason' },
          align: 'center'
        },
        {
          title: '开始时间',
          dataIndex: 'startTime',
          scopedSlots: { customRender: 'startTime' },
          align: 'center'
        },
        {
          title: '结束时间',
          dataIndex: 'endTime',
          scopedSlots: { customRender: 'endTime' },
          align: 'center'
        },
        {
          title: '创建人',
          dataIndex: 'creater',
          scopedSlots: { customRender: 'creater' },
          align: 'center'
        },
        {
          title: '状态',
          dataIndex: 'state',
          scopedSlots: { customRender: 'state' },
          align: 'center'
        },
        {
          title: '操作',
          dataIndex: 'action',
          scopedSlots: { customRender: 'action' },
          align: 'center',
          width: '120px'
        }
      ],
      // table数据
      data: [],
      // model框默认不显示
      visible: false,
      // 用于判断是否选中
      selectKey: [],
      // 用于判断当前model框是新增还是修改
      modelKey: []
    }
  },
  created() {
  // 进入页面开始加载此函数
    this.getReturnInfo()
  },
  computed: {
    rowSelection() {
      return {
        onChange: (selectedRowKeys, selectedRows) => {
        },
        getCheckboxProps: record => ({
          props: {
            operator: record.operator
          }
        })
      }
    }
  },
  methods: {
    // 获取table表格的数据
    getReturnInfo() {
      const items = [
        {
          item1: '马士基1',
          item2: '581209708',
          item3: '40`HC',
          item4: '船公司通知SOC拒发',
          item5: '2019-12-18 08:59',
          item6: '2022-09-22 14:00',
          item7: '刘女士',
          item8: '有效'
        },
        {
          item1: '马士基2',
          item2: '581209708',
          item3: '40`HC',
          item4: '船公司通知SOC拒发',
          item5: '2019-12-18 08:59',
          item6: '2022-09-22 14:00',
          item7: '刘女士',
          item8: '有效'
        },
        {
          item1: '马士基3',
          item2: '581209708',
          item3: '40`HC',
          item4: '船公司通知SOC拒发',
          item5: '2019-12-18 08:59',
          item6: '2022-09-22 14:00',
          item7: '刘女士',
          item8: '有效'
        }
      ]
      const dataTable = []
      items.forEach((item, index) => {
      // 制造table表格的假数据
        const data = {
          key: index,
          operator: {
            content1: item.item1
          },
          billNo: {
            content2: item.item2
          },
          containerType: {
            content3: item.item3
          },
          reason: {
            content4: item.item4
          },
          startTime: {
            content5: item.item5
          },
          endTime: {
            content6: item.item6
          },
          creater: {
            content7: item.item7
          },
          state: {
            content8: item.item8
          }
        }
        dataTable.push(data)
      })
      this.data = dataTable
    },
    // 新增 table数据
    addNew() {
      // 打开model框
      this.visible = true
      // 初始化model框
      this.formModel = {
        modelOperator: '',
        modelType: '',
        modelBillNo: '',
        modelStartTime: '',
        modelEndTime: '',
        modelReason: ''
      }
    },
    // 修改 table中某一行的数据
    reviseRecord(record, index) {
      // 打开model框
      this.visible = true
      // 箱经营人
      this.formModel.modelOperator = record.operator.content1
      // 提单号
      this.formModel.modelBillNo = record.billNo.content2
      // 箱型箱类
      this.formModel.modelType = record.containerType.content3
      // 拒发原因
      this.formModel.modelReason = record.reason.content4
      // 开始时间
      this.formModel.modelStartTime = record.startTime.content5
      // 结束时间
      this.formModel.modelEndTime = record.endTime.content6
      // 创建人
      this.formModel.ModelAuthor = record.creater.content7
      // 获取model的key值
      this.modelKey = index
      console.log(this.modelKey)
    },
    // 点击model框保存按钮 提交数据
    handleOk(e) {
      this.loading = true
      var key = this.modelKey
      // 当key值存在时且为数字类型时 保存model框修改的内容
      if (typeof key === 'number') {
        // 箱经营人
        this.data[key].operator.content1 = this.formModel.modelOperator
        // 提单号
        this.data[key].billNo.content2 = this.formModel.modelBillNo
        // 箱型箱类
        this.data[key].containerType.content3 = this.formModel.modelType
        // 拒发原因
        this.data[key].reason.content4 = this.formModel.modelReason
        // 开始时间
        this.data[key].startTime.content5 = this.formModel.modelStartTime
        // 结束时间
        this.data[key].endTime.content6 = this.formModel.modelEndTime
        console.log(this.data[key].endTime)
        this.modelKey = null
      } else {
        // 当key值不存在时 新增model框的数据到table
        this.$refs.ruleFormModel.validate(valid => {
          if (valid) {
            const record = Object.assign({}, this.formModel)
            this.infoData.push(record)
            // 关闭model框
            this.visible = false
          } else {
            return false
          }
        })
      }
      // 关闭model框
      this.visible = false
    },
    // 删除 table中的某一行
    delRecord(record, index) {
      this.$confirm({
        title: '提示',
        type: 'error',
        content: '确认删除此条数据吗',
        onOk: () => {
          this.data.splice(index, 1)
        },
        onCancel() {}
      })
      console.log(this.data)
    },
    // 取消
    handleCancel(e) {
      // 将所有字段值重置为初始值并移除校验结果
      this.$refs.ruleFormModel.resetFields();
      this.visible = false;
    }
  }
}
</script>

css部分代码如下:

<style lang="less" scoped>
	.color-error {
	 	 color: #ff4d4f;
	}
	.color-success {
	  	 color: #4cd964;
	}
	.margin-right10 {
		 margin-right: 10px;
	}
	.margin-right15 {
	     margin-right: 15px;
	}
	.ant-form-item {
	     margin-bottom: 4px;
	}
</style>

最终效果:
1.进入页面时
在这里插入图片描述
2.点击编辑时
在这里插入图片描述
3.点击新增按钮时
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以将 ElementUI 的 Table 表格和 Dialog 对话结合起来使用,实现表格数据的编辑、删除、详情等操作。以下是一个简单的示例: ```html <template> <div> <el-table :data="tableData"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column label="操作"> <template slot-scope="{ row }"> <el-button @click="edit(row)">编辑</el-button> <el-button @click="remove(row)">删除</el-button> <el-button @click="detail(row)">详情</el-button> </template> </el-table-column> </el-table> <el-dialog :visible.sync="dialogVisible" :title="dialogTitle"> <!-- 编辑表单 --> <el-form v-if="dialogType === 'edit'" :model="editForm" :rules="editRules"> <el-form-item label="姓名" prop="name"> <el-input v-model="editForm.name"></el-input> </el-form-item> <el-form-item label="年龄" prop="age"> <el-input v-model.number="editForm.age"></el-input> </el-form-item> </el-form> <!-- 详情展示 --> <div v-else> <p>姓名:{{ detailData.name }}</p> <p>年龄:{{ detailData.age }}</p> </div> <div slot="footer"> <el-button @click="dialogVisible = false">取消</el-button> <el-button type="primary" @click="save">保存</el-button> </div> </el-dialog> </div> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 18 }, { name: '李四', age: 22 }, { name: '王五', age: 30 } ], dialogVisible: false, dialogTitle: '', dialogType: '', editForm: { name: '', age: '' }, editRules: { name: [{ required: true, message: '请输入姓名', trigger: 'blur' }], age: [{ required: true, message: '请输入年龄', trigger: 'blur' }] }, detailData: {} }; }, methods: { // 编辑 edit(row) { this.dialogType = 'edit'; this.dialogTitle = '编辑'; this.editForm = { ...row }; this.dialogVisible = true; }, // 删除 remove(row) { const index = this.tableData.indexOf(row); this.tableData.splice(index, 1); }, // 详情 detail(row) { this.dialogType = 'detail'; this.dialogTitle = '详情'; this.detailData = { ...row }; this.dialogVisible = true; }, // 保存 save() { this.$refs.editForm.validate(valid => { if (valid) { const index = this.tableData.findIndex(item => item.name === this.editForm.name); if (index > -1) { this.tableData.splice(index, 1, this.editForm); } else { this.tableData.push(this.editForm); } this.dialogVisible = false; } }); } } }; </script> ``` 在上面的示例中,我们首先渲染了一个基本的表格,并为每一行数据添加了“编辑”、“删除”和“详情”操作按钮。当用户点击“编辑”或“详情”按钮时,会弹出一个对话,并根据不同的操作类型(edit 或 detail)来渲染不同的表单内容或详情展示。 在对话中,我们使用了 ElementUI 的 Form 表单组件来渲染编辑表单。为了方便起见,我们使用了 Object.assign 或展开运算符来复制表格数据,并将其作为表单的默认值。在保存表单时,我们使用了 Form 的 validate 方法来验证表单数据的合法性,并根据验证结果来保存表格数据。如果表单数据合法,则将其保存到表格数据中,并关闭对话。如果表单数据不合法,则不保存数据,但仍保持对话打开状态,以便用户修改表单数据。 总的来说,结合 Table 和 Dialog 组件可以为用户提供一个友好的数据交互界面,让用户可以轻松地进行表格数据的增删改查操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值