Vue3 pinia

1.简介

集中式状态(数据)管理

和vueX一样

2.安装pinia

npm i pinia
//引入 createApp用于创建应用
import {createApp} from 'vue';
//引入 App 根组件
import App from './App.vue';

//引入pinia
import {createPinia} from 'pinia';


//创建一个应用
const app = createApp(App);

//创建pinia
const pinia = createPinia();
//安装pinia
app.use(pinia);


//挂载整个应用到app容器中
app.mount('#app');

3.存储+读取数据

import {defineStore} from 'pinia';
//hooks命名
//1参数 是id值,最好跟文件名保持一致
export const useCountStore = defineStore('count',{
    //数据存储的地方
    state:()=>{
        return{
            sum:6
        }
    }
})
<template>
  <div class="count">
    <h2>当前求和为: {{ countStore.sum }}</h2>
    <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="minus">减</button>
  </div>
</template>

<script setup lang="ts" name="Count">
import { ref } from "vue";
import { useCountStore } from "@/store/count";//用pinia存储数据了,都是跟计算相关的

const countStore = useCountStore();

//以下两种方式都可以拿到state中的数据
// console.log(countStore.sum);//第一种获取数据的方式
// console.log(countStore.$state.sum);//第二种获取数据的方式

//数据
const n = ref(1);

function add(){
}

function minus(){
}

</script>

<style lang="css" scoped>
.count {
  background-color: skyblue;
  padding: 10px;
  border-radius: 10px;
  box-shadow: 0 0 10px;
}
.count * {
  margin-right: 5px;
}
</style>

4.修改数据 

<template>
  <div class="count">
    <h2>当前求和为: {{ countStore.sum }}</h2>
    <h3>欢迎来到: {{ countStore.school }} 坐落于 {{ countStore.address }}</h3>
    <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="minus">减</button>
  </div>
</template>

<script setup lang="ts" name="Count">
import { ref } from "vue";
//引入useCountStore
import { useCountStore } from "@/store/count";//用pinia存储数据了,都是跟计算相关的
//使用useCountStore,得到一个专门保存count相关的store
const countStore = useCountStore();

//以下两种方式都可以拿到state中的数据
// console.log(countStore.sum);//第一种获取数据的方式
// console.log(countStore.$state.sum);//第二种获取数据的方式

//数据
const n = ref(1);

function add(){
    //第一种修改方式
    // countStore.sum+=n.value;
    
    //第二种方式批量变更
    // countStore.$patch({
    //     sum:100,
    //     school:'尚硅谷',
    //     address:'beijing'
    // })

    // 第三种 方式
    countStore.increament(n.value);


}

function minus(){
}

</script>

<style lang="css" scoped>
.count {
  background-color: skyblue;
  padding: 10px;
  border-radius: 10px;
  box-shadow: 0 0 10px;
}
.count * {
  margin-right: 5px;
}
</style>
import { defineStore } from 'pinia';
//hooks命名
//1参数 是id值,最好跟文件名保持一致
export const useCountStore = defineStore('count', {
//actions 里面放置的是一个一个的方法,用于响应组件中的动作
    actions: {
        increament(value){
            console.log('increament 调用了!',value);
           console.log(this.sum);//this 是当前的countStore
           this.sum+=value
            
        }
    }
    ,
    //数据存储的地方
    state: () => {
        return {
            sum: 6,
            school: 'atguigu',
            address: '北京'
        }
    }

})

5.storeToRefs

<template>
  <div class="count">
    <h2>当前求和为: {{ sum }}</h2>
    <h3>欢迎来到: {{ school }} 坐落于 {{ address }}</h3>
    <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="minus">减</button>
  </div>
</template>

<script setup lang="ts" name="Count">
import { ref } from "vue";
import { storeToRefs } from "pinia";
//引入useCountStore
import { useCountStore } from "@/store/count";//用pinia存储数据了,都是跟计算相关的
//使用useCountStore,得到一个专门保存count相关的store
const countStore = useCountStore();
//storeToRefs 只会关注store中的数据,不会对方法进行ref包裹
const {sum,school,address} = storeToRefs(countStore);//将store中的数据映射到当前组件中,然后就可以直接使用


//以下两种方式都可以拿到state中的数据
// console.log(countStore.sum);//第一种获取数据的方式
// console.log(countStore.$state.sum);//第二种获取数据的方式

//数据
const n = ref(1);

