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

Vue3 + TypeScript,使用祖先传后代模式重构父传子模式

父传子模式

父组件 SampleInput.vue

<script setup lang="ts" name="SampleInput">
import { ref } from "vue";
import type { ApplyBasicInfo, Apply, ApplySample } from "@/interface";
import CommonApplySampleTable from "@/components/common/CommonApplySampleTable.vue";// 定义数据
// 受理基础信息
const applyBasicInfo = ref<ApplyBasicInfo | null>(null)
// 受理样品表格数据
const applySampleTableData = ref<ApplySample[]>([]);
// 滚动到离顶部表头的距离
const applySampleTableScrollTop = ref(0);......</script><template><!-- 提供数据给子类 --><CommonApplySampleTable:apply-sample-list="applySampleTableData":accept-type="applyBasicInfo.acceptType":scroll-top="applySampleTableScrollTop"operate-command-type="info-add" />
</template>

子组件 CommonApplySampleTable.vue

<script setup lang="ts" name="CommonApplySampleTable">
import type { ApplySample } from "@/interface";
import ApplySampleSZTable from "@/components/ApplySampleSZTable.vue";
import ApplySampleOtherTable from "@/components/ApplySampleOtherTable.vue";// 接收父类提供的数据
const props = withDefaults(defineProps<{// 受理样品列表applySampleList: ApplySample[];// 受理类别acceptType: string;// 操作指令类型:新增删除:info-add;修改:info-modify;查看:info-viewoperateCommandType: "info-add" | "info-modify" | "info-view";// 滚动到离顶部表头的距离scrollTop?: number;}>(),{applySampleList: () => [],acceptType: "",operateCommandType: "info-add",scrollTop: 0}
);
</script><template><!-- 受理样品表格,水质类 --><ApplySampleSZTablev-if="props.acceptType.includes(`GD`)":applySampleData="props.applySampleList":applySampleTableScrollTop="props.scrollTop":operate-command-type="props.operateCommandType" /><!-- 受理样品表格,其他 --><ApplySampleOtherTablev-else:applySampleData="props.applySampleList":applySampleTableScrollTop="props.scrollTop":operate-command-type="props.operateCommandType" />
</template><style scoped lang="scss"></style>

祖先传后代模式

父组件 SampleInput.vue

<script setup lang="ts" name="SampleInput">
import { ref, provide, computed } from "vue";
import type { ApplyBasicInfo, Apply, ApplySample } from "@/interface";
import CommonApplySampleTable from "@/components/common/CommonApplySampleTable.vue";// 定义数据
// 受理基础信息
const applyBasicInfo = ref<ApplyBasicInfo | null>(null)
// 受理样品表格数据
const applySampleTableData = ref<ApplySample[]>([]);
// 滚动到离顶部表头的距离
const applySampleTableScrollTop = ref(0);......// 提供数据给后代
// 受理样品列表
provide("applySampleList", applySampleTableData); // applySampleTableData是个Ref对象,不需要.value,传递ref对象本身(响应式数据)
// 受理类别
provide("acceptType",computed(() => applyBasicInfo.value.acceptType) // applyBasicInfo.value.acceptType 是派生数据(属性数据),通过computed提供响应式数据
);
// 操作指令类型:新增删除:info-add;修改:info-modify;查看:info-view
provide("operateCommandType", ref("info-add"));
// 滚动到离顶部表头的距离
provide("scrollTop", applySampleTableScrollTop); // applySampleTableScrollTop是个Ref对象,不需要.value,传递ref对象本身(响应式数据)
</script><template><CommonApplySampleTable />
</template>

子组件 CommonApplySampleTable.vue

<script setup lang="ts" name="CommonApplySampleTable">
import type { ApplySample } from "@/interface";
import ApplySampleSZTable from "@/components/ApplySampleSZTable.vue";
import ApplySampleOtherTable from "@/components/ApplySampleOtherTable.vue";
import { inject, type Ref, ref } from "vue";// 接收祖先提供的数据
// 受理样品列表
const applySampleList = inject<Ref<ApplySample[]>>("applySampleList", ref([]));
// 受理类别
const acceptType = inject<Ref<string>>("acceptType", ref(""));
// 操作指令类型:新增删除:info-add;修改:info-modify;查看:info-view
const operateCommandType = inject<Ref<"info-add" | "info-modify" | "info-view">>("operateCommandType", ref("info-add"));
// 滚动到离顶部表头的距离
const scrollTop = inject<Ref<number>>("scrollTop", ref(0));
</script><template><!-- 受理样品表格,水质类 --><ApplySampleSZTablev-if="acceptType.includes(`GD`)":applySampleData="applySampleList":applySampleTableScrollTop="scrollTop":operate-command-type="operateCommandType" /><!-- 受理样品表格,其他 --><ApplySampleOtherTablev-else:applySampleData="applySampleList":applySampleTableScrollTop="scrollTop":operate-command-type="operateCommandType" />
</template><style scoped lang="scss"></style>

http://www.xdnf.cn/news/41671.html

相关文章:

  • Redis日常学习(一)
  • 基于Django的AI客服租车分析系统
  • QT6 源(37):界面组件的总基类 QWidget 的源码阅读(下,c++ 代码部分)
  • TDengine 整体构架
  • AI Agent破局:智能化与生态系统标准化的颠覆性融合!
  • 分布自定义shell脚本(详写)附带全代码
  • BT1120 BT656驱动相关代码示例
  • DNS主从同步
  • FFUF指南
  • 高速系统设计简介
  • dac直通线还是aoc直通线? sfp使用
  • -SSRF 服务端请求Gopher 伪协议无回显利用黑白盒挖掘业务功能点
  • UE Datasmith资源导入导出
  • BT-Basic函数之首字母XY
  • 4. 话题通信 ---- 发布方和订阅方cpp文件编写
  • Java实现将MarkDown保留文档内容及格式输出到浏览器页面
  • 2.2/Q2,GBD数据库最新文章解读
  • 模拟算法(一)作业分析及答案
  • java lambda
  • C++入门七式——模板初阶
  • sed命令笔记250419
  • Nacos启动报错
  • BMS电池管理芯片BQ76920芯片手册详细解读
  • python基础知识点(2)
  • stack和queue
  • 借助LlamaIndex实现简单Agent
  • 多模态融合(十一): SwinFusion——武汉大学马佳义团队(二)
  • 英语四级翻译题练习文章示例
  • 生物化学笔记:医学免疫学原理23 免疫检查点分子与肿瘤免疫治疗(PD-1抑制剂黑色素瘤)
  • 最长子序列长度(LIS)--个数遍历的二分+贪心优化