pinia学习+创建vue3项目

vue3创建项目

npm init vue@latest
然后写项目名称
进行插件安装 yes/no
npm i 
然后npm run dev  启动非常快

搭建pinia环境

1、npm install pinia
2、操作src/main.ts

import { createApp } from 'vue'
import App from './App.vue'

/* 引入createPinia,用于创建pinia */
import { createPinia } from 'pinia'

/* 创建pinia */
const pinia = createPinia()
const app = createApp(App)

/* 使用插件 */{}
app.use(pinia)
app.mount('#app')

创建store 组合式写法

1、sotre有三个概念:state、getter、action,相当于组件中的:data,computed,methods
项目中store 文件夹下counter.js

import { ref, computed } from 'vue'
import { defineStore } from 'pinia'

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  const doubleCount = computed(() => count.value * 2)
  function increment() {
    count.value++
  }

  return { count, doubleCount, increment }
})
//相当于定义了一个模块叫counter
//ref相当于state
//computed相当于getters
//function相当于actions
//不存在mutation  区别是actions支持异步

使用

<template>
<h1>{{countStore.count}}</h1>
<button @click="countStore.increment()">+1</button>
</template>
<script setup>
import { useCounterStore } from '../stores/couter'
const countStore = useCounterStore()
//拿到数据
//console.log(countStore.sum)
//console.log(countStore.$state.sum)
</script>

修改数据

1、直接修改

countStore.sum = 666

2、$patch直接修改

countStore.$patch({
	sum:999,
	school:'nihao'
})

3、借助actions修改(action中可以编写一些业务逻辑)
store/count.js

import { defineStore } from 'pinia'

export const useCountStore = defineStore('count', {
  /*************/
  actions: {
    //加
    increment(value:number) {
      if (this.sum < 10) {
        //操作countStore中的sum
        this.sum += value
      }
    },
    //减
    decrement(value:number){
      if(this.sum > 1){
        this.sum -= value
      }
    }
  },
  /*************/
})

组件中直接调用

// 使用countStore
const countStore = useCountStore()
// 调用对应action
countStore.incrementOdd(n.value)

推荐修改state值用actions,不建议直接state.xx = 数据 也可以使用$patch

storeToRefs

想要使用store数据不用store.xxx
需要用到storeToRefs
storeToRefs只会关注store中的数据,不会对方法进行ref包裹

import { useTalkStore } from '@/stores/loveTalk'
import { storeToRefs } from 'pinia'
const talkStore = useTalkStore()
const { talkList } = storeToRefs(talkStore)
console.log('!!!!', storeToRefs(talkStore))

打印结果如下:
在这里插入图片描述
可见只把数据变成了ref

注意:为什么不用toRefs
原因如下:

import { useTalkStore } from '@/stores/loveTalk'
import { toRefs } from 'vue'
const talkStore = useTalkStore()
const { talkList } = toRefs(talkStore)
console.log('!!!!', toRefs(talkStore))

此时打印结果是在这里插入图片描述
他把数据以及方法所有的都变成了ref,没有必要

getters

// 引入defineStore用于创建store
import {defineStore} from 'pinia'

// 定义并暴露一个store
export const useCountStore = defineStore('count',{
  // 动作
  actions:{
    /************/
  },
  // 状态
  state(){
    return {
      sum:1,
      school:'atguigu'
    }
  },
  // 计算,两种写法
  getters:{
  	//第一种写法,箭头函数
    bigSum:(state):number => state.sum *10,
    //第二种写法:非箭头函数
    upperSchool():string{
      return this. school.toUpperCase()
    }
  }
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值