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模块化

后续更新...

 

posted @ 2019-05-15 17:38  有梦想的咸鱼-  阅读(183)  评论(0编辑  收藏  举报