• Vuex的简单应用


    ### 源码地址 

      https://github.com/moor-mupan/mine-summary/tree/master/前端知识库/Vuex_demo/demo

    1. 什么是Vuex?

    Vuex是一种状态管理模式,将所有组件的状态进行集中式的管理,并以相应的规则保证状态以一种可预测的方式发生变化。

    2.Vue的单向数据流?

    单向数据流即数据只能从一个方向改变,父组件 => 子组件,例:父组件传递给子组件1和子组件2一个name属性,当子组件1(组件2)改变name时,父组件和子组件2(组件1)的name不会发生变化。但是当改变父组件的name时子组件的name会随之改变。

    3.Vuex的应用场景?

    大型的单页应用,多个组件共享同一状态时。简单应用使用Vuex会使项目冗余(简单的使用store模式即可)。

    4.简单的store模式?

    const store = {
      debug: true,
      state: {
        message: 'Hello!'
      },
      setMessageAction (newValue) {
        if (this.debug) console.log('setMessageAction triggered with', newValue)
        this.state.message = newValue
      },
      clearMessageAction () {
        if (this.debug) console.log('clearMessageAction triggered')
        this.state.message = ''
      }
    }

    5.Vuex的核心概念?

    1.state

    Vuex使用单一状态树即state,state对象包含了全部应用的层级状态。作为单一数据源存在。

    2.Getter

    Vuex允许在store中定义一个getters,像计算属性一样,getters的返回值会根据它的依赖缓存起来,只有当依赖值发生变化时才会重新计算。在组件中通过store.getters获取相应的状态值。

    在组件中引用getters中的属性时,有时可能需引入多个,可以使用Vuex中的mapGetter辅助函数

    Getter参数:1.state作为第一个参数      2.接收其他的getter作为第二个参数

    getters: {
        test: (参数1, 参数2) => {
            return ...
        }   
    }
    

      

    3.Mutation

    更改Vuex的store中的状态的唯一方法是提交mutation(不支持异步操作)//组件中触发_例: this.$store.commit(del, [data])

    mutations: {
      del (state, index) {
        state.comments.splice(index, 1)
      },
    
      add (state, data) {
        state.comments.push(data)
      }
    }
    

      

    4.Action

    在组件中使用this.$store.dispatch('xxx')分发action,或者使用mapActions辅助函数将组件的methods映射为store.dispathch调用(需要在根节点先注入store,支持异步操作)//组件中触发_例: this.$store.dispatch(addAction, [data])

    actions:{
      //delAction (context, index) {
      //  context.commit('del', index)
      //},
    
      addAction (context, data) {
        //actions可以实现异步操作-- 模拟异步
        setTimeout(() => {
          context.commit('add', data)
        }, 2000)
      }
    

      

    5.Module

    由于使用单一状态树,应用的所有状态都集中到同一个对象上。当应用很复杂时,store会变得很臃肿。因此Vuex允许我们将store分割为模块(可嵌套)。

    *6.如何使用Vuex?

    1.简单使用

    1.创建一个store文件夹,文件夹下创建index.js文件

    // store/index.js
    import Vue from 'vue'
    import Vuex from 'vuex'
    Vue.use(Vuex);
    
    //创健一个state对象
    const state = {
        comments: [
        {
          userName: 'jack',
          comment: 'Vue so easy'
        },
        {
          userName: '小明',
          comment: 'Vue 非常棒!'
        },
      ]
    }
    
    //创建getters对象 存储初始化数据(相当于Vue的computed(计算属性) ),可不使用getters而直接在组件中通过store.state获取状态值
    const getters = {
      initComments (state) {
        return state.comments
      }
    }
    
    //修改状态(仅支持同步,实现异步需要使用actions)-- 如下del为同步,add为异步,可传入两个参数,1为state,2为要改变的值
    const mutations = {
      del (state, index) {
        state.comments.splice(index, 1)
      },
    
      add (state, data) {
        state.comments.push(data)
      }
    }
    
    //通过commit方法提交任务,可传入两参数,1位context,2为要改变的值
    const actions  = {
      //delAction (context, index) {
      //  context.commit('del', index)
      //},
    
      addAction (context, data) {
        //actions可以实现异步操作-- 模拟异步
        setTimeout(() => {
          context.commit('add', data)
        }, 2000)
      }
    }
    
    //使用Vuex的store方法生成 store对象 
    const store = new Vuex.Store({
        state,
        getters,
        mutations,
        actions
    })
    
    export default store

    2.main.js入口文件引入 store/index.js

    // 外部js/UI库
    import Vue from 'vue'
    import ElementUI from 'element-ui'
    import 'element-ui/lib/theme-chalk/index.css'
    
    // 自定义文件
    import store from './store/index.js'
    import './assets/css/reset.css'
    
    // 组件
    import App from './App.vue'
    Vue.use(ElementUI)
    
    new Vue({
        el: '#app',
        store,
        template: '<App />',
        components: {App}
    })

    3.在组件中使用

    // Add.vue
        // 通过dispatch 分发actions任务,修改状态值
        this.$store.dispatch('addAction', data)
    
    // List.vue
        //使用计算属性 -- 获取状态值
        computed: { 
          comments () {
            return this.$store.getters.initComments
    
        // 如果未使用 getters则可通过state得到状态
        // return this.$store.state.comments
          }
        }
    
        // 通过commit提交载荷 ,修改状态值
        this.$store.commit('del', index)
    2.store模块化

    后续更新...

  • 相关阅读:
    vuex 命名空间
    vue-touchjs
    Jackson最简单用法
    Bootstrap登录样式
    Left/Right/Inner Join用法和区别
    VS2015安装提示出现“安装包丢失或损坏”解决方法
    HTML之禁止输入文本
    jQuery之call()方法的使用
    jQuery操作cookie
    jQuery常用的查找Dom元素方法
  • 原文地址:https://www.cnblogs.com/mp1994/p/10870976.html
Copyright © 2020-2023  润新知