vue3 中使用 Pinia

1、安装Pinia

yarn add pinia

2、在 main.js/ts 中引入pinia, 本篇以js为例,ts中使用自己参考typeScript 添加类型

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

const app = createApp(App)
const pinia = createPinia()

app.use(router).use(pinia).mount('#app')

3、新建pinia 文件夹index.js 中代码如下

注意:最好每个模块有自己独立的文件,便于维护,若都书写在 index.js 文件中,在大型项目中会导致 index文件过于臃肿

import { createPinia } from 'pinia'
// 独立的用户信息模块
import user from '@/pinia/user'
// 整体pinia  入口
const pinia = createPinia()

export {
  pinia,
  user
}

3.1 独立模块定义
相比 vuex4 书写更简洁,并且没有 mutation 所有的提交集中在 actions 中

import { defineStore } from 'pinia'
// 定义pinia ,其中 login 是表示唯一的id
const useLoginStore = defineStore('login', {
// 这里的state 是箭头函数返回的对象,不是return出来的
  state: () => ({
  	// 这里的属性键名不能用getters actions中方法的名称重名;
    token: '',
    list: ['张三', '李四', '王五'],
    userInfo: null
  }),
  getters: {
  // 这个名称的方法是不对的,不能与state 中的键名 重名
  	userInfo(state) {
		return state.userInfo
	},
    userInfoToken(state) {
      return state.token
    },
    getUserInfo(state) {
      return state.userInfo
    }
  },
  actions: {
    setToken(value){
      this.token = value
      console.log('=setToken===state=---:', this.token)
      console.log('=setToken===value=---:', value)
      localStorage.setItem('token', this.token)
    },
    setUserInfo(value) {
      this.userInfo = value
      localStorage.setItem('userInfo', JSON.stringify(value))
    }
  }
})
export default useLoginStore

3.2、使用 user 模块

import { user } from '@/pinia'
...
setup() {
	// 非响应式
 const myUser = user()
 // 响应式
 const userInfo = reactive({
   userPinia:  user()
 })
...
// 方法中 直接使用如下
 // 调用 actions中方法
 userInfo.userPinia.setUserInfo(formRea.loginForm)
 // 直接使用 getters 中的getUserInfo  获取用户信息
 console.log('==getters==:', userInfo.userPinia.getUserInfo)
 // 想直接读取state 中属性,不能使用 reactive
 console.log('==state==:', myUser.list  )
 console.log('==state==:', myUser.userInfo  )
return {
  ...toRefs(userInfo)
 }
}
...

完整代码

<script>
import { reactive, toRefs } from '@vue/reactivity'
import { user } from '@/pinia'
// import { useRouter } from 'vue-router'
export default {
  name: "LoginIndex",
  components: {},
  props: {},

  setup() {
    // const myRouter = useRouter()
    const myUser = user()
    const userInfo = reactive({
      userPinia:  user()
    })
    const formRea = reactive({
      loginForm: {
        name: '',
        password:'',
        code: ''
      },
      onSubmitForm() {
        userInfo.userPinia.setToken(formRea.loginForm.password)
        console.log('==getToken==:', userInfo.userPinia.userInfoToken)
        console.log('==formRea.loginForm==:', formRea.loginForm.name)
        // 调用 actions中方法
        userInfo.userPinia.setUserInfo(formRea.loginForm)
        // 直接使用 getters 中的getUserInfo  获取用户信息
        console.log('==getters==:', userInfo.userPinia.getUserInfo)
        console.log('==state==:', myUser.list  )
        console.log('==state==:', myUser.userInfo  )
        // myRouter.replace({
        //   path: "/index",
        //   params: {}
        // })
      }
    })

    return {
      ...toRefs(formRea),
      ...toRefs(userInfo)
    }
  }
}
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刺客-Andy

努力将爱好变成更有价值的事物

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

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

打赏作者

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

抵扣说明:

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

余额充值