【Vue3 入门到实战】11. Pinia 状态管理

目录

1. 搭建 Pinia 环境

1.1 准备一个效果

1.2 搭建 pinia  

2. 存储+读取数据

2.1 存储数据

2.1 组件中读取数据 

3. 修改数据 

3.1 直接修改

3.2 批量修改  

3.3 借助 actions 修改 

4. storeToRefs

 5. getters

6. $subscribe

7. 总结 


 

Pinia 是一个用于 Vue 3 的状态管理库,类似于 vue2 中的 vuex,

Pinia 不像 Vuex 那样有严格的规则(如必须使用 mutations 来修改状态),这使得代码更加灵活。

1. 搭建 Pinia 环境

1.1 准备一个效果

Sum.vue 组件 

<template>
    <div class="sum">
        <h2>当前求和为{
  { sum }}</h2>
        <div class="btn">
            <select v-model.number="n">
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
            </select>
            <button @click="add">加</button>
            <button @click="subtract">减</button>
        </div>
    </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
let sum = ref(0);
let n = ref(1);

function add() {
    sum.value += n.value;
}

function subtract() {
    sum.value -= n.value;
}
</script>

<style>
.sum {
    width: 400px;
    height: 100px;
    background: skyblue;
    border-radius: 10px;
    padding: 10px;
}
.btn {
    display: flex;
    gap: 20px;
}
</style>

LoveTalk 组件 

<template>
    <div class="love-talk">
        <button @click="getTalk">获取一句土味情话</button>

        <ul>
            <li v-for="item in list" :key="item.id">
                {
  {item.content}}
            </li>
        </ul>
    </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import  axios  from 'axios'
import  { nanoid }  from 'nanoid'
import { useTalkStore} from '@/store/talk'

let talkStore = useTalkStore()
let list = ref([
    {
        id:1,
        content:'今天你有点怪,哪里怪?怪好看的'
    },
    {
        id:2,
        content:'草莓、蓝莓、蔓越莓,今天想我了没'
    },
    {
        id:3,
        content:'心里给你留了一块地,我的死心踏地'
    },
])

async function getTalk() {
    let result = await axios.get('https://api.uomg.com/api/rand.qinghua')
    
   let obj = {
    id:nanoid(),
    content:result.data.content
   }

   list.value.unshift(obj);
   console.log(list.value)
}
</script>

<style>
.love-talk{
 width: 500px;
 height: auto;
 padding: 20px;
 background-color: salmon;
 border-radius: 10px;
 box-shadow: 0 0 10px rgba(0,0,0,.1);
 margin-top: 30px;
}
</style>

 App.vue 组件

<template>
  <div class="app">
    <h2 class="title">pinia测试效果</h2>
    <Sum />
    <LoveTalk />
  </div>
</template>

<script lang="ts" setup name="App">
import Sum from '@/components/Sum.vue'
import LoveTalk from './components/LoveTalk.vue';
</script>

1.2 搭建 pinia  

下载pinia

npm install pinia

main.ts 注册pinia 

 import { createApp } from 'vue'
 import App from './App.vue'
//  引入createPinia,用于创建 pinia
 import { createPinia } from 'pinia';

 // 创建pinia
 const pinia = createPinia();
 const app = createApp(App);
 // 将pinia挂载到app上
 app.use(pinia)
 app.mount('#app')

此时开发者工具上已经有了 pinia 选项 ↓ ↓ ↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

借来一夜星光

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

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

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

打赏作者

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

抵扣说明:

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

余额充值