博客列表 >VUE3 VUEX、pinia使用方法和原理

VUE3 VUEX、pinia使用方法和原理

搁浅
搁浅原创
2023年10月13日 19:32:20289浏览

模块化路径 store/modules/user.js

  1. const ModuleUser = {
  2. namespaced: true,//开启命名空间
  3. state: {
  4. id: "默认ID",
  5. username: "默认名字",
  6. photo: "默认头像",
  7. },
  8. getters: {
  9. },
  10. mutations: {//这是做同步操作
  11. updateUser(state,user){
  12. console.log(user)
  13. state.id = user.id;
  14. state.username = user.username;
  15. },
  16. },
  17. actions: {//写异步操作,actions提交给mutations
  18. },
  19. modules: {
  20. }
  21. };
  22. export default ModuleUser;

VUEX store/index.js

npm install —save vuex-persistedstate持久化插件安装

  1. import {createStore} from 'vuex'
  2. import createPersistedState from "vuex-persistedstate"
  3. import user from './modules/user'
  4. export default createStore{
  5. // 1.存储所有全局数据,可以把state理解为data,声明变量;mutations理解为method,声明方法
  6. state:{// 状态管理
  7. isLogin:true,
  8. num:2,
  9. num2:3
  10. },
  11. // 2.这里写计算属性,需要通过计算获取state里的内容获取的数据,只能读取不可修改
  12. getter:{
  13. tols:(state) => state.num+state.num2
  14. },
  15. // 3.定义对state的各种操作
  16. // why不直接实现在mutation里需要写到action里?
  17. // mtations不能执行异步操作。aq:从云端获取信息-->(等待云端反馈)更新到state异步操作
  18. // 因此说:对于异步操作需要放到action里,简单的直接赋值操作可以直接放到mutation里
  19. mutations:{//这里些方法, 模板通过commit提交修改state里面的数据
  20. sub(state,content){//第1是state状态状态数据,第2是commit提交收到的数据
  21. state.num=content+1
  22. },
  23. add2(state){
  24. state.num++
  25. }
  26. },
  27. // 4、定义对state的各种操作
  28. // actions无法直接修改state,需要在mutations里更新
  29. // mutation不支持异步,所以需要在action里写api到url
  30. actions:{// Actions异步处理操作
  31. updatenum({commit},content) {
  32. commit('sub', content)
  33. }
  34. },
  35. modules:{// 模块划分,内容太多不会显得很臃肿。
  36. user
  37. },
  38. plugins: [createPersistedState({
  39. //储存的方式localStoragese、sessionStorage、cookies
  40. storage: window.localStorage,
  41. //存储的 key的key值
  42. key:'store',
  43. //要存储的数据:采用es6扩展运算符的方式存储了state中所有的数据
  44. reducer(state){
  45. return {...state}
  46. }
  47. })]
  48. }

VUE单文件

  1. <template>
  2. <!-- 模板中直接使用状态 -->
  3. <div>{{$store.state.num}}</div>
  4. <button @click="$store.state.num++">{{ $store.state.num }}</button>
  5. <button @click="add()">add</button>
  6. <h3>使用 getter 中的计算属性购物车的总价:{{$store.getters.tols}}</h3>
  7. </template>
  8. <script setup>
  9. import { useStore } from 'vuex'//引入vuex
  10. const store = useStore()
  11. function add(){
  12. //选项式写法
  13. //this.$store.commit('sub',555)//提交vuex的mutation里面的sub方法,第二个参数提交的数据。
  14. //this.$store.dispatch('demo', {count:88, name:'vuex'});//提交vuex的actions里面的sub方法,第二个参数提交的数据。
  15. //组合式api,setup语法糖写法
  16. /************* 不开启命名空间 *************/
  17. //mutations 方法调用
  18. store.commit('sub','参数')
  19. store.commit('user/sum', num) // 参数带上模块名称
  20. //actions 方法调用
  21. store.dispatch('方法名'','参数')
  22. store.dispatch('updatenum',99)
  23. store.commit('updateUser',{id:10,username:'张工'})//调用模块的方法
  24. store.state.user.username//调用模块的状态
  25. //getters 计算方法只读调用
  26. store.getters.tols.
  27. /************* 开启命名空间 *************/
  28. store.commit('user/updateUser',{id:10,username:'张工'})// 参数带上模块名称
  29. store.dispatch('user/sum_actions', sum)
  30. }
  31. const add2 = ()=>{
  32. store.commit('add')
  33. }
  34. </script>

pinia用法

  1. import { defineStore } from 'pinia'
  2. export const useStore = defineStore('storeId',{
  3. state: ()=>{
  4. return {
  5. msg:'pinia的数据'
  6. }
  7. },
  8. getters: {
  9. },
  10. actions: {//这里写异步和同步
  11. },
  12. })

pinia使用方法

  1. <template>
  2. <div>
  3. {{msg}}
  4. </div>
  5. </template>
  6. <script setup>
  7. import { useStore } from '../../store/index'
  8. const store = useStore()
  9. const msg = store
  10. </script>

总结VUEX

vue中可以直接触发methods中的方法,vuex是不可以的。未来处理异步,当触发事件的时候,会通过dispatch来访问actions中的方法,actions中的commit会触发mutations中的方法从面修改state里的值,通过geetter把数据更新到视图

Vue.use(vuex),调用install方法,通过applyMixin(vue)在任意组件内执行this.$store就可以访问到store对象。vuex的state是响应式的,借助的就是vue的data,把state存到vue实例组件的data中

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议