vue3 ts pinia

一、安装

npm install pinia

二、构建(main.ts)

1、引入

2、生成

3、使用

import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router'
// 1.引入
import {createPinia} from 'pinia'
const app = createApp(App)
// 2、生成
let pinia = createPinia()
app.use(router)
// 3.引用
app.use(pinia)
app.mount('#app')

 三、存储、读取、修改

1、存储

a、新建src/store/xx.ts,xx与组件名相同,用于区分

b、命名规则:use文件名Stroe,'文件名'

import {defineStore} from 'pinia'


export  const useCountStore = defineStore('count', {
    //  存储数据
    state() {
        return{
            sum: 10,
            name:'jojo'
        }
    },
    // 修改数据复杂逻辑
    actions:{},
    // state 简单数据操作
    getters:{
        maxSum(state){
            return state.sum * 10
        },
        upperName:state=>state.name.toUpperCase()
    }
})

2、读取数据

a、引入store

b、生成

c、使用

<template>
    <div class="count">
        <h2>结果:{{ countStroe.sum }}</h2> 
        <h2>姓名:{{ countStroe.upperName }}</h2>
        <select v-model="n">
            <option :value="1">1</option>
            <option :value="2">2</option>
            <option :value="3">3</option>
        </select>
        <button @click="add">加法</button>
        <button @click="sub">减法</button>
    </div>
</template>

<script lang="ts" setup name="Count">
    import { ref } from "vue";
    // 1.引入
    import { useCountStore} from '@/store/count'
    // 2.生成
    let countStroe = useCountStore()

    let n = ref(1)
    function add(){
        // sum.value += n.value
    }
    function sub(){
        // sum.value -= n.value
    }
</script>

3、使用

1、修改单个(直接)

function add(){
    // 1、简单修改
    countStroe.sum += n.value
}

2、批量修改($patch)

// 2.批量修改,键值对
countStroe.$patch({
    sum:20,
    name:'fake'
})

3、复杂逻辑(action)

a、store中对应的ts文件中,action中,写方法

b、在组件中调用 xx.Store.方法(参数)

数据调用

// add 是 store对象ts中 action的方法
countStroe.add(n.value)

修改方法

import {defineStore} from 'pinia'


export  const useCountStore = defineStore('count', {
    //  存储数据
    state() {
        return{
            sum: 10,
            name:'jojo'
        }
    },
    // 修改数据复杂逻辑
    actions:{
        add(value){
            this.sum += value
        }
    },
    // state 简单数据操作
    getters:{
        maxSum(state){
            return state.sum * 10
        },
        upperName:state=>state.name.toUpperCase()
        // upperName(state){
        //     return state.name.toUpperCase
        // }
    }
})

四、简化模板变量长度

1、过程

引入、解构

// 1.引入
import { useCountStore} from '@/store/count'
import {storeToRefs} from 'pinia'
// 2.生成
let countStroe = useCountStore()
// 解构
let {sum, upperName} = storeToRefs(countStroe)

2、简化前

<h2>结果:{{ countStroe.sum }}</h2> 
<h2>姓名:{{ countStroe.upperName }}</h2>

3、简化后

<h2>结果:{{ sum }}</h2> 
<h2>姓名:{{ upperName }}</h2>

五、$subscribe 订阅

1、当store中state的数据发生变化时,调用(执行)这个方法

2、例子

talkStore.$subscribe((mutate:any, state:any)=>{
    console.log(mutate);
    // state数据变化
    console.log(state);
})

 六、pinia的另一种 组合式写法,之前的是键值对写法,下面的是函数写法(在一起)(推荐)

import {defineStore} from 'pinia'
import {reactive} from 'vue'
import {nanoid} from 'nanoid';
// export  const useTalkStore = defineStore('talk',{
//     state() {
//         return{
//             talkList: reactive([
//                 {id:'01', content:'想送你很多很多口红,让你每天还我一点点'},
//                 {id:'02', content:'有一天我会拉着你的手,带你去看你最喜欢的星空'}
//             ])
//         }
//     },
//     actions:{
//         insert(){
//             let taklData =  {id:nanoid() ,content:"哈哈"}
//             this.talkList.unshift(taklData)
//         }
//     },
//     getters:{}
// })


export  const useTalkStore = defineStore('talk',()=>{
    // 相当于state
    let talkList = reactive([
        {id:'01', content:'想送你很多很多口红,让你每天还我一点点'},
        {id:'02', content:'有一天我会拉着你的手,带你去看你最喜欢的星空'}
    ])
    // 相当于action
    function insert(){
        let taklData =  {id:nanoid() ,content:"哈哈"}
        talkList.unshift(taklData)
    }
    return {talkList, insert}
})

 

 


 

posted @ 2025-03-16 21:37  市丸银  阅读(123)  评论(0)    收藏  举报