pinia的基本创建和统一创建和解构失去响应式解决办法等知识点

这篇具有很好参考价值的文章主要介绍了pinia的基本创建和统一创建和解构失去响应式解决办法等知识点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在线代码演示

  • https://stackblitz.com/github/superBiuBiuMan/pinia_registerWay

使用注意点

不能直接结构赋值

  • 如果直接结构赋值,就像下面一样,就会失去响应式效果(数据变了,视图依旧不会更新)
<template>
	{{ name }}
</template>

const { name } = useCounterStore();
  • 如果确实需要解构赋值,可以使用storeToRefs
    • https://pinia.vuejs.org/zh/core-concepts/index.html#using-the-store
// 官网示例代码
import { storeToRefs } from 'pinia'

export default defineComponent({
  setup() {
    const store = useCounterStore()
    // `name` and `doubleCount` 都是响应式 refs
    // 这也将为由插件添加的属性创建 refs
    // 同时会跳过任何 action 或非响应式(非 ref/响应式)属性
    const { name, doubleCount } = storeToRefs(store)
    // 名为 increment 的 action 可以直接提取
    const { increment } = store

    return {
      name,
      doubleCount,
      increment,
    }
  },
})

多次使用依旧是相同的对象

const store2 = useShopInfo();
const store3 = useShopInfo();
console.log(store2 === store3)
//输出true

创建方式(多种)

  • 官方示例的会导致重复打包
使用store时要先把store的定义import进来,再执行定义函数使得实例化。
但是,在项目逐渐庞大起来后,每个组件要使用时候都要实例化吗?
在文中开头讲过,pinia的代码分割机制是把引用它的页面合并打包,
那像下面的例子就会有问题,user被多个页面引用,最后user store被重复打包。

方法0:官方示例写法

  • src/store/useShopInfo.ts
export default deinfStore('shopInfo',{
    ...
})
  • main.ts
import { createApp } from 'vue'
import { createPinia } from "pinia";
import './style.css'
import App from './App.vue'
const app = createApp(App);
app.use(createPinia())
app.mount('#app')

  • 使用
import useShopInfo from "./store/useShopInfo.ts";

const store = useShopInfo();

 store.addCar({
    name:name.value,
    price:price.value
  })

先简单了解下app.use方法

  • 我们先来了解下vue的app.use方法,app.use用来注册插件,插件可以是一个带 install() 方法的对象,亦或直接是一个将被用作 install() 方法的函数。插件选项 (app.use() 的第二个参数) 将会传递给插件的 install() 方法。
    • app.use() 对同一个插件多次调用,该插件只会被安装一次
import {createApp} from "vue";
const app = createApp();
import 插件带install方法 from "./test"
import 插件不带install方法 from "./test"

app.use(插件带install方法);//会自动调用install方法

//或者手动执行,以一个自定义函数作为install方法
app.use((app, options) => {
    // dosomething
})
  • 基于app.use() 对同一个插件多次调用,该插件只会被安装一次。我们其实可以看到很多组件库都会叫我们这样使用组件库
    • 以TDesign为例
import TDesign from 'tdesign-vue-next';
import {createApp} from "vue";
import App from './app.vue';

const app = createApp(App);

//重点
app.use(TDesign);

  • 我们看看我们引入的TDesign是什么
import {App} from 'vue'
import {
    Button,
    Popup,
    Avatar,
    Icon,
    ...
} from 'tdesign-vue-next';
export default (app:App) => {
    app.use(Button)
    app.use(Popup)
    app.use(Avatar)
    app.use(Icon)
    app.use(....)
}
  • 现在明白了吧,我们引入的TDesign就是一个主入口文件,他帮我们一个一个的使用了插件,从而达到了全局引入的效果,当然,你也可以自己去引入,然后按需使用插件

方法1:store统一实例化并暴露使用

  • 我们可以使用此方法,我们在store文件夹下方的index.ts对其他store进行统一实例化然后暴露使用
//未统一实例化
store
	a.ts
	b.ts
	//使用的时候(一般以useXXX命名,当然,也随你命名)
	import useA from "../store/a";
	const infoA = useA();
	console.log(infoA.name);//输出存储的名字信息

