vue3值传递心得

181 阅读2分钟

一般传值问题各种api基本都被讲透了,没什么好说的了,但在实际写代码时,有个问题挺麻烦的,那就是:值的传递及修改

使用defineEmites

由于vue限制子组件对父组件传来的值只可读,不可改.在值由子组件定义的前提下,这时只能先定义一个事件,再发送值给父组件

这样做有个问题,一是麻烦,二是一旦需要传两层以上的组件的话就令人崩溃.

使用v-model语法糖

在值由父组件定义的前提下,使用v-model的话,只能是父子组件,如果再多一层的话就报告说子组件不能修改父组件的值了.

那话说v-model的语法糖是怎么起作用的?为什么这种情况下子组件看起来好像可以修改父组件的值?

使用pinia

其实这里不使用也行,直接创建一个js文件,里面用响应式api定义数据,直接export数据,但这样的话就失去vue开发者工具调试支持

直接用compositon API 来创建 pinia 数据容器,详情见官网(pinia.web3doc.top/cookbook/co…),

每一个组件对应一个数据容器,需要用的时候直接import useXX, 然后useXX拿到数据,

折腾了好几种方法,发现原来这是最实在的方法,而且这样的话UI逻辑和业务逻辑也能变得更加明确

ps: 这里建议用compositon API 来创建,因为pinia原生的数据的响应性是通过reactive api来实现的,所以一旦解构赋值就失去响应性了,要想使用解构赋值且保留响应性的话,需要使用ref api来定义响应性数据.