官网介绍:Vuex 是一个专为 Vue.js 应用程序开发的状态(数据)管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
个人理解:是一个‘’仓库‘’,只是vuex里面存储的是数据。
首先在项目中下载vuex,执行命令:npm install --save vuex
。
在src目录下创建store文件夹
store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'
Vue.use(Vuex)
//把modules下的所有文件导入
const modulesFiles = require.context('./modules', true, /\.js$/)
// you do not need `import app from './modules/app'`
// it will auto require all vuex module from modules file
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
// set './app.js' => 'app'
const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
const value = modulesFiles(modulePath)
modules[moduleName] = value.default
return modules
}, {})
const store = new Vuex.Store({
modules,
getters
})
export default store
在main.js中导入store。
import store from './store'
//在vue全局对象上注册store(相当于挂载到全局对象Vue上)
new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
});
数据初始化(./modules/login.js)
const state = {
account: '管理员',
password: '123456',
msg:'',
}
//修改数据的唯一方法(同步)
const mutations = {
SET_ACCOUNT: (state, account) => {
// 将组件的数据存放于state
state.account = account
},
SET_PASSWORD: (state, password) => {
state.password = password
},
SET_MSG: (state, msg) => {
state.msg = msg
},
}
//提交mutation,改变数据,
const actions = {
alterMsg({ commit }, v) {
commit('SET_MSG', v)
},
}
/*
* namespaced: true:使其成为带命名空间的模块。当模块被注册后,
* 它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。
* */
export default {
namespaced: true,
state,
mutations,
actions
}
存、取值
<template>
<div>
<h1>欢迎来到页面——vuex</h1>
<p>当前页面msg的值:{{msg}}</p>
<div>
<span>点击按钮,把msg存入vuex,并在下个页面显示</span>
<el-button type="primary" @click="handleSaveMsg">保存msg</el-button>
</div>
<hr>
<p>第1种方法,显示vuex中存在的账户号:{{oneAccount}}</p>
<p>第2种方法,显示vuex中存在的账户号:{{twoAccout}}</p>
</div>
</template>
<script>
import { mapState } from 'vuex';
export default {
name: "vueVuex",
data() {
return {
msg: "Hello Vue!",
};
},
computed: {
...mapState({
//第2种取值,state.
twoAccout: state => state.login.account,
}),
oneAccount() {
// 第1种取值,this.$store.state.
return this.$store.state.login.account;
}
},
methods: {
handleSaveMsg() {
/* //同步存值
//this.$store.commit(键,值)。
this.$store.commit("login/SET_MSG", this.msg);
this.$router.push({
name: "/vue/vuex-details"
}); */
//异步存值
//this.$store.dispatch(键,值)。
this.$store.dispatch("login/alterMsg",this.msg);
this.$router.push({
name: "/vue/vuex-details"
});
},
},
};
</script>
效果展示