vuex(二)之核心概念

简介: vuex(二)之核心概念

一、State单一状态树

(1)引例:
       在我们的生活中有很多的信息需要被记录,比如上学时的个人档案,从小学到大学每个阶段都有信息记录,如果这些信息被分散到很多地方进行管理,有一天你需要办理某个业务时,你会发现你需要到各个对应的工作地点去打印盖章等各种资料信息,最后到一个地方提交你的消息无误的证明。这种保存信息的方式,不仅低效且难以管理。
(2)对比应用开发:
       如果你的状态信息是保存到多个Store对象中的,那么之后的管理和维护等等都会变得特别困难。所以Vuex也使用了单一状态树来管理应用层级的全部状态。单一状态树((单一数据源)在一个项目里面只有一个store)能够让我们最直接的方式找到某个状态的片段,而且在之后的维护和调试过程中,也可以非常方便的管理和维护。
(3)用法:
在state中保存已经定义好的属性×××,这些属性都会被加入到响应式系统中,而响应式系统会监听属性的变化,当属性发生变化时,会通知所有界面中用到改属性的地方,让界面发生更新。在各个组件中可以通过 this.$store.state.×××进行访问
(4)小结
      state中存储数据,存储状态;在根实例中注册了store 后,用 this.$store.state 来访问;对应vue里面的data;存放数据方式为响应式,vue组件从store中读取数据,如数据发生变化,组件也会对应的更新。

二、Getters基本使用

(1)作用:
从 store 中获取一些 state 变化后的状态,经过变化之后再给组件使用,类似于计算属性computed
(2)用法:
1、基本使用

