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
    }
})
相关文章
|
移动开发 网络协议 算法
由浅入深Netty粘包与半包解决方案
由浅入深Netty粘包与半包解决方案
152 0
|
7月前
|
机器学习/深度学习 数据采集 数据可视化
通义灵码2.0实现数据分析小项目
本文介绍了使用通义灵码2.0实现一个数据分析小项目的全过程。从数据清洗、特征分布可视化到构建和评估多个机器学习模型,详细展示了每一步的操作和结果。通过简单的描述和提问,通义灵码2.0能够自动生成并优化代码,极大地简化了开发流程。最终,项目成功完成了数据的分析和预测模型的构建,验证了通义灵码2.0的强大功能和易用性。
通义灵码2.0实现数据分析小项目
|
10月前
|
物联网 双11 云计算
阿里云上云礼包、区域补贴、算力补贴、上云抵扣金、无门槛等优惠券区别参考
阿里云为了助力更多企业和个人用户顺利上云,推出了多种优惠券活动,包括区域补贴、上云礼包、算力补贴、上云抵扣金、无门槛优惠券等。这些优惠券在领取或申请及使用方面各有不同,适用于不同的用户群体。本文将详细解析这些优惠券的区别与适用群体,帮助用户了解他们之间的区别,以便更好地根据自身条件与需求选择适合自己的优惠券种类。
阿里云上云礼包、区域补贴、算力补贴、上云抵扣金、无门槛等优惠券区别参考
|
编解码 Linux Windows
FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
在Windows环境下,为FFmpeg集成音频编解码库,包括libogg、libvorbis和opencore-amr,涉及下载源码、配置、编译和安装步骤。首先,安装libogg,通过配置、make和make install命令完成,并更新PKG_CONFIG_PATH。接着,安装libvorbis,同样配置、编译和安装,并修改pkgconfig文件。之后,安装opencore-amr。最后,重新配置并编译FFmpeg,启用ogg和amr支持,通过ffmpeg -version检查是否成功。整个过程需确保环境变量设置正确,并根据路径添加相应库。
378 1
FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
|
前端开发 JavaScript Java
【Java】Java与JavaScript:探究它们的区别与联系
【Java】Java与JavaScript:探究它们的区别与联系
332 0
|
NoSQL 安全 Redis
redis内存限制与淘汰策略
Redis内存管理包括限制和淘汰策略。`maxmemory`配置参数决定内存上限,无设置时64位系统默认不限制,可能导致系统资源耗尽,生产环境建议设定合理值。当内存满时,未设置淘汰策略会导致写入错误。Redis提供8种淘汰策略,如LRU(最近最少使用)和LFU(最不经常使用),以及随机或基于过期时间的删除。需根据数据重要性、访问频率和一致性选择合适策略。
937 0
|
算法 C++
【算法】期末复盘,酒店住宿问题——勿向思想僵化前进
前言 省流:一个人也可以住双人间,如果便宜的话。 害!尚正值青春年华,黄金岁月,小脑瓜子就已经不灵光咯。好在我在考试的最后一分钟还是成功通过了这题,真刺激。
123 0
|
存储 JSON 监控
go语言并发实战——日志收集系统(九) 基于etcd的代码重构思考与初步实现
go语言并发实战——日志收集系统(九) 基于etcd的代码重构思考与初步实现
117 0
|
SQL Oracle 关系型数据库
Oracle SQL*Plus的COLUMN命令:数据展示的“化妆师”
【4月更文挑战第19天】Oracle SQL*Plus的COLUMN命令是数据展示的利器,能美化和格式化输出。它可定制列标题、调整显示格式(如数字的小数位数和日期格式),添加前缀和后缀(如货币符号),以及控制列宽和是否折行,使得数据呈现更直观、专业。利用COLUMN命令,能将原始数据转化为易于理解和视觉吸引力强的展示形式。
|
Java 容器 Spring
No qualifying bean of type或Unsatisfied dependency expressed through field ‘XXXService‘或@Autowired 注入
No qualifying bean of type或Unsatisfied dependency expressed through field ‘XXXService‘或@Autowired 注入