vue,vue3 新手可能忽略的问题,解构对象丢失响应式,如props,torefs, pinia响应式核心

项目场景:

这段时间在利用vue3开发一个项目,在vue的使用过程中,我处于用到什么学什么的状态,一方面是学业,一方面是技术,项目的影响,导致我一直没有静下心来研究透彻vue核心知识,这么,一个关于组件开发时响应式的问题面对了我,我做的是一个组件嵌套,分别有三个组件,一个负责页面框架,一个负责核心业务,一个负责文件处理,这三个组件需要互相通信,我为了代码简洁没有定义过多的变量,而是充分利用vue的组件通信来完成响应式组件和业务。


问题描述`

项目中我用的是pinia状态管理库,我是希望通过中间库来使通信更容易,这个过程就产生了响应式问题。总结如下:

  1. pinia仓库失去响应式
const system = useSystem();
const { isNewProject, isOpenEdit } = toRefs(system)
  1. props响应式异常
const props = defineProps({
  isNewProject: Boolean,
  isOpenEdit: Boolean
})

const { isNewProject, isOpenEdit } = props;

原因分析:

上面我放了俩段代码,是为了更好说明问题;

问题1分析 :我之所以会用那样的解构方式,是因为我在用pinia之前就没有完整的读完文档,这一点我深刻反思,其实原因很简单,官方文档说的很清楚store 是一个用reactive 包裹的对象,像setup 中的props 一样,我们不能对其进行解构这是官方原话,如果需要响应式跟踪Store 中提取属性同时保持其响应式,您需要使用storeToRefs()。 它将为任何响应式属性创建 refs。
问题2分析 :props响应式异常,一个常识是vue的组件中props数据流是由父到子单向的,那么这个数据流可以是响应式的也可以是非响应式的,非响应式的不会产生我们这里的问题,关键在于响应式,什么情况下会失去响应式,于是我带着问题开始了探索,先是读了一个大佬的文章 ES6 解构,不能随意使用。会破坏他的响应式特性!对就是这句话,那么我上面写出来的代码就是被这句话说中了.

解决方案:

第一个问题我们用storeToRefs 来解决,或者就不进行解构,不结构的话是有一点书写麻烦

import { storeToRefs } from "pinia";

const system = useSystem();
const { isNewProject, isOpenEdit } = storeToRefs(system)

第二个问题要想解决,那就是不要试图去解构props, 这里可以扩展一个知识点,就是用toRefs来解构,被它解构完的属性会具有ref特性,也具备了响应式,但是会使props的属性与父组件的响应式断开连接,所以在搞清楚这个问题以后,我们在组件通信上或许就有了更笃定的想法。

Tip

最后推荐有时间的同学能去读下这位大神的文章

以上仅代表个人学习过程观点,如有错误希望能够进一步交流,感谢这个社区。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Vue 3 是一个流行的 JavaScript 框架,而 Pinia 则是一个基于 Vue 3 的状态管理库。Pinia 提供了一种简单、直观的方式来管理应用程序的状态,并且与 Vue 3 的响应式系统紧密集成。 要在 Vue 3 中使用 Pinia,首先需要安装 Pinia 包。您可以通过运行以下命令来安装 Pinia: ``` npm install pinia ``` 在您的 Vue 3 项目中,您需要创建一个 Pinia 实例并注册它作为 Vue 插件。您可以在主入口文件(通常是 `main.js` 或 `main.ts`)中执行此操作。下面是一个简单的示例: ```javascript import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' const app = createApp(App) const pinia = createPinia() app.use(pinia) app.mount('#app') ``` 接下来,您可以创建一个 Pinia store(或多个 store)来管理您的应用程序状态。一个 store 是一个带有状态和操作的对象,您可以在组件中使用它。 例如,创建一个名为 `counter` 的 store,它具有一个 `count` 状态和一个增加计数的操作: ```javascript import { defineStore } from 'pinia' export const useCounterStore = defineStore({ id: 'counter', state: () => ({ count: 0 }), actions: { increment() { this.count++ } } }) ``` 然后,在组件中使用该 store: ```vue <template> <div> <p>Count: {{ counter.count }}</p> <button @click="counter.increment()">Increment</button> </div> </template> <script> import { useCounterStore } from './stores/counter' export default { setup() { const counter = useCounterStore() return { counter } } } </script> ``` 通过这种方式,您可以在 Vue 3 中使用 Pinia 进行状态管理。Pinia 还提供了许多其他功能,如模块化、插件支持和严格模式。您可以查阅 Pinia 文档以获取更多信息和示例:https://pinia.esm.dev/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Min;

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值