Vuex 是一个专为 Vue.js 应用程序开发的状态管理器,采用 集中式存储 管理应用的全部组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。javascript
Vuex store实例的根状态对象,用于定义共享的状态变量。vue
读取器,外部程序经过它获取变量的具体值,或者在取值前作一些计算(能够认为是store的计算属性) java
修改器,它只用于修改state中定义的状态变量。webpack
动做,向store发出调用通知,执行本地或者远端的某一个操做(能够理解为store的methods)web
第一步:npm下载vuex资源包:vue-router
npm install vuex -S
第二步:在 src 下建立文件夹,在 src 下建立 store.js ,官方推荐项目结构vuex
store.js文件vue-cli
import Vue from 'vue' import Vuex from 'vuex' import * as getters from './store/getters' // 导入响应的模块,*至关于引入了这个组件下全部导出的事例 import * as actions from './store/actions' import * as mutations from './store/mutations' Vue.use(Vuex) // 首先声明一个须要全局维护的状态 state,好比 titelName const state = { titelName: '小A的大标题' // 默认值 // id: xxx 若是还有全局状态也能够在这里添加 // name:xxx } export default new Vuex.Store({ strict: process.env.NODE_ENV !== 'production', //在严格模式下,不管什么时候发生了状态变动且不是由 mutation 函数引发的,将会抛出错误。这能保证全部的状态变动都能被调试工具跟踪到。不要在发布环境下启用严格模式以免性能损失! state, // 共同维护的一个状态,state里面能够是不少个全局状态 getters, // 获取数据并渲染 actions, // 数据的异步操做 mutations // 处理数据的惟一途径,state的改变或赋值只能在这里 })
getter.js 文件npm
// 获取最终的状态信息 export const titelName = state => state.titelName
actions.js 文件app
// 给action注册事件处理函数。当这个函数被触发时候,将状态提交到mutations中处理 export function modifyAName({ commit }, name) { // commit 提交;name即为点击后传递过来的参数,此时是 'A餐馆' return commit('modifyAName', name) } // export const modifyAName = ({commit},name) => commit('modifyAName', name) export const modifyBName = ({ commit }, name) => commit('modifyBName', name)
mutations.js 文件
// 提交 mutations是更改Vuex状态的惟一合法方法 export const modifyAName = (state, name) => { state.titelName = name // 把方法传递过来的参数,赋值给state中的titelName } export const modifyBName = (state, name) => { state.titelName = name }
router.js 文件
import Vue from 'vue' import Router from 'vue-router' import Home from './views/Home.vue' import componentA from './components/componentA.vue' import componentB from './components/componentB.vue' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'home', component: Home }, { path: '/about', name: 'about', // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "about" */ './views/About.vue') }, { path: '/componentA', name: 'componentA', component: componentA }, { path: '/componentB', name: 'componentB', component: componentB }, ] })
componentA.vue 文件
<template> <div> <span>A页面名字</span> <input type="text" name id v-model="titelName" @keydown="modifyAName(titelName)"> <button @click="modifyAName('ssds')">改标题</button> <button @click="jump()">调到B页面</button> </div> </template> <script> // import { mapActions, mapGetters } from "vuex"; import { mapActions } from "vuex"; export default { data() { return {}; }, methods: { ...mapActions(['modifyAName']), // 至关于this.$store.dispatch('modifyName'),提交这个方法 jump() { this.$router.push("componentB"); } }, computed: { //注意 v-model v-if // ...mapGetters(["titelName"]) titelName: { get() { return this.$store.state.titelName; }, set(val) { console.log(val); this.$store.commit('modifyAName', val); // this.$store.dispatch('modifyAName'); console.log(this.$store.state.titelName); } } } }; </script> <style scoped> </style>
componentB.vue 文件
<template> <div> <span>B页面名字</span> <input type="text" name id v-model="titelName" @keydown="modifyBName(titelName)"> <button @click="jump()">调到A页面</button> </div> </template> <script> // import { mapActions, mapGetters } from "vuex"; import { mapActions } from "vuex"; export default { data() { return {}; }, methods: { ...mapActions( // ["modifyBName"] ), jump() { this.$router.push("componentA"); } }, computed: { // ...mapGetters(["titelName"]) titelName: { get: function() { return this.$store.state.titelName; }, set: function(val) { this.$store.commit("modifyBName", val); } } } }; </script> <style scoped> </style> //第三步:在 src/main.js 中引入 import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' Vue.config.productionTip = false new Vue({ router, store, render: h => h(App) }).$mount('#app')
//state this.$store.state.count //getter this.$store.getters.count //调用 action 修改 state 值,不带参数 this.$store.dispatch('increment'); //调用 action 修改 state 值,带参数 this.$store.dispatch('increment',{value :123});
vuex提供了三种辅助函数用于获取、修改vuex:
mapState、mapGetters、mapActions
即将vuex的变量或者方法映射到vue组件this指针上。
<script type="text/javascript"> import { mapState } from 'vuex' export default{ computed : { ...mapState([ 'count', 'buttonShow' ]) } } </script>
<script type="text/javascript"> import { mapGetters } from 'vuex' export default{ computed : { ...mapGetters([ 'count', 'buttonShow' ]) } } </script>
<script type="text/javascript"> import { mapActions } from 'vuex' export default{ methods : { ...mapActions({increment:'increment',decrement:'decrement'}), } } </script>