使用情况说明:
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
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;// 如果尚未渲染子组件ApplyBasicInfoModifyDialogif (!isCreateApplyBasicInfoDialog.value) {// 标识渲染子组件ApplyBasicInfoModifyDialog,响应式标识的值为真时,满足v-if的条件,开始渲染isCreateApplyBasicInfoDialog.value = true;} else {// 调用子组件的showDialog方法,显示对话框applyBasicInfoDialogRef.value?.showDialog();}
};
template
<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><ApplyBasicInfoDialogv-if="isCreateApplyBasicInfoDialog && tableSelectedRow"ref="applyBasicInfoDialogRef":applyBasicInfo="tableSelectedRow"operateCommandType="info-modify" />
子组件相关代码:
script
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 });
运行效果: