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

vue2 watch 的使用

原理:

  • 你「盯着」某个数据(比如 mainForm.materialType
  • 一旦它变了,就执行一个函数

解决问题:

过去的“盲目加载”问题,一旦多这样的数据加载多了,导致页面非常卡顿,后端数据库也不好受!!!
created() {this.loadMainApply()     // ❌ 不管用户要不要,先加载主单this.loadDictList()      // ❌ 字典还行this.loadDetailList()    // ❌ 最严重:不管是不是 L7,都请求列表!
}
<template><div class="apply-detail-page" style="padding: 24px;"><!-- 主申请单 --><a-card title="主申请单" style="margin-bottom: 24px;"><div class="form-item"><label>申请单编号:</label><span>{{ mainForm.applyNo }}</span></div><div class="form-item"><label>物料类型:</label><a-selectv-model="mainForm.materialType"placeholder="请选择物料类型"style="width: 200px"><!-- 🔽 动态渲染字典 --><a-select-optionv-for="item in materialTypeOptions":key="item.value":value="item.value">{{ item.label }}</a-select-option></a-select></div><div class="form-item"><label>申请人:</label><span>{{ mainForm.applicant }}</span></div></a-card><!-- L7 列表 --><a-card title="详情列表" v-if="mainForm.materialType === 'L7' && detailList.length > 0"><a-table:dataSource="detailList":columns="columns":row-key="record => record.id":pagination="{ pageSize: 10 }"/></a-card></div>
</template><script>
export default {name: 'ApplyDetail',data() {return {mainForm: {applyNo: '',materialType: '',applicant: ''},detailList: [],l7DataLoaded: false,columns: [{ title: '项目', dataIndex: 'item' },{ title: '数量', dataIndex: 'qty' }],dictList: [], // 存放所有字典materialTypeOptions: [] // 存放 MATERIAL_TYPE 类型的选项}},created() {console.log('组件创建')this.loadDictList() // 先加载字典this.loadMainApply()},watch: {'mainForm.materialType'(newVal) {if (newVal === 'L7' && !this.l7DataLoaded) {this.loadDetailList()}}},methods: {// 模拟接口:返回 PromisefetchDictList() {return Promise.resolve({data: [{ type: 'MATERIAL_TYPE', value: 'L1', label: 'L1 - 普通物料' },{ type: 'MATERIAL_TYPE', value: 'L5', label: 'L5 - 特殊物料' },{ type: 'MATERIAL_TYPE', value: 'L7', label: 'L7 - 高级物料' },{ type: 'APPLY_STATUS', value: 'DRAFT', label: '草稿' },{ type: 'APPLY_STATUS', value: 'SUBMITTED', label: '已提交' }]})},fetchMainApply() {return Promise.resolve({data: {applyNo: 'AP20250827001',materialType: 'L1',applicant: '张三'}})},fetchDetailList() {console.log('[API] 正在请求 L7 列表数据...')return new Promise((resolve) => {setTimeout(() => {resolve({data: [{ id: 1, item: 'L7-校验模块', qty: 1 },{ id: 2, item: 'L7-加密组件', qty: 1 },{ id: 3, item: 'L7-审计日志', qty: 1 }]})}, 800)})},// -------------------------------// 使用 .then() 替代 async/await// -------------------------------loadDictList() {this.fetchDictList().then(res => {this.dictList = res.datathis.materialTypeOptions = res.data.filter(item => item.type === 'MATERIAL_TYPE')console.log('字典加载完成,物料类型选项:', this.materialTypeOptions)}).catch(error => {console.error('字典加载失败', error)})},loadMainApply() {this.fetchMainApply().then(res => {this.mainForm = res.dataconsole.log('主单加载完成:', res.data)}).catch(error => {console.error('主单加载失败', error)})},loadDetailList() {if (this.l7DataLoaded) {console.log('缓存命中:L7 数据已加载过,跳过请求')return}console.log('开始加载 L7 数据...')this.fetchDetailList().then(res => {this.detailList = res.datathis.l7DataLoaded = trueconsole.log('L7 数据加载完成')}).catch(error => {console.error('L7 数据加载失败', error)})}
}
}
</script><style scoped>
.form-item {margin-bottom: 16px;
}
.form-item label {display: inline-block;width: 100px;font-weight: 500;
}
</style>

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

相关文章:

  • 从 WPF 到 Avalonia 的迁移系列实战篇1:依赖属性的异同点与迁移技巧
  • LangChain4j入门一:LangChain4j简介及核心概念
  • Python计算点云的欧式、马氏、最近邻、平均、倒角距离(Chamfer Distance)
  • 嵌入式C语言进阶:高效数学运算的艺术与实战
  • MySQL 8 与 PostgreSQL 17 对比分析及迁移指南
  • 【网络】网络基础概念
  • HarmonyOS安全开发实战:一套好用的数据加密方案
  • mysql mvcc机制详解
  • Java全栈开发面试实战:从基础到微服务架构的深度解析
  • IntelliJ IDEA Debug 模式功能指南
  • 替身演员的艺术:pytest-mock 从入门到飙戏
  • 寻找AI——初识墨刀AI
  • 极海发布APM32F425/427系列高性能MCU:助力工业应用升级
  • Ansible模块实战,操作技巧
  • 【C#】获取不重复的编码(递增,非GUID)
  • 怎么理解API?
  • R-Zero:通过自博弈机制让大语言模型无需外部数据实现自我进化训练
  • LeetCode-238除自身以外数组的乘积
  • 大脑的藏宝图——神经科学如何为自然语言处理(NLP)的深度语义理解绘制新航线
  • PowerShell下vim编辑文件时产生的额外文件
  • 网站防爆破安全策略分析
  • KingBase数据库迁移利器:KDTS工具 MySQL数据迁移到KingbaseES实战
  • 学习设计模式《二十四》——访问者模式
  • 【数字投影】创新展厅视觉体验,3D Mapping投影全面解读
  • LaTeX论文转word插入mathtype公式
  • C/C++ 数据结构 —— 线索二叉树
  • 【C++】map 容器的使用
  • django配置多个app使用同一个static静态文件目录
  • Android Glide最佳实践:高效图片加载完全指南
  • 滥用Mybatis一级缓存引发OOM问题