function add(){
    //第一种修改方式
    // countStore.sum+=n.value;
    
    //第二种方式批量变更
    // countStore.$patch({
    //     sum:100,
    //     school:'尚硅谷',
    //     address:'beijing'
    // })

    // 第三种 方式
    countStore.increament(n.value);


}

function minus(){
    countStore.sum-=n.value;
}

</script>

<style lang="css" scoped>
.count {
  background-color: skyblue;
  padding: 10px;
  border-radius: 10px;
  box-shadow: 0 0 10px;
}
.count * {
  margin-right: 5px;
}
</style>

6.getters的使用 

相当于pinia的计算属性

import { defineStore } from 'pinia';
//hooks命名
//1参数 是id值,最好跟文件名保持一致
export const useCountStore = defineStore('count', {
//actions 里面放置的是一个一个的方法,用于响应组件中的动作
    actions: {
        increament(value:number){
            console.log('increament 调用了!',value);
           console.log(this.sum);//this 是当前的countStore
           this.sum+=value
            
        }
    }
    ,
    //数据存储的地方
    state: () => {
        return {
            sum: 6,
            school: 'atguigu',
            address: '北京'
        }
    },
    getters:{
        bigsum(){
            return this.sum*10;
        },
        bigschool(store):string{
            console.log(store);
            
            return store.school.toUpperCase();
        }
    }

})
const {sum,bigschool,address,bigsum} = storeToRefs(countStore);

7.$subscribe

<template>
  <div class="talk">
    <button @click="getLoveTalk">获取一句土味情话</button>
    <ul>
      <li v-for="item in talkList" :key="item.id">
        {{ item.talk }}
      </li>
    </ul>
  </div>
</template>

<script setup lang="ts" name="LoveTalk">
import { useLoveTalkStore } from "@/store/loveTalk";
import { storeToRefs } from "pinia";
const loveTalkStore = useLoveTalkStore();

const { talkList } = storeToRefs(loveTalkStore);

loveTalkStore.$subscribe((mutate,state)=>{
    console.log('talkStore里面保存的数据发生了变化');
    console.log(mutate);

    localStorage.setItem('talkList',JSON.stringify(state.talkList))

    console.log(state);
    
    
})

 function getLoveTalk() {
 loveTalkStore.getTalk();
}
</script>

<style lang="css" scoped>
.talk {
  background-color: orange;
  padding: 10px;
  border-radius: 10px;
  box-shadow: 0 0 10px;
}
</style>
import { defineStore } from "pinia";
import axios from "axios";
import { nanoid } from "nanoid";
export const useLoveTalkStore = defineStore('loveTalk', {
    actions:{
       async getTalk(){
        let {
            data: { content: talk },
          } = await axios.get("https://api.uomg.com/api/rand.qinghua?format=json");
          // talkList.push({
          //     id:nanoid(),
          //     talk
          // })
        
          this.talkList.push({
            id: nanoid(),
            talk: talk,
          });
        }
    },
    state: () => {
        return {
            talkList: JSON.parse(localStorage.getItem('talkList') as string || '[]')
        }
    }
})

8.store组合式写法

import { defineStore } from 'pinia';
//hooks命名
//1参数 是id值,最好跟文件名保持一致
// export const useCountStore = defineStore('count', {
// //actions 里面放置的是一个一个的方法,用于响应组件中的动作
//     actions: {
//         increament(value:number){
//             console.log('increament 调用了!',value);
//            console.log(this.sum);//this 是当前的countStore
//            this.sum+=value
            
//         }
//     }
//     ,
//     //数据存储的地方
//     state: () => {
//         return {
//             sum: 6,
//             school: 'atguigu',
//             address: '北京'
//         }
//     },
//     getters:{
//         bigsum(){
//             return this.sum*10;
//         },
//         bigschool(store):string{
//             console.log(store);
            
//             return store.school.toUpperCase();
//         }
//     }

// })

import { ref ,computed} from 'vue';
export const useCountStore = defineStore('count',()=> {
        const sum = ref(0)
        const school = ref('atguigu')
        const address = ref('北京')
   
        const bigsum = computed(()=>{
            return sum.value*10;
        })
        const bigschool = computed(()=>{
            return school.value.toUpperCase();
        })

        function increament(value:number){
            console.log('increament 调用了!',value);
           console.log(sum.value);//this 是当前的countStore
           sum.value+=value
            
        }

        return {sum,school,address,bigsum,bigschool,increament};
    })

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值