数据仓库Pinia

1.下载仓库(npm install pinia)

2.创建一个 pinia(根存储)并将其传递给应用程序:

import { createPinia } from 'pinia'

let app=createApp(App)

app.use(createPinia())

3.创建需要的仓库,使用 defineStore() 创建store,并且它需要一个唯一名称,作为第一个参数传递,并将仓库导出

import { defineStore } from 'pinia'
//导出仓库的两种方法1
export const useCar = defineStore("car", {
	state: () => {
		return { msg: "carhello 仓库的数据" }
	}})
//导出仓库的两种方法2
 const useCar = defineStore("car", {
	state: () => {
		return { msg: "carhello 仓库的数据" }
	}})
export default useCar ;

4.使用仓库

<script setup>
// 所有组件都可以使用仓库
// 引入仓库
import { useCar } from "../store/car";
// 实例化仓库
let Boxcar = useCar();
// 使用仓库
console.log(Boxcar.age);
</script>
<template>
  <div>
    我是BOx1组件中的内容
    <p @click="fn">{{ Boxcar.msg }}</p>
  </div>
</template>

改变仓库数据的方式1:通过直接对仓库数据进行修改,因为仓库数据是响应式的,使用所有使用该数据的组件或者标签都会改变

<script setup>
import { useCar } from "../store/car";
import { ref } from "vue";
let a = ref("变");
let store = useCar();

let fn = () => {
  a.value = store.msg;
  console.log(store.msg);
};
// 仓库数据是响应式的 修改仓库数据后使用仓库的数据都会响应式修改
let fm1 = () => {
  store.msg = "store.msg修改了仓库数据";
  console.log(store.msg);
};
</script>
<template>
  <div>
    <h1>page1</h1>
    <p>{{ a }}</p>
    <button @click="fn">点击获取数据</button>
    <button @click="fm1">psge1组件修改仓库数据</button>
  </div>
</template>

<style></style>

改变仓库数据的方式2:将仓库数据解构赋值后通过toRefs或者toRef改变成响应式数据

<script setup>
import { useCar } from "../store/car";
import { toRefs, toRef } from "vue";
let Page2Car = useCar();
// 解构赋值 注意这里的msg不是响应式数据
// let { msg } = Page2Car;
// 等同于 let msg=ref(Page2Car.msg)
// 使用torefs
// let { msg } = toRefs(Page2Car);
// 使用toref
let msg = toRef(Page2Car, "msg");
let fn = () => {
  msg.value = "解构赋值然后修改仓库数据";
};

</script>
<template>
  <div>
    <h1>page2</h1>
    <p>{{ Page2Car.msg }}</p>
    <button @click="fn">psge2组件修改仓库数据</button><br />
  </div>
</template>

<style></style>

批量修改仓库数据:

<script setup>
// export default 导出的仓库名引入不加{}
import a from "../store/user.js";
let Page3User = a();
// console.log(Page3User);
// 批量修改 仓库调用$patch方法
let fn = () => {
  Page3User.$patch({
    count: 30,
    price: 40,
  });
};
// 批量修改第二种方法 给patch传一个函数
let fm = () => {
  Page3User.$patch(() => {
    Page3User.count++, Page3User.price++;
  });
};
// $subscribe state就是修改后的值
Page3User.$subscribe((n1, state) => {
  console.log("仓库修改就会运行", state, n1);
});
</script>
<template>
  <div>
    <h1>page3</h1>
    <p>{{ Page3User.count }}---{{ Page3User.price }}</p>
    <button @click="fn">psge3组件批量修改仓库数据</button><br />
    <button @click="fm">psge3组件批量修改仓库数据</button>
  </div>
</template>

<style></style>

重置仓库数据

let fm = () => {
  Page2Car.$reset();
};

getters:Getter 完全等同于 Store 状态的 计算值(相关值不变不会重新运行,取缓存中的值)。 他们接收“状态”作为第一个参数以鼓励箭头函数的使用,state代表this

actions:它可以异步同步的统一修改状态,之所以提供这个功能 就是为了项目中的公共修改状态的业务统一

使用:

import { defineStore } from 'pinia'

export const useCar = defineStore("car", {
	state: () => {
		return { msg: "carhello 仓库的数据" }
	},
	getters: {
		age: (state) => {
			return state.msg = "688888"
		}
	},
	// 使用直接调函数
	actions: {
		tool(state) {
			// 用this修改
			this.msg = "actions"

		}
	}
})

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

思考猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值