msvue组件间通信时,若需要改变多组件间共用状态的值。通过简单的组件间传值就会遇到问题。如:子组件只能接收但改变不了父组件的值。由此,vuex的出现就是用作各组件间的状态管理。
简单实例:vuex的使用
1,安装
cnpm install vuex --save
2,文件位置
3,在main.js里引入store.js
4,一个简单的使用vuex的实例 在子组件中输入用户名,密码。在store.js文件中能够获取到输入后的值。 通过 $store.state.nameMsg 可以在任何组件中获取到最新的用户名及密码。这样可以轻松实现组件间的通信
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex); // 首先声明一个状态 state const state = { nameMsg: '', pwdMsg:'' }; // 然后给 actions 注册一个事件处理函数,当这个函数被触发时,将状态提交到 mutaions中处理 const actions = { saveName({commit}, msg) { commit('saveMsg', msg) // 提交到mutations中处理 }, savePwd({commit}, msg) { commit('savePwdMsg', msg) // 提交到mutations中处理 } }; // 更新状态 const mutations = { saveMsg(state, msg) { state.nameMsg = msg; }, savePwdMsg(state,msg){ state.pwdMsg = msg; } }; // 获取状态信息 const getters = { showState(state) { console.log(state.nameMsg); console.log(state.pwdMsg); } }; // 下面这个相当关键了,所有模块,记住是所有,注册才能使用 export default new Vuex.Store({ state, getters, mutations, actions })
登录 login.vue
<template> <div id="login" class="login-content"> <user></user> <enter></enter> <p class="content-block"><a @click=showState class="button button-fill button-success">登录</a></p> </div> </template> <script> // 引入mapGtters,很重要 import { mapGetters } from 'vuex' import enter from '../../components/form.vue' import user from '../../components/header.vue' export default { methods: { ...mapGetters([ // 在store.js 中注册的getters 'showState' ]) }, components: { enter, user } } </script> <style> .login-content { margin: 0 auto; 300px; height: 500px; border: 1px solid #3db5b5; } </style>
子组件 form.vue
<template> <div> <input type="text" @blur=saveName(username) v-model="username" placeholder="Your name"> <input type="text" @blur=savePwd(password) v-model="password" placeholder="Your password"> </div> </template> <script type="text/javascript"> // 引入mapActions,很重要 import { mapActions } from 'vuex' export default { data() { return { username:'', password: '' } }, methods: { ...mapActions({ // 在input 的blur 事件中触发回调,并将输入值作为参数返回到store中 saveName: 'saveName', savePwd: 'savePwd' }) } } </script>
子组件 header.vue
<template> <div class="header"> <p>{{$store.state.nameMsg}}</p> <p>{{$store.state.pwdMsg}}</p> </div> </template> <script type="text/javascript"> </script> <style> .header { 100%; height: 50px; background-color: #DADADA; } </style>