现有一个需求如下

点击“存包记录”,出现弹窗(如下图) ,通过上图传过来的参数:订单id ,查询出来弹窗中的列表, 列表数据来自另一张表,与上图数据的表 关联)

该需求实现一个主从详情视图。点击父列表中的一个“存包记录”按钮。出现一个模态弹窗。弹窗中的列表显示与所点击行相关的记录。该相关列表的数据来自一个与父列表不同的数据库表。这两个表由一个主键/外键关系(orderId)连接。
技术思路梳理
Vue 父子组件通信的经典“自上而下传递 Props,自下而上触发 Events”模式中的前半部分。
第1步:父组件 - 触发与状态管理
- 触发事件:在父组件的表格中,点击“存包记录”按钮,通过
@click="storeRecords(scope.row)"将当前行的整个数据对象row传递给storeRecords方法。 - 准备数据:在
storeRecords方法中,从row对象中解构出关键的orderId(this.orderId = row.orderId),并将其赋值给父组件data中的变量orderId。 - 展示子组件:通过设置
this.storeRecordOpen = true打开弹窗,弹窗内渲染的是子组件<LockerRecord>。
第2步:父组件 -> 子组件 - 数据传递(Props)
这是最关键的桥梁。
<!-- 父组件 --> <el-dialog> <!-- 将父组件 data 中的 orderId,作为名为 "orderId" 的 prop 传递给子组件 --> <LockerRecord :orderId="orderId"></LockerRecord> </el-dialog>
:orderId="orderId"的含义是:将父组件的orderId变量,绑定到子组件的orderIdprop上。这是一个动态绑定,当父组件的orderId变化时,子组件会接收到新的值。
第3步:子组件 - 接收与响应(Props + Watch)
这是你方案中最精彩的部分,完美地解决了数据异步更新的问题。
- 声明接收:在子组件
LockerRecord.vue中,通过props: ['orderId']声明:“我期望接收一个名为orderId的数据”。 - 监听变化并响应:
- 为什么需要
watch?因为子组件创建时,orderId这个 prop 可能还没有从父组件传递过来(或者传递的是初始空值)。直接在created()钩子里调用getList()可能会拿错参数。 watch就像一个哨兵,专门监视orderId这个 prop。immediate: true:这是点睛之笔。它告诉watch:“在创建好监视任务后,立即执行一次handler”。这确保了即使orderId在组件创建后很快就有了值,也能被立刻捕获并执行查询。handler(newVal, oldVal):当orderId发生变化时,这个函数被调用。newVal就是从父组件传来的最新的orderId。this.newOrderId = newVal; this.getList():你将新值赋给一个内部变量newOrderId,然后调用getList()进行数据查询。这个流程非常稳健。
- 为什么需要
第4步:子组件 -> 后端 -> 子组件 - 数据查询与渲染
- 发起请求:子组件的
getList()方法调用 API 函数getRecord(this.newOrderId),将监听到的新orderId发送给后端。 - 后端处理:后端接收到
orderId,作为@PathVariable查询关联表,并返回对应的存包记录列表。 - 前端渲染:子组件接收到后端返回的数据,更新
list和total,<el-table>自动根据list的数据完成渲染。
总结:核心任务是创建一个父子组件间的交互,其中一个组件(父组件)持有一个按钮列表,点击这些按钮会打开一个弹窗(子组件),其中包含一个需要基于来自父组件的ID来获取数据的表格。
浙公网安备 33010602011771号