pinia的基本创建和统一创建和解构失去响应式解决办法等知识点
在线代码演示
使用注意点
不能直接结构赋值
- 如果直接结构赋值,就像下面一样,就会失去响应式效果(数据变了,视图依旧不会更新)
1 | <template> |
- 如果确实需要解构赋值,可以使用
storeToRefs
1 | // 官网示例代码 |
多次使用依旧是相同的对象
1 | const store2 = useShopInfo(); |
创建方式(多种)
- 官方示例的会导致重复打包
1 | 使用store时要先把store的定义import进来,再执行定义函数使得实例化。 |
方法0:官方示例写法
- src/store/useShopInfo.ts
1 | export default deinfStore('shopInfo',{ |
- main.ts
1 | import { createApp } from 'vue' |
- 使用
1 | import useShopInfo from "./store/useShopInfo.ts"; |
先简单了解下app.use方法
- 我们先来了解下vue的
app.use
方法,app.use
用来注册插件,插件可以是一个带install()
方法的对象,亦或直接是一个将被用作install()
方法的函数。插件选项 (app.use()
的第二个参数) 将会传递给插件的install()
方法。- 若
app.use()
对同一个插件多次调用,该插件只会被安装一次。
- 若
1 | import {createApp} from "vue"; |
- 基于
app.use()
对同一个插件多次调用,该插件只会被安装一次。我们其实可以看到很多组件库都会叫我们这样使用组件库- 以TDesign为例
1 | import TDesign from 'tdesign-vue-next'; |
- 我们看看我们引入的
TDesign
是什么
1 | import {App} from 'vue' |
- 现在明白了吧,我们引入的
TDesign
就是一个主入口文件,他帮我们一个一个的使用了插件,从而达到了全局引入的效果,当然,你也可以自己去引入,然后按需使用插件
方法1:store统一实例化并暴露使用
- 我们可以使用此方法,我们在store文件夹下方的
index.ts
对其他store进行统一实例化然后暴露使用
1 | //未统一实例化 |
创建总路口和其他仓库
- store/index.ts
1 | import shopInfo from "./useShopInfo" |
- store/user.ts
1 | import {defineStore} from "pinia" |
全局注册
1 | import {createApp} from "vue"; |
组件使用
- src/pages/A.vue
1 | import appStore from "../store"; |
方法2:store统一实例化并暴露使用
- 这种方法不需要全局注册pinia,当然,你为了美观也可以全局注册下
- 原理是因为
defineStore
返回值useStore
函数,这个useStore
函数第一个参数可以接收一个pinia
对象,如果有传入则使用传入的pinia
对象,如果没有传入pinia
对象,那么会去全局寻找,否则就会报错,报错内容大概如下
1 | `[🍍]: getActivePinia was called with no active Pinia. Did you forget to install pinia?\n` + |
创建总路口和其他仓库
- store/index.ts
1 | import {createPinia} from "pinia"; |
- store/user.ts
1 | import {defineStore} from "pinia" |
全局注册(方法2可以不全局注册)
- main.js
1 | import {createApp} from "vue"; |
组件使用
- src/pages/A.vue
1 | import { useInfo } from "../store"; |
参考文章
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 梦洁小站-属于你我的小天地!
评论