zoukankan      html  css  js  c++  java
  • 关于VUEX

    Vuex 是什么?

            Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

            Vuex采用MVC模式中的Model层,规定所有的数据必须通过action—>mutaion—>state这个流程进行来改变状态的。再结合Vue的数据视图双向绑定实现页面的更新。统一页面状态管理,可以让复杂的组件交互变的简单清晰,同时在调试时也可以通过DEVtools去查看状态。

    vuex有哪几种状态和属性

    1、state – 存放状态

    2、getters – state的计算属性

    3、mutations – 更改状态的逻辑,同步操作

    4、actions – 提交mutation,异步操作

    5、mudules – 将store模块化

       vuex的流程:页面通过mapAction异步提交事件到action。action通过commit把对应参数同步提交到mutation。mutation会修改state中对于的值。最后通过getter把对应值跑出去,在页面的计算属性中,通过mapGetter来动态获取state中的值

    vuex的State特性

    Vuex 使用单一状态树,即每个应用将仅仅包含一个store 实例,但单一状态树和模块化并不冲突。存放的数据状态,不可以直接修改里面的数据。

    1、Vuex就是一个仓库,仓库里面放了很多对象。其中state就是数据源存放地,对应于与一般Vue对象里面的data
    2、state里面存放的数据是响应式的,Vue组件从store中读取数据,若是store中的数据发生改变,依赖这个数据的组件也会发生更新
    3、它通过mapState把全局的 state 和 getters 映射到当前组件的 computed 计算属性中
    vuex的Getter特性

    类似vue的计算属性,主要用来过滤一些数据。

    1、getters 可以对State进行计算操作,它就是Store的计算属性
    2、 虽然在组件内也可以做计算属性,但是getters 可以在多组件之间复用
    3、 如果一个状态只在一个组件内使用,是可以不用getters
    vuex的Mutation特性
    1、Action 类似于 mutation,不同在于:
    ①、Action 提交的是 mutation,而不是直接变更状态,包含任意异步操作,通过提交 mutation 间接更变状态。
    ②、Action 可以包含任意异步操作

    2、mutations定义的方法动态修改Vuex 的 store 中的状态或数据,更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。
    vuex的Action特性
        actions可以理解为通过将mutations里面处理数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。view 层通过 store.dispath 来分发 action。

    vuex的Module特性

        将 store 分割成模块,每个模块都具有state、mutation、action、getter、甚至是嵌套子模块

    axios请求应该放在组件的methods中还是vuex的actions中
    1、如果请求来的数据是不是要被其他组件公用,仅仅在请求的组件内使用,就不需要放入vuex 的state里。
    2、如果被其他地方复用,可以将请求放入action里,方便复用,并包装成promise返回,在调用处用async await处理返回的数据。如果不复用这个请求,那么直接写在vue文件里更方便。

    vuex的优势

         状态管理工具的核心是响应式的做到数据管理,一个页面发生数据变化,动态的改变对应的页面。vuex可以保存数组、对象、或者嵌套结构,不用toString。双向绑定:使用commit修改一处状态后,所有引用的地方自动更新,不需要重新取值。可以自定义数据过滤方法、取值方法、逻辑判断等。可以在vuex里封装ajax,外部只负责调用数据。

    简单的使用示例

    //  存储数据的对象,我们可以将你需要存储的数据在这个state中定义
    const state = {
      // 登陆用户名
      username: ''
    }
    const mutations = {
      // 提供一个方法,为state中的username赋值
    //   这些方法有一个默认的参数,这个参数就是当前store中的State
      setUserName (state, username) {
        //存入一个值
        state.username = username
        localStorage.setItem('myname', username)
      },
      getUserName (state) {
        //输出一个值
        return state.username
      }
    }
    //使用的时候---> 通过commit调用mutations中定义的函数,这个函数就是操作state中定义的成员的函数
    // this.$store.commit('setUserName', res.data.username(请求返回的值))
    const actions = {
      setUserNameAction: ({commit}, username) => {
        commit('setUserName', username)
      },
      getUserNameAction: ({commit}) => {
        commit('getUserName')
      }
    }
    // 通过action来触发mutations中的函数,这种触发方式是异步方式--->使用
    //存入  this.$store.dispatch('setUserNameAction', res.data.username + 'aa')
    //取出  this.currentUserName = this.$store.dispatch('getUserNameAction')
    //Getters是从 store 中的 state 中派生出一些状态,即当出现多处需要导入某个状态时,结果不是很理想,所以getters的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
    const getters = {
      getUserName: (state) => {
        return localStorage.getItem('myname')
      }
    }
    //使用的时候 直接使用
    // <span class="welcome">hello:{{$store.getters.getUserName}}</span>

    欢迎大家关注我的微信公众号

  • 相关阅读:
    html5——拖拽
    html5——多媒体(四)
    html5——多媒体(三)
    html5——多媒体(二)
    html5——全屏滚动
    html5——web字体
    html5——伸缩比例案例(携程)
    html5——伸缩比例
    html5——伸缩布局
    html5——多列布局
  • 原文地址:https://www.cnblogs.com/lxl0419/p/12828680.html
Copyright © 2011-2022 走看看