20190120

什么情况下适合使合vuex?Vuex使用中有几个步骤?

开始之前先简单了解一下vuex

定义: vuex是一个状态管理机制,采用集中式存储应用所有组件的状态

嗯,就是一句话能说明白的,没明白的,我们用代码再理解一下什么叫集中式式存储

比如下面这段代码,同时需要用到username,那么我们首先能想到就是在两个组件内都进行一次获取username的操作, 这种操作是有明显弊端的, 如带宽资源浪费,代码不好维护等等

// a.vue

   

{{username}}div>

template>

// b.vue

   

{{username}}div>

template>

那么集中式是什么概念呢,就是把整个应用的状态独立出来当成一个树形结构管理,所有叶子数据的更改都使用唯一的通道进行操作,下面用代码再来理解一下

// a.vue

   

{{username}}div>

template>

// b.vue

   

{{username}}div>

template>

computed: {

   username () {

       // store就是我们应用的集中管理器,跟组件解藕,需要的时候就用到,叫即插即用

       return store.state.count

   }

},

script>

什么情况下适合使合vuex

老生常谈的话题,每个人的使用动机不同可能结果就不同,站在系统架构的角度上来,vuex虽然能很好帮助我们管理状态, 但随之也带来更多的概念让我们花时间来消化,一般情况下我们会根据项目的实际大小来决定是否需要引入vuex

Vuex使用中有几个步骤

先上一张图理解一下vuex工作的流程

从图中我们可以看到vuex包含了3个关键词

state

actions

mutations

只要知道就行,后面再展开讲

先看下最简单使用vuex的方式

// store.js

// store中管理store以及mutations, 然后在组件中通过commit来触发store中mutations的方法

const store = new Vuex.Store({

 state: {

   name: 'JS'

 },

 mutations: {

   updateName (state) {

     state.name = 'JS每日一题'

   }

 }

})

// a.vue

store.commit('updateName') // JS每日一题

state

字面意思就是状态,上面也说了vuex是集中式管理, 那么在这里就理解成为集中管理的状态(全局可使用状态)

组件中获取状态可以通过以下方式

const Demo = {

 template: `

{{ name }}

`,

 computed: {

   name () {

     return store.state.name

   }

 }

}

// 也可以通过mapState 辅助函数来获取

 computed: mapState({

     name: state => state.name

 })

// 引入多个state可以通过对象展开运算符来获取

 computed: {

     ...mapState({

       name

       // ...

     })

 }

mutations

更改vuex中的store的唯一途径就是mutation,且必须是同步函数

代码理解

 // 首先mutations 是一个对象

 // 下面的updateName 展开写就是 updateName : function(){}, 在vuex叫做Type Handler

 // 根据上一条的解释,所以会看到很多mutations的写法类 [GET_USER_INFO] : (state) => {}

 // 你不能直接调用mutations.updateName, 因为mutations 只负责注册事件,需要通过store.commit(type) 来唤醒对应type的handler

 // Mutation 需遵守 Vue 的响应规则,也就是说没有被Object.defineProperty 劫持到的state不会响应式, 比如你有一个state为obj = {}, 然后你通过mutation来为obj新增一个属性,

 这时候你需要替换原有的obj组件才会正常响应,

 常用的方式可以通过Object.assign()

 mutations: {

   updateName (state) {

     state.name = 'JS每日一题'

   }

 }

 // 组件中可以通过mapMutaions 辅助函数来映射关系

 // 下面等同于 this.updateName()  this.$store.commit('updateName')

 methods: {

     ...mapMutaions([

       'updateName',

       ...

     ])

 }

Action

Action 类似于 mutation,提交的是 mutation,而不是直接变更状态。简单来说就是mutation只负责同步操作,action负责异步操作

 mutations: {

   updateName (state) {

     state.name = 'JS每日一题'

   }

 },

 actions: {

   // context是一个具有store 实例相同方法和属性的对象

   getUserInfo (context) {

         setTimeout(() => {

             commit('updateName')

         }, 1000)

   }

 }

 // 组件中可以通过mapActions 辅助函数来映射关系

 // 下面等同于 this.getUserInfo()  this.$store.commit('getUserInfo')

 methods: {

     ...组件中可以通过mapActions([

       'getUserInfo',

       ...

     ])

 }

总结

vuex是一种状态管理机制,将全局组件的共享状态抽取出来为一个store,以一个单例模式存在,应用任何一个组件中都可以使用,vuex更改state的唯一途径是通过mutation,mutation需要commit触发, action实际触发是mutation,其中mutation处理同步任务,action处理异步任务

最近答题

JS每日一题: Vue-router有哪些钩子?使用场景?

JS每日一题: Vue.use中都发生了什么?

基友噢如果喜欢,可以分享给好基友噢如果喜欢,可以分享给好基友噢

