定制网站Vue3-Pinia的基本使用

什么是呢?

Pina定制网站开始于大概2019,是一个定制网站状态管理的库,用于跨组件、定制网站页面进行状态共享(这和Vuex、一样),定制网站用起来像组合式API(Composition API)

Pinia和Vuex的区别

  • PInia定制网站的最初是为了探索Vuex定制网站的下一次迭代会是什么样子,结合了Vuex定制网站核心团队讨论中的许多想法;
  • 最终,定制网站团队意识到Pinia定制网站已经实现了Vuex5中大部分内容,所以最终决定用Pinia来替代Vuex;
  • 与Vuex相比,Pinia提供了一个更简单的API,具有更少的仪式,提供了Composition-API风格的API
  • 更重要的是,与TypeScript一起使用时具有可靠的类型推断支持

与Vuex相比,Pinia很多的优势:

比如mutations不再存在:

  • mutations最初是为devtools集成,但这不在是问题
  • 他们经常认为是非常冗长

更友好的TpeScipt支持,Vuex之前对Ts的支持很不友好

不在有modules的嵌套结构

  • 你可以灵活使用每一个store,他们是通过扁平化的方式来相互使用的;

不在有命名空间的概念,不在需要记住他们的复杂关系

如何使用Pinia

1、安装Pinia

  • yarn add pinia
  • npm install pinia

2、创建pinia文件

store文件里index.js

import { createPinia } from 'pinia'const pinia = createPinia()export default pinia
  • 1
  • 2
  • 3
  • 4
  • 5

3、main.js导入并引用

import { createApp } from 'vue'import App from './App.vue'import pinia from './stores'createApp(App).use(pinia).mount('#app')
  • 1
  • 2
  • 3
  • 4
  • 5

4、pinia的状态管理,不同状态可以区分不同文件

//定义关于counter的storeimport { defineStore } from ‘pinia’//defineStore 是返回一个函数 函数命名最好有use前缀,根据函数来进行下一步操作const useCounter = defineStore('counter',{	state: () => {		count:99	}})export default useCounter
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5、调用pinia,获取pinia状态值,导入Counter.js,获取Counter.js里面state.count

<template>  <div class="home">    <h2>Home View</h2>    <h2>count: {{ counterStore.count }}</h2>  </div></template><script setup>  import useCounter from '@/stores/counter';  const counterStore = useCounter()</script><style scoped></style>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

注意:pinia解构出来的state也是可以调用,但会失去响应式,需要toRef或者pinia自带storeToRefs

<template>  <div class="home">    <h2>Home View</h2>    <h2>count: {{ counterStore.count }}</h2>    <h2>count: {{ count }}</h2>    <button @click="incrementCount">count+1</button>  </div></template><script setup>  import { toRefs } from 'vue'  import { storeToRefs } from 'pinia'  import useCounter from '@/stores/counter';  const counterStore = useCounter()  // const { count } = toRefs(counterStore)  const { count } = storeToRefs(counterStore)  function incrementCount() {    counterStore.count++  }</script><style scoped></style>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

store的核心部分:state,getter,action

相当于:data、computed、methods

认识和定义State

state是store的核心部分,因为store是用来帮助我们管理状态

操作State

  1. 读取和写入state:

    默认情况下,可以通过store实例访问状态来直接读取和写入状态;

    ```const counterStore = useCounter()counterStore.counter++counterStore.name = 'coderWhy'```
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  2. 重置State:
    可以调用store上的$reset()方法将状态重置到其初始值

    const counterStore = useCounter()conterStore.$reset()
    • 1
    • 2
  3. 改变State

    • 除了直接用store.counter++修改store,还可以调用$patch

    • 它允许您使用部分‘state’对象同时应该多个修改

    const counterStore = useCounter()counterStore.$patch({	counter:100,	name:'kobe'})
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  4. 替换State
    可以通过将其$state属性设置为新对象替换Store的整个状态

    conterStore.$state = {	counter:1,	name:'why'}
    • 1
    • 2
    • 3
    • 4

认识和定义Getters

  • Getters相当于Store的计算属性:

    1. 它们可用defineStore()中的getters属性定义
    2. getters中可以定义接受一个state作为参数的函数
    expoer const useCounter = defineStore('counter',{	state: () => {		counter:100,		firstname:'kobe'	},	getters:{		doubleCounter(state){			return state.counter *2		}	}})
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 访问Store里getters方法

    1. 访问当前store的getters:

      const counterSotre = useCounter()console.log(counterStore.doublCounter)
      • 1
      • 2
    2. 我们可以使用this来访问当前的store实例中getters

      expoer const useCounter = defineStore('counter',{	state: () => {		counter:100,		firstname:'kobe'	},	getters:{		doubleCounter(state){			return state.counter *2		}		doubleCounterAdd(){			//this指向store			return this.doubleCounter +1 		}	}})
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
    3. 访问其它store的getters

      import useUser from ./userconst userStore = useUser()expoer const useCounter = defineStore('counter',{	state: () => {		counter:100,		firstname:'kobe'	},	getters:{	//调用其它Store		doubleCounterUser(){			return this.doubleCounter + userStore.umu		}	}})
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
    4. 通过getters可以返回一个函数,可以传参数

      expoer const useCounter = defineStore('counter',{	state: () => {		counter:100,		firstname:'kobe'	},	getters:{	//调用其它Store		doubleCounter(state){			return function (is) {				return state.id + id			}		}	}})
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      const StoreConter = useCounter();//传参StoreCounter.doublCounter(111)
      • 1
      • 2
      • 3

认识和定义Actions

  • Actions 相当于组件中的methods,可以使用defineStore()中的actions属性定义

    expoer const useCounter = defineStore('counter',{	state: () => {		counter:100,		firstname:'kobe'	},	getters:{	//调用其它Store		doubleCounter(state){			return function (is) {				return state.id + id			}		}	},	actions:{		increment(){			this.counter++		},		//传参		incrementnum(num){			this。counter += num		}	}})
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    和getters一样,在action中可以通过this访问整个store实例:

    function increment(){	//调用	counterStore.increment()}function incrementnum(){	counterStore.increment(10)}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

Actions执行异步操作:

  • Actions中是支持异步操作的,并且我们可以编写异步函数,在函数中使用await

    actions:{	async fetchHome(){		//???请求		const res = await fetch('?????')		const data = await res.json()		console.log('data',data)		return data	}}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    cosnt counterStore = useCountercounterStore.fetchHome().then(res => {	console.log(res)})
    • 1
    • 2
    • 3
    • 4
    • 5
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发