珊阡陌提 2022-07-28 21:27 采纳率: 29.4%
浏览 76
已结题

子传父,添加功能如何实现?

父组件
<template>
  <div style="height: 100%">
    <el-card style="height: 100%">
      <div slot="header" class="clearfix">
        <span>卡片名称</span>
        <el-button type="primary" @click="add">添加用户</el-button>
      </div>
      <div>
        <el-table :data="tableData" stripe style="width: 100%">
          <el-table-column prop="date" label="日期" width="180">
          </el-table-column>
          <el-table-column prop="name" label="姓名" width="180">
          </el-table-column>
          <el-table-column prop="address" label="地址"> </el-table-column>
          <el-table-column label="操作">
            <template slot-scope="scope">
              <el-button size="mini" @click="editRow(scope.$index, scope.row)">
                编辑
              </el-button>
              <el-button
                size="mini"
                @click="deleteRow(scope.$index, tableData)"
              >
                删除
              </el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </el-card>
    <add :visible.sync="addVisible"></add>
    <update :visible.sync="updateVisible"></update>
  </div>
</template>

<script>
import add from "./add.vue";
import update from "./update.vue";
export default {
  data() {
    return {
      addVisible: false,
      updateVisible: false,
      tableData: [
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄",
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄",
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1516 弄",
        },
      ],
      form: {
        date: "",
        name: "",
        address: "",
      },
    };
  },
  components: {
    add,
    update,
  },
  methods: {
    add() {
      this.addVisible = true;
    },
    editRow(index, row) {
      this.updateVisible = true;
      console.log(index, row);
      this.form = row;
    },
    deleteRow(index, rows) {
      this.$confirm("确定删除该行数据吗?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          this.$message({
            message: "删除成功",
            type: "success",
          });
          rows.splice(index, 1);
        })
        .catch(() => {
          this.$message({
            message: "已取消删除",
            type: "info",
          });
        });
    },
  },
};
</script>

<style>
.clearfix {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
</style>

子组件
<template>
  <el-dialog
    title="添加用户"
    :visible.sync="adddialogVisible"
    width="30%"
    @close="clearData"
  >
    <el-form ref="form" :rules="rules" :model="form" label-width="80px">
      <el-form-item label="日期" prop="date">
        <el-input v-model="form.date" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="姓名" prop="name">
        <el-input v-model="form.name" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="地址" prop="address">
        <el-input v-model="form.address" autocomplete="off"></el-input>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="adddialogVisible = false">取 消</el-button>
      <el-button type="primary" @click="submit">添 加</el-button>
    </div>
  </el-dialog>
</template>

<script>
export default {
  data() {
    return {
      dialogVisible: false,
      tableData: [],
      form: {
        date: "",
        name: "",
        address: "",
      },
      rules: {
        date: [{ required: true, message: "请输入日期", trigger: "blur" }],
        name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
        address: [{ required: true, message: "请输入地址", trigger: "blur" }],
      },
    };
  },
  props: {
    visible: {
      type: Boolean,
      default: false,
    },
  },
  computed: {
    adddialogVisible: {
      get() {
        return this.visible;
      },
      set(val) {
        this.$emit("update:visible", val);
      },
    },
  },
  methods: {
    submit() {
      this.$refs.form.validate((valid) => {
        if (valid) {
          this.$emit("refresh", this.form);
          this.$message({
            message: "添加成功",
            type: "success",
          });
          this.adddialogVisible = false;
          this.clearData();
        } else {
          return false;
        }
      });
    },
    clearData() {
      this.$refs.form.resetFields();
    },
  },
};
</script>

<style>
</style>

  • 写回答

3条回答 默认 最新

  • eq0284 2022-07-28 21:56
    关注

    你在父组件add,update组件上定义@refresh=”refresh“属性,去监听子组件refresh事件

    <add :visible.sync="addVisible" @refresh="refresh"></add>
    <update :visible.sync="updateVisible" @refresh="refresh"></update>
    

    在父组件,定义方法refresh去接子组件传来的表单

    refresh(formData){
        //编辑与添加根据formData是否有主键id来区别
        if (formData.id) {
            //编辑,更新列表数据
            for (let data of this.tableData) {
                if (data.id === formData.id) {
                    data.name = formData.name
                    data.date = formData.date
                    data.address = formData.address
                }
            }
        } else {
            // 添加
            this.tableData.push(formData)
        }
    
    }
    
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月29日
  • 创建了问题 7月28日

悬赏问题

  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请