const store = new Vuex.Store({
   state:{
      students:[
            {id:110,name:'xiaoming',age:18},
         {id:111,name:'xiaohong',age:24},
         {id:112,name:'xiaoqiang',age:30},
         {id:113,name:'xiaohai',age:10}
      ],
   },
}

获取学生年龄大于20的学生

getters:{
    more20stu(state) {
       return state.students.filter(s => s.age > 20)
    }
}

在组件中:

$store.getters.more20stu

2、getters作为参数

getters:{
    more20stu(state) {
       return state.students.filter(s => s.age > 20)
    },
    more20stuLength(state,getters) {
       return getters.more20stu.length
    },
}

在组件中:

$store.getters.more20stuLength

3、getters传递参数

getters:{
    moreAgestu(state) {
          return age => state.students.filter(s => s.age > age)
    }
}

在组件中:

$store.getters.moreAgestu(12)

getters默认是不能传递参数的, 如果希望传递参数, 那么只能让getters本身返回另一个函数。
如上面案例中,我们希望可以获取年龄超过12的学生信息。

三、Mutations

(1)作用:
       如果我们想要修改state状态,最好通过mutations修改,因为如果是多个界面都修改state的时候我们不好区分,希望进行跟踪。而在mutations中进行修改,这样Devtools( Vue开发的一个浏览器插件 可以记录每次修改State的状态)才会进行记录,才能跟踪每一步修改的状态,调错的时候就更加方便。注意:mutations中通常做同步操作,异步操作跟踪不到。
(2)用法:
1、mutations状态更新

mutations:{
  increment(state) {
     state.counter++
  }
}

通过mutations进行更新

increment() {
   // 通过 commit 进行相关的提交
   this.$store.commit('increment')
 }

2、mutations传递参数

mutations:{
  increment(state,n) {
     state.counter++
  }
}

传递一个参数

this.$store.commit('increment',2)

如果有很多参数进行传递,我们会以对象的形式进行传递(payload)

mutations:{
    increment(state,payload) {
       state.counter += payload.count
    }
}

也就是payload是一个对象,可以从对象中取出相关信息
普通的提交风格:

increment(){
    this.$store.commit('increment',{count:2})
}

特殊的提交风格:

this.$store.commit({
    type:'increment',
    count
})

四、Actions

(1)作用:
       前面强调, 不要在mutations中进行异步操作,但是某些情况, 我们确实希望在Vuex中进行一些异步操作, 比如网络请求, 必然是异步的。这个时候怎么处理呢?Action类似于Mutation, 但是是用来代替Mutation进行异步操作的。
(2)用法:
如果是异步操作想要修改state,需要先在actions中先执行完异步操作后再提交到mutations中进行修改

const store = new Vuex.store({
    state:{
        count:0
    },
    mutations:{
        increment(state){
            state.count++
        }
    },
    actions:{
        increment(context){
            context.commit('increment')
        }
    }
})

context是和store对象具有相同方法和属性的对象。也就是说, 我们可以通过context去进行commit相关的操作, 也可以获取context.state等,但是注意, 这里它们并不是同一个对象。
在Vue组件中,如果我们想要调用actions中的方法,那么就需要使用dispatch进行提交
Vue组件中:

methods:{
    increment(){
        this.$store.dispatch('increment',{count:5})
    }
}

store对象中:

mutations:{
    increment(state,payload){
        state.count += payload.count
    }
},
actions:{
    increment(context,payload){
        setTimeout(() => {
            context.commit('increment',payload)
        },1000)
    }
}

在Action中, 我们可以将异步操作放在一个Promise中, 并且在成功或者失败后, 调用对应的resolve或reject

actions:{
    increment(context) {
       return new Promise(resolve => {
          setTimeout(() => {
              context.commit('increment')
              resolve()
          },1000)
       })
    }
}
methods:{
    increment(){
        this.$store.dispatch('increment').then(res => {
            console.log('完成了更新操作')
        })
    }
}

五、Module

(1)作用:
       Vue使用单一状态树,那么也意味着很多状态都会交给Vuex来管理。当应用变得非常复杂时,store对象就有可能变得相当臃肿。为了解决这个问题, Vuex允许我们将store分割成模块(Module), 而每个模块拥有自己的state、mutation、action、getters等。
(2)用法:
在这里插入图片描述

const moduleA = {
    state:{
        name:'malong'
    },
    mutations:{
        updateName(state,payload) {
            state.name = payload
        }
    },
    actions:{
        aUpdateName(context) {
            setTimeout(() => {
                console.log(context);
                context.commit('updateName','xuxin')
            },1000)
        }
    },
    getters:{
        fullname(state) {
            return state.name + '111'
        },
        fullname2 (state,getters) {
            return getters.fullname + '222'
        },
        // rootState 下面根的 state
        fullname3(state,getters,rootState) {
            return getters.fullname2 + rootState.counter
        }
    }
}
const store = new Vuex.Store({
    state:{
 
    },
    mutations:{
       
    },
    actions:{
        
    },
    getters:{
       
    },
    modules:{
        // 这里的a会被放到state中
        a: moduleA
    }
})
相关文章
|
5天前
|
人工智能 JSON 自然语言处理
让教学更智慧:用阿里云百炼工作流,自动生成中小学教材内容#小有可为#有温度的AI
通过可视化工作流编排,将大模型推理能力转化为标准化的教学内容生成引擎。教师只需输入教材标题和适用学段,即可自动获得结构完整、符合课程标准的章节内容,大幅降低备课门槛,助力教育资源均衡化。
463 123
|
7天前
|
人工智能 定位技术 SEO
我学 GEO 第 15 天:终于知道AI GEO该如何做?
我是暴走的莉莉酱,边旅行边研究AI GEO的数字游民。专注普通人如何提升“AI可见度”——让AI在回答用户问题时准确识别、理解并推荐你。不讲玄学,只做可测、可调、可持续的GEO实践。
443 127
|
10天前
|
机器学习/深度学习 人工智能 调度
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
HappyHorse 1.1 是新一代视频生成大模型,全面升级动态表现力、角色一致性、指令遵循、视觉质感与音画协同能力。支持I2V/T2V/R2V三类生成,适配短剧、电商广告、品牌营销等场景,提供高质、流畅、可控的AI视频生产力。
753 5
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
|
2天前
|
消息中间件 存储 Kafka
Kafka 原生消息入湖能力上线!一键打通实时流与数据湖
阿里云消息队列 Kafka 版正式上线原生消息入湖能力。
213 121
|
2天前
|
人工智能 安全 Cloud Native
Higress 新发布:AI Gateway 能力增强,Gateway API 及其推理扩展持续打磨
增强 AI 网关能力,持续打磨 Gateway API 及其推理扩展。
249 122
|
7天前
|
缓存 人工智能 运维
阿里云618百炼大模型Qwen3.7-Max功能、免费试用、订阅计费、配置接入详解
Qwen3.7-MAX是阿里云百炼平台推出的通义千问3.7系列旗舰大语言模型,专为智能体时代复杂任务打造,依托阿里云全域算力与自研技术,在逻辑推理、长文本处理、代码工程、长周期自主执行等领域达到行业顶尖水平。2026年618期间,该模型推出多重免费试用权益、按量计费5折、订阅套餐优惠等专属福利,覆盖个人开发者、团队与企业全场景需求,以下从核心功能、免费试用、订阅计费、配置接入四方面展开详细解析。
446 123
|
5天前
|
人工智能 自然语言处理 API
阿里云Token Plan团队版解析:功能、三档套餐与省钱订阅指南
阿里云百炼平台推出的Token Plan团队版,是面向企业与团队的AI大模型订阅服务,以Credits为统一计量单位,整合文本与图像生成模型,提供团队管理、数据安全、多工具兼容等核心能力,解决团队零散订阅AI服务的管理混乱、成本失控、数据安全等痛点。本文将从核心定位、套餐详情、计费规则、团队管理、工具兼容、便宜订阅技巧等方面,全面解析Token Plan团队版,帮助企业与团队高效、低成本地使用AI服务。
330 108
|
15天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)