Vue中的状态管理

全局储存

通过创建包含在组件之间共享数据存储的存储模式,可以实现一些简单的状态管理。
存储(Store)可以管理应用程序的状态以及负责更改状态的方法。

//定义 Store 储存

export const stroe = {
  state: {
    numbers: [1, 2, 3]
  },
  addNumber(newNumber) {
    this.state.numbers.push(newNumber)
  }
}

//定义 Display 储存

<template>
  <div>
    <h4>{{stroeNumber}}</h4>
  </div>
</template>
<script>
import { stroe } from './Store.js'
export default {
  data() {
    return {
      stroeNumber: stroe.state.numbers
    }
  }
}
</script>
<style scoped>
</style>

//定义 Submit 储存

<template>
  <div>
    <input type="text" name="" id="" v-model="number">
    <button @click="addNumber(number)">add number</button>
  </div>
</template>
<script>
import { stroe } from "./Store.js";
export default {
  data() {
    return {
      number: ""
    }
  },
  methods: {
    addNumber(number) {
      stroe.addNumber(Number(number))
      this.number = ''
    }
  }
}
</script>
<style scoped>
</style>


Vuex

npm i vuex -D //安装依赖

创建store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);

//state 只是一个包含需要在应用程序中共享的属性的对象。
const state = {  
  numbers: [1, 2, 3],
  sex: '男'
}

// mutations是负责直接改变存储状态的函数。
// 在Vuex中,mutations总是以state作为第一个参数。
// 此外,actions也可以不作为第二个参数传递有效负载:

const mutations = { 
  0.(state, payload) {
    state.numbers.push(payload);
  },
  SET_SEX(state, payload) {
    state.sex = payload
  }
}

//actions可以调用mutations。在提交mutations之前,actions还负责所有异步调用。
//actions可以访问context对象,该对象提供对state(使用context.state)、
//getter(使用context.getters)和commit函数(context.commit)的访问。

const actions = {
  addNumber(context, number) {
    context.commit("ADD_NUMBER", number)
  },
  setSex(context, sex) {
    context.commit('SET_SEX', sex)
  }
}


//Vuex存储中的getters就像组件中的计算属性一样。
//getters主要用于执行一些计算和操作,以便在组件访问这些信息之前存储状态。

const getters = {
  getNumbers(state) {
    return state.numbers
  },
  getSex(state) {
    return state.sex
  }
}

export default new Vuex.Store({
  state,
  mutations,
  actions,
  getters
})

main.js


// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './components/vuex-store/store'

Vue.config.productionTip = false

// EvemtBus是一个Vue实例,用于支持独立组件之间订阅和发布自定义事件。
export const EventBus = new Vue()



/* eslint-disable no-new */
new Vue({
  el: '#app',
  store,
  router,
  components: { App },
  template: '<App/>'
})

DisplayVuex.vue

<template>
  <div>
    <h2>{{getNumbers}}</h2>
    <h3>{{getSex}}</h3>
  </div>
</template>
<script>
export default {
  computed: {
    getNumbers() {
      return this.$store.getters.getNumbers
    },
    getSex() {
      return this.$store.getters.getSex
    }
  }
}
</script>

SubmitVuex.vue


<template>
  <div>
    <label>数组:</label>
    <input type="text" name="" id="" v-model="number">
    <button @click="addNumber(number)">Add number</button>
    <br>
    <label>性别:</label>
    <input type="text" v-model="sex">
    <button @click="setSex(sex)">set Sex</button>
  </div>
</template>
<script>
export default {
  data() {
    return {
      number: '',
      sex: ''
    }
  },
  methods: {
    addNumber(number) {
      console.log(number)
      this.$store.dispatch('addNumber', Number(number))
      this.number = ''
    },
    setSex(sex) {
      this.$store.dispatch('setSex', sex)
      this.sex = ''
    }
  }
}
</script>
<style scoped>
</style>

转载:https://www.w3cplus.com/vue/managing-state-in-vue-js.html

posted @ 2018-11-16 19:16  人情冷暖i  阅读(732)  评论(0编辑  收藏  举报