//统一实例化并暴露使用
store
	a.ts
	b.ts
	index.ts
	//使用的时候
	import appStore from "./store";
	console.log(appStore.infoA.name);//输出存储的名字信息
创建总路口和其他仓库
  • store/index.ts
import shopInfo from "./useShopInfo"

export interface AppStore {
  shopInfo:ReturnType<typeof shopInfo>,
}

const appStore = {} as AppStore;

/* 注册store状态库 */
export const registerStore = () => {
  appStore.shopInfo = shopInfo();//由于没有传入pinia对象,会自动去寻找pinia对象
}

export default appStore;

  • store/user.ts
import {defineStore} from "pinia"
export default defineStore('shopInfo',{
	//...
	state:{
        money:''
    }
	//...
})
全局注册
import {createApp} from "vue";
import App from "./App.vue";
import {registerStore} from "./store";

const app = createApp(App);
app.use(createPinia);/* 使用pinia后就可以紧跟着注册了 */
// 注册pinia状态管理库
registerStore();

app.mount('#app')
组件使用
  • src/pages/A.vue
import appStore from "../store";

<div> {{ appStore.shopInfo.money }} </div>

方法2:store统一实例化并暴露使用

  • 这种方法不需要全局注册pinia,当然,你为了美观也可以全局注册下
  • 原理是因为defineStore返回值useStore函数,这个useStore函数第一个参数可以接收一个pinia对象,如果有传入则使用传入的pinia对象,如果没有传入pinia对象,那么会去全局寻找,否则就会报错,报错内容大概如下
`[🍍]: getActivePinia was called with no active Pinia. Did you forget to install pinia?\n` +
`\tconst pinia = createPinia()\n` +
`\tapp.use(pinia)\n` +
`This will fail in production.`
创建总路口和其他仓库
  • store/index.ts
import {createPinia} from "pinia";
import UseInfo from "./user.ts";//引入其他仓库

import type { App } from 'vue';//或者import {App} from "vue";

//创建唯一的store
const store = createPinia();

//如果需要美观下,想要在main.js全局注册,可以添加下面方法
export default (app:App) => {
    app.use(store);
}


//注意大小写和传参
export const useInfo = UseInfo(store);
//如果有多个也是这样子调用,名字什么的你随意
	//export useList = UseList(store);

  • store/user.ts
import {defineStore} from "pinia"
export default defineStore('shopInfo',{
	//...
	state:{
        money:''
    }
	//...
})
全局注册(方法2可以不全局注册)
  • main.js
import {createApp} from "vue";
import App from "./App.vue";
import pinia from "./store"

const bootstrap =  () => {
    const app = createApp(App)
    // ... 
    // 注册TDesignUI()组件库
    app.use(TDesignUI)
    // 加载pinia(可选)
    app.use((app) => {
        app.use(pinia)
    })
    // ...
}

void bootstrap()
组件使用
  • src/pages/A.vue
import { useInfo } from "../store";

<div> {{ useInfo.money }} </div>

参考文章

  • Pinia进阶:优雅的setup(函数式)写法+封装到你的企业项目
  • pinia源码-defineStore源码解析

文章来源地址https://www.toymoban.com/news/detail-493734.html

