当前位置: 首页 > news >正文

vue3中watch的使用示例

使用情况说明:

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;
  // 如果尚未渲染子组件ApplyBasicInfoModifyDialog
  if (!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>
  
<ApplyBasicInfoDialog
    v-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 });

运行效果:

  

http://www.dtcms.com/a/121835.html

相关文章:

  • 算法小练习
  • git仓库设置访问公钥
  • [leetcode]求最大公约数和最小公倍数(gcd和lcm算法)
  • 【场景应用2】speech_recognition: 微调语音模型
  • 深度学习、图像算法学习记录
  • 【Proteus仿真】【32单片机-A009】矩阵按键系统设计
  • 代码随想录-动态规划24
  • 【Windows】Win2008服务器SQL服务监控重启脚本
  • golang gmp模型分析
  • 【Game】Powerful——Martial Arts Challenge(6)
  • 数据库实践题目:在线书店管理系统
  • 高性能服务开发利器:redis+lua
  • Spring 框架的核心基础:IoC 和 AOP
  • 【算法竞赛】回文字符串+思维模拟(蓝桥杯真题·回文字符串·代码清晰易懂)
  • 巧记英语四级单词 Unit3-上【晓艳老师版】
  • 【SpringCloud】从入门到精通(下)
  • TCP 与 UDP
  • Qt 开发时可以在函数内引用的头文件
  • 国网B接口协议调阅实时视频接口流程详解以及检索失败原因(电网B接口)
  • 蓝桥杯刷题总结 + 应赛技巧
  • MySQL表的增删查改(基础)
  • python学智能算法(九)|决策树深入理解
  • [前端]从人体结构看网页三要素:HTML、CSS 与 JavaScript
  • C#.NET模拟用户点击按钮button1.PerformClick自动化测试
  • 动手人形机器人(RL)
  • 去除Mysql表中的空格、回车、换行符和特殊字符
  • 淘宝API与小程序深度联动:商品详情页“一键转卖”功能开发
  • NO.83十六届蓝桥杯备战|动态规划-基础线性DP|台阶问题|最大子段和|传球游戏|乌龟棋(C++)
  • Elasticsearch 集群搭建
  • Vue3+Vite+TypeScript+Element Plus开发-10.多用户动态加载菜单