关注「JS每日一题」,参与答题

▲长按图片识别二维码

router中获取vuex_JS每日一题: 什么情况下适合使合vuex?Vuex使用中有几个步骤?...相关推荐

  1. 在Python中给定包含该项目的列表的情况下查找项目的索引

    对于列表["foo", "bar", "baz"]和列表"bar" ,如何在Python中获取其索引(1)? #1楼 a ...

  2. router中获取vuex_Vue 中 Axios 的封装和 API 接口的管理

    (给JavaScript加星标,提升前端技能) 作者:愣锤 https://juejin.im/post/684490365288107214 如图,面对一团糟代码的你~~~真的想说,What F~U ...

  3. 如何在iOS 9中启用“应用程序传输安全性”的情况下加载HTTP URL? [重复]

    本文翻译自:How do I load an HTTP URL with App Transport Security enabled in iOS 9? [duplicate] This quest ...

  4. Leetcode 153. 寻找旋转排序数组中的最小值 (每日一题 20211014)

    已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 ...

  5. Leetcode 剑指 Offer 04. 二维数组中的查找 (每日一题 20210727)

    在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.示例:现有矩 ...

  6. Leetcode 94.二叉树的中序遍历 (每日一题 20210712)

    给定一个二叉树的根节点 root ,返回它的 中序 遍历.示例 1:输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2:输入:root = [] 输出:[] 示例 3:输入: ...

  7. 请求过程中,需要证书认证,这种情况下如何处理

    某些站点请求时候,会需要证书,没有通过认证直接访问, 请求返回结果一般包含 code 443  和 cert,要如何处理 1.请求过程中,添加证书,但这种方式不那么方便或者友好,一般不这么处理 2.请 ...

  8. mysql workbench修改密码_在MySQL Workbench8.0中,忘记MySQL root密码的情况下修改密码...

    适用:如果你已经安装好MySQL,但因为忘记root密码且不想重新下载而无法建立连接,那么本文可能对你有用 前提:已经在环境变量中配置好mysql路径 步骤: Step1.准备配置文件 (1)查看根目 ...

  9. mysql workbench改密码_在MySQL Workbench8.0中,忘记MySQL root密码的情况下修改密码

    适用:如果你已经安装好MySQL,但因为忘记root密码且不想重新下载而无法建立连接,那么本文可能对你有用 前提:已经在环境变量中配置好mysql路径 步骤: Step1.准备配置文件 (1)查看根目 ...

  10. java 方法 throws_Java异常处理之------Java方法中throws Exception使用案例!什么情况下使用throws Exception?...

    @ava 中异常的处理 1.(终极解释!!!)throws Exception放在方法后边,是throws Exception表示的是本方法不处理异常,交给被调用处处理(如果你不希望异常层层往上抛,你 ...

最新文章

  1. php set medias,laravel5.1 -- Integrate FileManager and CKeditor into laravel
  2. 深入浅出SQL Server Replication第一篇:走近Replication(上)
  3. elasticsearch 结构化搜索_在案例中实战基于range filter来进行范围过滤
  4. 【文文殿下】数论一些经典结论
  5. android webview重绘,Android-怎么判断android中WebView滑动到了低端
  6. (chap3 Http报文内的http信息) HTTP报文格式
  7. php ob静态缓存
  8. boost::regex模块captures相关的测试程序
  9. gVim 中文内容显示为乱码的解决办法
  10. 职场潜规则:领导常说的10句话,学会3句以上你不会混的太差!
  11. 当年我是如何死磕 MySQL 数据库的
  12. (JAVA)正则表达式
  13. .NET 指南:使用可变数量的参数的成员
  14. 配置centos防火墙(iptables)开放80端口
  15. 不要把Linux和Windows比较
  16. iOS平台基于ffmpeg的视频直播技术揭秘
  17. 面试题:React中setState
  18. Word2003及Excel2003打开速度慢,如何解决?
  19. 学计算机编程笔记本电脑推荐,想选一款笔记本电脑,主要用来学编程,有什么好的推荐吗?...
  20. U盘复制东西时显示:磁盘被写保护,请去掉写保护或使用另一张磁盘的解决方法。

热门文章

  1. Android预定义样式?android:attr/attribute、?attr/attribute和?attribute
  2. 【译】Vault 学习资源:1.0, 自动解印, 代理, Kubernetes
  3. 区块链开发公司解析区块链在银行应用的优势
  4. php UUID 分布式生成用不重复的随机数方法
  5. cdn 导致跨域问题
  6. 织梦内容模型管理(人才招聘)
  7. spring --(16)AOP前置通知与后置通知
  8. centos-5.5安装vmvare tools
  9. 关于android中PendingIntent.getBroadcase的注册广播
  10. oracle表空间使用率统计查询