Vue3父子通信-setup+经典父组件与子组件el-dialog

一、父组件
绑定方法,引入子组件并传递数据和方法

<el-button size="small" plain type="primary" @click="click_add_notice">+添加公告</el-button>
<AddNoticeDialog
        v-model="AddNoticeDialogDialogVisible"
        @addNoticeSuccess="get_infocenter_notice_list"
	:complaintRecordId="currentComplaintRecordId"	
      ></AddNoticeDialog>
import AddNoticeDialog from './AddNoticeDialog.vue'
const AddNoticeDialogDialogVisible = ref(false)
const currentComplaintRecordId = ref<string | null>(null)
//打开弹窗
const click_add_notice = () => {
  AddNoticeDialogDialogVisible.value = true
}

二、子组件

<script setup lang="ts">
import { ref } from 'vue'
import parametersuperApi from '@/api/parametersuper/index'

import { ElMessage, type FormInstance } from 'element-plus'
import { regulatoryBodiesIdStore } from '@/stores/insuiList'
import { storeToRefs } from 'pinia'
const { regulatoryBodiesId } = storeToRefs(regulatoryBodiesIdStore())
//接收父组件数据
const model = defineModel()
//接收父组件方法
const emit = defineEmits<{
  (e: 'addNoticeSuccess'): void
}>()
//定义表单数据
const noticeForm: any = ref({
  type: null,
  title: '',
  content: '',
  file: '',
  picture: '',
  releaseMode: null,
  planReleaseTime: null
})
const click_save_noticeForm = () => {
  let params = {
    regulatorId: regulatoryBodiesId.value,
    type: noticeForm.value.type,
    title: noticeForm.value.title,
    content: noticeForm.value.content,
    file: noticeForm.value.file,
    picture: noticeForm.value.picture,
    releaseMode: noticeForm.value.releaseMode,
    planReleaseTime: noticeForm.value.planReleaseTime
  }
  parametersuperApi.add_infocenter_notice_api(params).then((res: any) => {
    if (res.errorcode == 0) {
	//调用父组件方法
      emit('addNoticeSuccess')
      ElMessage.success('新增成功')
//关闭弹窗
      model.value = false
    }
  })
}
//弹窗打开时逻辑
function handleDialogOpen() {
  addDisabled.value = false
}
</script>
<template>
  <el-dialog title="新增公告" v-model="model" @open="handleDialogOpen">
    <el-form :model="noticeForm" label-width="auto" label-suffix=":" ref="formRef">
      <el-form-item>
        <el-col :span="11">
          <el-form-item label="公告类型" prop="type">
            <el-select v-model="noticeForm.type" placeholder="请选择公告类型">
              <el-option label="行业公告" value="0"> </el-option>
              <el-option label="督导公告" value="1"> </el-option>
              <el-option label="系统公告" value="2"> </el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="2"> </el-col>
        <el-col :span="11"> </el-col>
      </el-form-item>
      <el-form-item>
        <el-col :span="24">
          <el-form-item label="公告标题" prop="title">
            <el-input v-model="noticeForm.title"> </el-input>
          </el-form-item>
        </el-col>
        <!-- <el-col :span="2"> </el-col>
        <el-col :span="11">
        </el-col> -->
      </el-form-item>
      <el-form-item prop="content" label="公告内容">
        <el-input v-model="noticeForm.content" type="textarea" :rows="7"> </el-input>
      </el-form-item>
      <el-form-item label="添加附件"> </el-form-item>
      <el-form-item label="上传图片"> </el-form-item>
      <el-form-item>
        <el-col :span="11">
          <el-form-item label="发布方式" prop="releaseMode">
            <el-switch
              v-model="noticeForm.releaseMode"
              active-text="自动"
              inactive-text="手动"
              active-value="1"
              inactive-value="0"
            />
          </el-form-item>
        </el-col>
        <el-col :span="2"> </el-col>
        <el-col :span="11"> </el-col>
      </el-form-item>
      <el-form-item>
        <el-col :span="11">
          <el-form-item label="发布时间" prop="planReleaseTime">
            <el-date-picker
              v-model="noticeForm.planReleaseTime"
              type="datetime"
              placeholder="请选择"
              format="YYYY/MM/DD hh:mm:ss"
              value-format="x"
            />
          </el-form-item>
        </el-col>
        <el-col :span="2"> </el-col>
        <el-col :span="11"> </el-col>
      </el-form-item>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button @click="model = false">取消</el-button>
        <el-button type="primary" @click="click_save_noticeForm" :disabled="addDisabled">
          添加
        </el-button>
      </div>
    </template>
  </el-dialog>
