使用情况说明:
1、父组件中有个表格,点击表格行的修改基础信息,弹出修改对话框;
2、修改内容点击确认,发送请求,后端更新数据;不修改内容不发送请求;
3、可以连续修改;
watch的特点:
1、由子组件watch父组件使用ref定义的对象
// 表格选择行
const tableSelectedRow = ref<ApplyBasicInfo>();
2、tableSelectedRow会涉及重新赋值和修改属性(在页面上修改)
tableSelectedRow.value = row;
3、watch的源是一个getter返回值
() => props.applyBasicInfo
4、开启深度监视
deep: true
父组件相关代码:
script
TypeScript
import { ref } from "vue";
import type { ApplyBasicInfo } from "@/interface";
import ApplyBasicInfoDialog from "./ApplyBasicInfoDialog.vue";
// 表格数据
const tableData = ref<ApplyBasicInfo[]>([]);
// 表格选择行
const tableSelectedRow = ref<ApplyBasicInfo>();
// 修改受理基础信息对话框
const applyBasicInfoDialogRef = ref<InstanceType<typeof ApplyBasicInfoDialog>>();
// 渲染修改受理基础信息对话框标识,默认不渲染
const isCreateApplyBasicInfoDialog = ref(false);
// 修改基础信息
const onModifyBasicInfoClick = (row: any) => {
tableSelectedRow.value = row;
// 如果尚未渲染子组件ApplyBasicInfoModifyDialog
if (!isCreateApplyBasicInfoDialog.value) {
// 标识渲染子组件ApplyBasicInfoModifyDialog,响应式标识的值为真时,满足v-if的条件,开始渲染
isCreateApplyBasicInfoDialog.value = true;
} else {
// 调用子组件的showDialog方法,显示对话框
applyBasicInfoDialogRef.value?.showDialog();
}
};
template
html
<el-table-column label="操作" header-align="center" :align="`center`" fixed="right" width="200">
<template #default="scope">
<el-button class="btn-slots" type="primary" size="small" plain @click="onModifyBasicInfoClick(scope.row)"
>修改基础信息</el-button
>
</template>
</el-table-column>
<ApplyBasicInfoDialog
v-if="isCreateApplyBasicInfoDialog && tableSelectedRow"
ref="applyBasicInfoDialogRef"
:applyBasicInfo="tableSelectedRow"
operateCommandType="info-modify" />
子组件相关代码:
script
TypeScript
import { ref, watch, type PropType } from "vue";
import type { ApplyBasicInfo } from "@/interface";
const props = defineProps({
applyBasicInfo: {
type: Object as PropType<ApplyBasicInfo>, // 使用标准的PropType进行对象类型定义
required: true // 表示父组件必须传递这个prop,不能与 default 同时使用
},
operateCommandType: {
type: String,
default: "info-view" // 表示当父组件没有传递时使用默认值,不能与 required 同时使用
}
});
// 对话框显示标识
const dialogVisible = ref(false);
// 监视标识
let applyBasicInfoChanged = false;
// 显示对话框
const showDialog = () => {
// 显示对话框
dialogVisible.value = true;
};
watch(
() => props.applyBasicInfo, // 点击表格行修改按钮,父组件的tableSelectedRow重新赋值会触发、在对话框中修改内容,修改props.applyBasicInfo(也就是父组件的tableSelectedRow)的属性也会触发
() => {
// 监视标识,标识 applyBasicInfo 已经发生变化
applyBasicInfoChanged = true;
},
{ deep: true }
);
defineExpose({ showDialog });
运行效果: