vue3中pinia基本使用

一、安装以及引入

  • 安装:npm install pinia
  • main.js文件:
javascript 复制代码
import { createApp } from "vue";
import { createPinia } from "pinia";
import App from "./App.vue";

const pinia = createPinia()
const app = createApp(App)
app.use(pinia)
    .mount("#app");

二、使用

1、基本使用

新建store/Count/index.js

javascript 复制代码
import { defineStore } from "pinia";
import { personStore } from "../Person/index";
export const useCounterStore = defineStore('counter', {
    // state: ()=>({name: 'alice',count: 0}),
    state: () => {
        return {
            count: 10,
            content: '~',
            users: [
                {name: 'alice', id: 1},
                {name: 'jack', id: 2},
                {name: 'rose', id: 3},
            ]
        }
    },
    getters: { 
        doubleCount: (state) => state.count * 2,
        // doublePlusOne:(state)=> state.doubleCount+1
        doublePlusOne() {
            return this.doubleCount + 1 // 可以访问其他getter
        },
        getUserById: (state) => { //  getter是计算属性 不可以向getter传递参数,可以从getter返回函数 给该函数可以传递参数
            return (userId) => state.users.find((user) => user.id === userId)
        },
        // 访问其他store
        getOtherStoreName:(state)=>{
            const perStore=personStore()
            return perStore.username+state.content
        }
    },
    actions: {
        increment() {
            this.count++
        },
        randomizeCounter(){
            this.count=Math.round(100*Math.random())
        }
    }
})

新建store/Person/index.js:

javascript 复制代码
import { defineStore } from "pinia";
export const personStore = defineStore('person', {
    state: () => {
        return {
            username: 'alice',
            age: 18,
     		sum: 0
        }
    },
    getters: {
        getName: (state) => `姓名:${state.username}`
    },
    actions: {
        changeName() {
            this.username = this.username + '~'
        }
    }
})

// 写法二
import {computed, ref} from 'vue'
export const personStore1 = defineStore('person', ()=>{
    const username=ref('alice')
    const age=ref(18)
    const sum=ref(0)
    const getName=computed(()=>`姓名: ${username.value}`)
    function changeName() {
        this.username=this.username+'~'
    }
    return {username,getName,changeName}
})

App.vue文件使用:

javascript 复制代码
<template>
  <div class="app">
   <ul>
    <li> count:{{ countStore.count }} {{ countStore.content }}</li>
    <li>double: {{ countStore.doubleCount }}</li>
    <li>double+1: {{ countStore.doublePlusOne }}</li>
   </ul>
   <div>{{ countStore.getUserById(3) }}</div>
  </div>
</template>

<script setup name="App">
import { useCounterStore } from "./store/Count";
import { personStore } from "../Person/index";
import { computed } from "vue";

const countStore = useCounterStore();
const userInfoStore = personStore()

// 作为action的increment可以直接解构
const {increment}=countStore
const doubleValue = computed(() => countStore.doubleCount);
console.log(countStore.count) // 访问仓库
// 通过subscribe方法监听state变化
countStore.$subscribe((mutation,state)=>{
	// 操作
})

// 修改仓库数据
// 第 1 种,直接修改
userInfoStore.sum = 99
// 第 2 种,利用 $patch 批量修改
userInfoStore.$patch({
  sum: 110,
  username: 'rose'
})
// 第 3 种,在 actions 中修改. 定义函数,this.xxx = xxx
</script>
2、插件使用

插件是一个函数,通过pinia.use()这个函数传递给pinia。插件接收一个可选参数context。该参数是一个包含app、pinia、store等实例的对象。

如果这个函数有返回值,返回值为一个对象,则该对象的所有属性都会被添加到每个store上。

每创建一个store实例,这个插件函数都会执行一遍。
main.js

javascript 复制代码
import { createApp } from "vue";
import { createPinia } from "pinia";
import App from "./App.vue";

const pinia = createPinia()
// 创建的每个 store 中都会添加一个名为 `secret` 的属性。
// 在安装此插件后,插件可以保存在不同的文件中
function SecretPiniaPlugin(context) {
  return { secret: 'the cake is a lie' }
}
// 将该插件交给 Pinia
pinia.use(SecretPiniaPlugin) // 将函数返回值secret作为静态属性添加到所有的store
pinia.use(content=>{
    console.log(content, content.store);
    
})

pinia.use(()=>({hello: 'world'}))
pinia.use(({store})=>{ // 最好使用返回对象的方法,以便于被开发者工具自动追踪
    store.address='newAddress'
})

const app = createApp(App)
app.use(pinia)
    .mount("#app");

在vue文件中使用:

javascript 复制代码
<template>
  <div class="app">  </div>
</template>

<script setup name="App">
import { useCounterStore } from "./store/Count";

const countStore = useCounterStore();

console.log(countStore.secret,'---'); // the cake is a lie---
</script>
相关推荐
秃头网友小李2 天前
前端难点:keep-alive 缓存什么?RouterView 的 key 为什么要带 scopeId?
前端·vue.js
徐小夕2 天前
JitWord 3.0 正式发布,高精度Word异构解析+复杂组件兼容,打造web端协同Word编辑器
前端·vue.js·算法
奋斗吧程序媛2 天前
补充一个小知识点:有关@click.native
前端·vue.js
英勇无比的消炎药2 天前
一行命令背后:TinyRobot CLI 如何重构 AI 对话接入的效率范式
vue.js·aigc
jay神3 天前
基于 FastAPI + Vue 的宠物领养管理系统
前端·vue.js·python·毕业设计·fastapi·宠物
一杯奶茶¥3 天前
水果销售网站 CRM客户信息管理系统 超市管理系 酒店管理系统 健身房管理系统 在线音乐网站 校园招聘系统
java·vue.js·spring boot·mysql·spring·java项目
英勇无比的消炎药3 天前
一站式搞定品牌风格:TinyRobot 主题定制从入门到精通
vue.js
尽欢i3 天前
Vue3 customRef 封神教程:防抖、本地存储、自动埋点一套搞定,模板干干净净
前端·javascript·vue.js
因_崔斯汀3 天前
Vue 模板编译:HTML 是怎么变成 JS 的?
前端·vue.js
英勇无比的消炎药3 天前
样式随心定制:TinyRobot 样式覆写与 CSS 变量实战解析
vue.js