</template>

三、另一种方法

绑定新增按钮弹出表单,使用子组件addDialog,定义了ref,传递数据option,rowData,formTitle,传递方法closeAuthorizeChildDialog,get_Institutions_List


父组件

<el-button
              icon="fas fa-plus"
              type="text"
              style="margin: -10px 0px"
              @click="click_Add_Institutions"
              >&nbsp;新增监管机构</el-button
            >
<addDialog
        ref="addDialogRef"
        :option="optionAuth"
        :rowData="rowData"
        :formTitle="formTitle"
        @closeAuthorizeChildDialog="closeAuthorizeChildDialog"
        @get_Institutions_List="get_Institutions_List"
      ></addDialog>
import addDialog from "./add_dialog.vue";
const addDialogRef: any = ref();
const optionAuth = ref({
  dialogAuthorizeChildVisible: false,
  currectRowData: {},
});
const formTitle = ref("新增监管机构");
const rowData = ref({});
//打开弹窗传递title调用子组件方法clearForm
const click_Add_Institutions = () => {
  optionAuth.value.dialogAuthorizeChildVisible = true;
  formTitle.value = "新增监管机构";
  addDialogRef.value.clearForm();
};
//关闭弹窗
const closeAuthorizeChildDialog = () => {
  optionAuth.value.dialogAuthorizeChildVisible = false;
};
// 获取机构列表
const get_Institutions_List = () => {
  let loadingInstance: any = null;
  loadingInstance = ElLoading.service({
    lock: true,
    text: "加载中...",
    background: "rgba(0, 0, 0, 0.7)",
  });
  proxy.axios
    .get(`/regulator/get`)
    .then(({ data }: { data: any }) => {
      tableData_Institutions_List.value = data.data;
      if (loadingInstance) {
        loadingInstance.close();
      }
    })
    .catch((err: any) => {
      console.error(err);
      if (loadingInstance) {
        loadingInstance.close();
      }
    });
};

子组件

//add_dialog.vue
//定义方法closeAuthorizeChildDialog,绑定数据option1,title,form表单布局

<el-dialog
    @close="closeAuthorizeChildDialog"
    v-model="option1"
    :title="props.formTitle"
    width="50%"
  >
    <el-form :model="form">
      <el-form-item
        label="机构名称"
        prop="orgName"
        :label-width="formLabelWidth"
      >
        <el-input
          placeholder="请输入"
          class="inputForm"
          v-model="form.orgName"
          autocomplete="off"
        />
      </el-form-item>
      <el-form-item
        label="机构简称"
        prop="shortName"
        :label-width="formLabelWidth"
      >
        <el-input
          placeholder="请输入"
          class="inputForm"
          v-model="form.shortName"
          autocomplete="off"
        />
      </el-form-item>
      <el-form-item
        v-if="props.formTitle == '新增监管机构'"
        label="机构ID"
        prop="orgId"
        :label-width="formLabelWidth"
      >
        <el-input
          placeholder="请输入"
          class="inputForm"
          v-model="form.orgId"
          autocomplete="off"
        />
      </el-form-item>
      <el-form-item
        v-else
        label="机构ID"
        prop="orgId"
        :label-width="formLabelWidth"
      >
        <el-input
          disabled
          placeholder="请输入"
          class="inputForm"
          v-model="form.orgId"
          autocomplete="off"
        />
      </el-form-item>
      <el-form-item
        label="启用状态"
        prop="status"
        :label-width="formLabelWidth"
      >
        <el-switch v-model="form.status" />
      </el-form-item>
      <el-form-item
        :label-width="formLabelWidth"
        v-if="props.formTitle == '新增监管机构'"
        label="所在位置"
        prop="county"
        :rules="{ required: true, message: '请选择所在区县!' }"
      >
        <el-row>
          <el-col :span="6">
            <el-select
              v-model="form.province"
              placeholder="请选择省"
              filterable
              @change="provinceChange"
            >
              <el-option
                v-for="province in provinces"
                :label="province.label"
                :value="province.value"
                :key="province.value"
              />
            </el-select>
          </el-col>
          <el-col :span="6">
            <el-select
              v-model="form.city"
              placeholder="请选择市"
              filterable
              @change="cityChange"
            >
              <el-option
                v-for="city in cities"
                :label="city.label"
                :value="city.value"
                :key="city.value"
              />
            </el-select>
          </el-col>
          <el-col :span="6">
            <el-select
              v-model="form.county"
              placeholder="请选择县区"
              filterable
            >
              <el-option
                v-for="county in counties"
                :label="county.label"
                :value="county.value"
                :key="county.value"
              />
            </el-select>
          </el-col>
        </el-row>
      </el-form-item>

      <el-form-item label="备注" prop="remarks" :label-width="formLabelWidth">
        <el-input
          placeholder="请输入内容"
          class="inputForm"
          v-model="form.remarks"
          type="textarea"
        />
      </el-form-item>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button @click="closeAuthorizeChildDialog">取消</el-button>
        <el-button type="primary" @click="onClick_SaveForm"> 确定 </el-button>
      </div>
    </template>
  </el-dialog>
