淘先锋技术网

首页 1 2 3 4 5 6 7

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>