vuex--未完

一、 简介

vue3.0以上,本文是3.0
vue2.0
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库(全局管理,相当于一个全局变量,所有页面共享)。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

二、使用介绍

namespace介绍
模块可能会有很多个,公用的一套state、getters、mutations、actions,若想封装更强单独使用,需要加上namespaced:true

注意:namespaced:true, 使用模块中的mutations、getters、actions时候,要加上模块名(uInfo注册时的模块名)
》》 调用方法的时候:store.commit(“uInfo/方法名”,data.userLoginInfo)
》》获取属性的时候:store.state.uInfo.属性名

1 、Vuex使用样例包含 state、getters、mutations、actions使用

  • 第一步:引入 在main.js 中–生成项目是已经做好

    //vuex
    import store from './store'
    createApp(App).use(store)
    
  • 第二步:在store文件夹下的index.js中
    Promise介绍

    import {
          createStore } from 'vuex'
    
    export default createStore({
         
      //全局状态初始值
      state: {
         
        count:1
      },
      //计算state,获取对应的值
      getters: {
         
        countStatus(state){
         
          return state.count <= 1
        }
      },
      //更新状态的方法--更新state的唯一方法,commit mutations
      mutations: {
         
        setCount(state,num){
         
          state.count=num;
        }
    
      },
      //可以异步操作,可以返回promise,更改数据还是传递到 mutations 去更改
      actions: {
         
        setCountPromise(context,num){
         //包含store的上下文对象
          //Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。
          //Promise就是能把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。
          //resolve执行成功时的回调;reject执行失败时的回调
          return new Promise((resolve, reject) => {
         
            if(num >100){
         
              reject("不能大于100")
            }else{
         
              context.commit("setCount",num)
              resolve()
            }
          })
        }
      },
      //数据较多时,分模块
      modules: {
         
      }
    })
    
    
  • 第三步:vue页面代码

    <template>
        <p>{
        {num}}</p>
        <el-button type="primary" @click="handle">提交</el-button>
    </template>
    <script>
        import {
           reactive,toRefs} from "vue"
        import {
            useStore} from "vuex"
        export default {
           
            name:"user",
            setup(){
           
                const store =useStore()
                const count = store.state.count
                const data = reactive({
           
                    num:count,
                })
                console.log("修改前的getters",store.getters.countStatus)
                const handle=()=>{
           
                	//测试mutations中的setCount
                    //store.commit("setCount",100)
                    //测试actions中的setCountPromise--异步
                    store.dispatch("setCountPromise",100).then(res=>{
           
                        alert("修改成功")
                    }).catch(err=>{
           
                        alert(err)
                    });
                    console.log(store.state.count)
                    console.log("修改后的getters",store.getters.countStatus)
                }
                return{
           
                    ...toRefs(data),
                    handle
                }
            }
        }
    </script>
    

2、modules分模块

  • 第一步:在store文件夹下,建立sate,里面包含多个js文件,一个js代表一个模块

    例子:num.state.js,多了namespaced,缺少modules,其他的state、getters、mutations、actions和index中的一样

    export default {
         
        //防止模块名字相同
        namespaced:true,
        //全局状态初始值
        state: {
         
            count:1
        },
        //计算state,获取对应的值
        getters: {
         
            countStatus(state){
         
                return state.count <= 1
            }
        },
        //更新状态的方法--更新state的唯一方法,commit mutations
        mutations: {
         
            setCount(state,num){
         
                state.count=num;
            }
    
        },
        //可以异步操作,可以返回promise,更改数据还是传递到 mutations 去更改
        actions: {
         
            setCountPromise(context,num){
         //包含store的上下文对象
                //Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。
                //Promise就是能把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。
                //resolve执行成功时的回调;reject执行失败时的回调
                return new Promise((resolve, reject) => {
         
                    if(num >100){
         
                        reject("不能大于100")
                    }else{
         
                        context.commit("setCount",num)
                        resolve()
                    }
                })
            }
        }
    }
    
  • 第二步:将index.js中的state、getters、mutations、actions代码删除,需要引入注册mutations

    import {
          createStore } from 'vuex'
    //引入state模块
    import number from "../store/state/num.state.js"
    export default createStore({
         
      //数据较多时,分模块
      modules: {
         
        number//注册state模块
      }
    })
    
    
  • 第三步:vue页面需要相应的更改

    <template>
        <div>用户列表aaa</div>
        <p>{
        {num}}</p>
        <el-button type="primary" @click="handle">提交</el-button>
    </template>
    <script>
        import {
           reactive,toRefs} from "vue"
        import {
            useStore} from "vuex"
        export default {
           
            name:"user",
            setup(){
           
                const store =useStore()
                const count = store.state.number.count
                const data = reactive({
           
                    num:count,
                })
                //store.getters.countStatus改成现在这样否则会报语法错误
                console.log("修改前的getters",store.getters["number/countStatus"])
                const handle=()=>{
           //调用mutations中的setCount方法
                    //store.commit("number/setCount",100)
                    store.dispatch("number/setCountPromise",100).then(res=>{
           
                        alert("修改成功")
                    }).catch(err=>{
           
                        alert(err)
                    });
                    console.log(store.state.number.count)
                    console.log("修改后的getters",store.getters["number/countStatus"])
                }
    
                return{
           
                    ...toRefs(data),
                    handle
                }
            }
        }
    </script>
    

三、核心概念

1、state

每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同:

  • Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
  • 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit)
    mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。

相关推荐

  1. vuex--

    2023-12-20 16:36:05       49 阅读
  2. vue整合axios

    2023-12-20 16:36:05       47 阅读
  3. C# Parallel

    2023-12-20 16:36:05       9 阅读
  4. 【Android】通知(待续)

    2023-12-20 16:36:05       43 阅读
  5. C++ -- STL(待续)

    2023-12-20 16:36:05       8 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-20 16:36:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-20 16:36:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-20 16:36:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-20 16:36:05       18 阅读

热门阅读

  1. Web安全 - 深入同源策略

    2023-12-20 16:36:05       38 阅读
  2. 蓝底白字车牌的定位与字符分割识别 MATLAB 仿真

    2023-12-20 16:36:05       34 阅读
  3. [PTA]矩阵列平移

    2023-12-20 16:36:05       38 阅读
  4. 05-MySQL中的limit和union关键字

    2023-12-20 16:36:05       33 阅读
  5. 【libevent】IO引擎及实现

    2023-12-20 16:36:05       30 阅读
  6. springboot 解析微信小程序获取手机号

    2023-12-20 16:36:05       23 阅读
  7. 基于改进鲸鱼算法的最小乘支持向量机数据分类

    2023-12-20 16:36:05       29 阅读
  8. Python用Pygame实现一个五子棋小游戏

    2023-12-20 16:36:05       35 阅读
  9. iOS将framework转为xcframework

    2023-12-20 16:36:05       35 阅读
  10. Dubbo RPC-Redis协议

    2023-12-20 16:36:05       42 阅读
  11. Prolist组件实现动态竖排展示

    2023-12-20 16:36:05       33 阅读
  12. 在vue中,文件转base64示例

    2023-12-20 16:36:05       33 阅读
  13. WPF 全局异常处理

    2023-12-20 16:36:05       40 阅读
  14. Spring 声明式事务

    2023-12-20 16:36:05       41 阅读
  15. Hive Serde

    2023-12-20 16:36:05       40 阅读