import {
  ref,
  defineProps,
  reactive,
  onMounted,
  toRef,
  defineEmits,
  getCurrentInstance,
  computed,
  defineExpose,
} from "vue";
//暴露方法供父组件调用
defineExpose({ clearForm, editToForm });
//接收父组件传递数据
const props = defineProps({
  option: Object,
  rowData: Object,
  formTitle: String,
});
//转成ref响应式
const option = toRef(props, "option");
//接收父组件传递方法
const emit = defineEmits([
  "closeAuthorizeChildDialog",
  "get_Institutions_List",
]);
//调用父组件方法
const closeAuthorizeChildDialog = () => {
  emit("closeAuthorizeChildDialog");
};
//计算属性
const option1 = computed({
  get: () => option.value?.dialogAuthorizeChildVisible,
  set: (val: any) => {
    emit("closeAuthorizeChildDialog");
  },
});
//定义form表单
const form: any = reactive({
  orgId: "",
  orgName: "",
  shortName: "",
  status: true,
  address: "",
  longitude: "123",
  latitude: "123",
  remarks: "",
  province: "",
  city: "",
  county: "",
});
//定义方法clearForm
const clearForm = () => {
  form.orgId = "";
  form.orgName = "";
  form.shortName = "";
  form.status = true;
  form.address = "";
  form.longitude = "";
  form.latitude = "";
  form.remarks = "";
};

  • 17
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3 中,使用 Element UI 的 el-table 和 el-dialog 组件,可以按照以下步骤来实现自定义弹窗: 1. 在 el-table 中定义 scoped slot,例如: ```html <el-table :data="tableData"> <el-table-column prop="name" label="Name"></el-table-column> <el-table-column prop="gender" label="Gender"></el-table-column> <el-table-column label="Actions"> <template #default="{ row }"> <el-button @click="handleClick(row)">Edit</el-button> <el-button @click="handleDelete(row)">Delete</el-button> </template> </el-table-column> </el-table> ``` 2. 在 setup 函数中定义 handleClick 方法,例如: ```javascript import { ref } from 'vue'; export default { setup() { const dialogVisible = ref(false); const editRow = ref({}); const handleClick = (row) => { dialogVisible.value = true; editRow.value = Object.assign({}, row); }; return { dialogVisible, editRow, handleClick }; } } ``` 3. 在 el-dialog 中使用 editRow 数据来渲染自定义的弹窗: ```html <el-dialog v-model:visible="dialogVisible"> <el-form v-if="editRow"> <el-form-item label="Name"> <el-input v-model="editRow.name"></el-input> </el-form-item> <el-form-item label="Gender"> <el-radio-group v-model="editRow.gender"> <el-radio :label="1">Male</el-radio> <el-radio :label="2">Female</el-radio> </el-radio-group> </el-form-item> </el-form> <div slot="footer"> <el-button @click="dialogVisible = false">Cancel</el-button> <el-button type="primary" @click="handleSave">Save</el-button> </div> </el-dialog> ``` 这样,当用户点击 Edit 按钮时,就会弹出自定义的编辑弹窗,用户可以在弹窗中编辑数据,点击确认按钮后,数据会保存到 editRow 中,然后再自动更新到表格中。注意,在 Vue3 中使用 v-model 绑定 el-dialog 的 visible 属性时,需要加上修饰符 `v-model:visible`,否则会出现警告。同时,在 el-dialog 中添加一个保存按钮,点击后可以保存数据并关闭弹窗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值