到了这里,关于pinia的基本创建和统一创建和解构失去响应式解决办法等知识点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端开发小技巧 - 【Vue3 + TS】 - 在 TS + Vue3 中使用 Pinia,实现 Pinia 的持久化,优化Pinia(仓库统一管理)

    ts 中使用 pinia 和 Vue3 基本一致,唯一的不同点在于,需要根据接口文档给 state 标注类型,也要给 actions 标注类型; 以下都是 组合式API 的写法, 选项式API 的写法大家可以去官网看看; Pinia; 持久化插件 - pinia-plugin-persistedstate; 目标文件: src/types/user.d.ts (这里以 user.d.t

    2024年04月09日
    浏览(53)
  • PyQt5 执行耗时操作导致界面卡死或未响应的解决办法

    当用PyQt5开发一个GUI界面 ,需要执行业务逻辑时,后台逻辑执行时间长,界面就容易出现卡死、未响应等问题。 在PyQt中,GUI界面本身就是一个处理事件循环的主线程,当进行耗时操作时,主线程GUI需要等待操作完成后才会响应,在等待这段时间,整个GUI就处于卡死的状态。

    2024年02月09日
    浏览(39)
  • Pinia 刷新页面store数据更新页面没有变化,响应式失效

    当我在组件的 setup 中使用 useStore 来获取 store 的时候,Pinia.js 的 store 已经被更新了,但是组件渲染没变化。 当count我们在结构赋值的时候数据丢失了响应式 1.计算属性 2.使用storeToRefs

    2024年02月11日
    浏览(43)
  • Windows任务栏卡死怎么办?电脑任务栏无响应的解决办法

    任务栏指的是常见于Windows电脑屏幕底部的操作窗口,我们可以通过“开始”菜单定位和启动程序,或者查看当前打开的程序,还是很有用的。但是它却经常“罢工”,时不时的出现卡死无响应,那么遇到Windows任务栏卡死该怎么办? 造成Windows任务栏无响应的原因有很多,比如

    2024年02月15日
    浏览(36)
  • vue请求时间太长_接口处理请求时间过长,前台响应“服务器超时”的解决办法

    这些方法可以根据具体需求和情况进行选择和组合使用,以提高前端的用户体验和接口的性能。同时,还需要考虑服务器端的性能和网络环境,以及前后端的协作来实现最佳的用户体验。

    2024年02月09日
    浏览(59)
  • 【云服务器】关于UDP/TCP跨平台网络通信服务器无响应的情况及解决办法

    本篇文章仅为了记录我在跨平台进行udp通信的时候遇到的问题及解决办法 进行udp网络通信的时候,我用腾讯云服务器作服务端,windows本机作客户端,在进行连接的时候,当我在客户端向服务端发送消息的时候,服务器端接收不到消息(安全组已经配置) 当执行上述命令出现

    2024年02月10日
    浏览(43)
  • Pinia基本概念

    面试题:Pinia 相比 Vuex 有什么样的优点?为什么现在官方推荐使用 Pinia ? Pinia,是一个 Vue 阵营的新的状态管理库,现在 Vue 官方已经推荐使用 Pinia 来代替 Vuex,或者你可以把 Pinia 看作是 Vuex 的最新的版本。 Pinia 的基本介绍 Pinia 优势 Pinia 是一个西班牙语的单词,表示“菠萝

    2024年02月11日
    浏览(30)
  • Pinia的基本使用

    Pinia(发音为 /piːnjʌ/,类似于英语中的“peenya”)是最接近有效包名 piña(西班牙语中的pineapple,即“菠萝”)的词。 菠萝实际上是一组单独的花朵,它们结合在一起形成一个多重水果。 与 Store 类似,每一家都是独立诞生的,但最终都是相互联系的。用来比喻把一个一个的

    2024年02月01日
    浏览(75)
  • 360连我wifi创建失败 360连我wifi创建失败原因解析及解决办法介绍

    360连我WiFi可以帮助你用无线网卡创建出一个无线热点,让无线网卡发射 WIFI 信号,可供其他电脑、手机等移动设备使用 WIFI 上网。360连我WiFi独立版是目前最简单最方便的电脑变Wifi虚拟路由软件。只要你是Windows 7/Windows 8操作系统;并且具有无线网卡;即可使用!傻瓜式的操作

    2024年02月06日
    浏览(99)
  • UE5.1.1创建C++工程失败解决办法

    闲来无事,更新了一下UE5.1.1,妈蛋创建C++项目居然失败, 错误截图如下: 妈蛋,后面一堆乱码,鬼知道是啥错误! 咋解决?步步高打火机,直接复制第一段的Running后面的代码到cmd中执行。 这下看的懂了, ‘dotnet’ 不是内部或外部命令,也不是可运行的程序 一般出现xxx不

    2024年02月01日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包