pinia的基本使用

  • 没有mutation、没有嵌套模块,相对vuex对ts有更好的支持

点我看官网链接

一、安装

npm install pinia

二、初始化配置

src\main.ts

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import { createPinia } from 'pinia'

// 创建pinia实例
const pinia = createPinia()

const app = createApp(App)

// 挂载到vue根实例
app.use(pinia)
app.mount('#app')

三、基本使用

3.1创建store并使用state的值

  • src\store\index.ts
import { defineStore } from "pinia";

// 1.定义并导出容器
//参数1:容器的ID,必须唯一,将来pinia会把所有的容器挂载到根容器
//参数2:选项对象
//返回值:一个函数,调用得到容器实例
export const useMainStore = defineStore('main', {
    /**
     * 类似组件的data,用来储存全局状态的
     * 1.必须是函数:这样是为了服务端渲染的时候避免交叉请求导致的数据状态污染
     * 2.必须是箭头函数
     */
    state: () => {
        return {
            count: 19
        }
    },
    /**
     * 类似于组件的computed,用来封装计算属性,有缓存的功能
     */
    getters: {},
    /**
     * 类似于组件的methods,封装业务逻辑,修改state
     */
    actions: {}
})
  • src\components\HelloWorld.vue
  • 注意直接不要解构拿值,否则不是响应式,要使用官方的storeToRefs()
<script setup lang="ts">
import { storeToRefs } from "pinia";
import { useMainStore } from "../store/index";
const mainStore = useMainStore();
const { count } = storeToRefs(mainStore);
console.log(mainStore.count);
const handleChangState = () => {
  mainStore.count++;
};
</script>

<template>
  {{ mainStore.count }}=============={{ count }}
  <button @click="handleChangState">按钮</button>
</template>

<style scoped>
.read-the-docs {
  color: #888;
}
</style>


在这里插入图片描述

3.2状态更新与actions

  • 多个数据修改的情况下,使用$patch进行批量修改性能好

src\store\index.ts

import { defineStore } from "pinia";

// 1.定义并导出容器
//参数1:容器的ID,必须唯一,将来pinia会把所有的容器挂载到根容器
//参数2:选项对象
//返回值:一个函数,调用得到容器实例
export const useMainStore = defineStore('main', {
    /**
     * 类似组件的data,用来储存全局状态的
     * 1.必须是函数:这样是为了服务端渲染的时候避免交叉请求导致的数据状态污染
     * 2.必须是箭头函数
     */
    state: () => {
        return {
            count: 19
        }
    },
    /**
     * 类似于组件的computed,用来封装计算属性,有缓存的功能
     */
    getters: {},
    /**
     * 类似于组件的methods,封装业务逻辑,修改state
     */
    actions: {
        handleState(num: number) {
            this.count += num
        }
    }
})

src\components\HelloWorld.vue

<script setup lang="ts">
import { storeToRefs } from "pinia";
import { useMainStore } from "../store/index";
const mainStore = useMainStore();
const { count } = storeToRefs(mainStore);
const handleChangState = () => {
  // 方法一:
  // mainStore.count++;
  // 方法二:
  // mainStore.$patch({
  //   count: mainStore.count + 1,
  // });
  // 方法三:
  // mainStore.$patch((state) => {
  //   state.count++;
  // });
  // 方法四:
  mainStore.handleState(10);
};
</script>

<template>
  {{ mainStore.count }}=============={{ count }}
  <button @click="handleChangState">按钮</button>
</template>

<style scoped>
.read-the-docs {
  color: #888;
}
</style>

3.3getters

src\store\index.ts

import { defineStore } from "pinia";

// 1.定义并导出容器
//参数1:容器的ID,必须唯一,将来pinia会把所有的容器挂载到根容器
//参数2:选项对象
//返回值:一个函数,调用得到容器实例
export const useMainStore = defineStore('main', {
    /**
     * 类似组件的data,用来储存全局状态的
     * 1.必须是函数:这样是为了服务端渲染的时候避免交叉请求导致的数据状态污染
     * 2.必须是箭头函数
     */
    state: () => {
        return {
            count: 19
        }
    },
    /**
     * 类似于组件的computed,用来封装计算属性,有缓存的功能
     */
    getters: {
        count10(state) {
            console.log('看一下有没有被缓存')
            return state.count + 10
        }
    },
    /**
     * 类似于组件的methods,封装业务逻辑,修改state
     */
    actions: {
    }
})
<script setup lang="ts">
import { storeToRefs } from "pinia";
import { useMainStore } from "../store/index";
const mainStore = useMainStore();
</script>

<template>
  {{ mainStore.count10 }}
  {{ mainStore.count10 }}
  {{ mainStore.count10 }}
</template>

<style scoped>
.read-the-docs {
  color: #888;
}
</style>

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pinia是Vue的官方状态管理库,用于在Vue3项目中实现数据共享。下面是使用Pinia基本步骤: 1. 安装Pinia:在Vue3项目中,使用npm或yarn安装Pinia库。 2. 创建Pinia实例:在项目的入口文件中,创建一个Pinia实例并将其导出。 3. 定义状态:在需要共享状态的组件中,使用`defineStore`函数定义一个状态存储对象。 4. 注册状态:在组件中使用`useStore`函数注册状态,并在模板中使用。 5. 使用状态:在组件中可以通过`$store`访问状态,并在模板中使用。 下面是一个使用Pinia的示例代码: ```javascript // main.js 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') // store.js import { defineStore } from 'pinia' export const useCounterStore = defineStore('counter', { state: () => ({ count: 0 }), actions: { increment() { this.count++ }, decrement() { this.count-- } } }) // Counter.vue <template> <div> <p>Count: {{ $store.counter.count }}</p> <button @click="$store.counter.increment()">Increment</button> <button @click="$store.counter.decrement()">Decrement</button> </div> </template> <script> import { useCounterStore } from './store' export default { setup() { const counterStore = useCounterStore() return { counterStore } } } </script> ``` 在上面的示例中,我们首先在`main.js`中创建了一个Pinia实例,并将其应用于Vue应用。然后,在`store.js`中定义了一个名为`counter`的状态存储对象,其中包含一个名为`count`的状态和两个操作。最后,在`Counter.vue`组件中使用`useCounterStore`函数注册状态,并在模板中使用`$store.counter.count`访问状态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值