原本只是想写个Vuet实现登陆退出的例子的,可是又以为这样干货太少。一个好的开源项目,少不了单元测试和e2e测试,为了保证Vuet教程的丰富性和程序的稳定性,因此我选择了写的例子即能当教程使用,也能够用于测试,丰富的应用场景和测试,能保证往后的版本迭代不会由于修复了一个bug而引起了一大堆bug的尴尬。javascript
git clone https://github.com/medevicex/vuet.git npm install npm run dev npm run dev:test # 运行测试,须要电脑本地安装firefox和chrome浏览器
哈哈,上面直接抛源码地址,感受也是挺尴尬的,咱们先分析一下咱们这个登陆退出所须要所的功能vue
登陆页面,用户信息页面,是两个不一样的页面,就涉及到了多组件状态共享java
我指望用户在已登陆的状况下,每次到用户信息页面时,先渲染本地的用户信息,而后再去请求服务器更新本地的用户信息git
将登陆退出的方法,集中起来管理,方面在在各个组件中调用github
Vuet提供了全局的mapModules方法,可让咱们链接到挂载在Vue实例上的Vuet实例vuex
ages/Home.vue
chrome
import { mapRules, mapModules } from 'vuet' export default { mixins: [ // manual:规则,能够将通用的更新模块状态的方法集中起来, // 能够理解成vuex中的action,只不过他是能够容许在里面更改模块状态的 // need 规则,会在组件每一次的beforeCreate钩子中,发送请求更新一次用户的信息 mapRules({ manual: 'user', need: 'user' }), // 链接用户模块 mapModules({ user: 'user' }) ] }
vuet/user.js
npm
export default { data () { // 一个Object对象中,是否有data方法,是构成Vuet.js一个模块的依据 // 当你调用reset方法时,将会重置整个模块的状态 // 例如在组件中:this.$vuet.reset('模块名称') return { name: null, age: null, sex: null, count: 0 } }, async fetch ({ state }) { // 当need规则触发更新时,出调用一次fetch方法更新 // 咱们能够在这里直接更改state,也能够return一个Object对象来更新状态 // 在实际项目中,用户未登陆时,咱们并不须要向服务器发送真正的请求 // 因此咱们能够判断一下用户的名称是否存在,不然的话不向服务器进行真正的请求 if (state.name === null) return // 下面数据由于是模拟的,因此就直接return好了 return { name: 'Vuet', age: 18, sex: 'male', count: ++state.count } }, // 注:你要在组件中使用manual规则才能向组件注入这些方法 // 例如:mapRules({ manual: '模块名称' }) // 调用:this.$模块名称.xxx() manuals: { async signin ({ state }, from) { // 定义了一个登陆的方法 if (from.name === 'Vuet' && from.pass === '2017') { return { success: true, msg: 'Login was successful', data: { name: 'Vuet', age: 18, sex: 'male', count: ++state.count } } } return { success: false, msg: 'Logon failure', data: null } }, async sigout () { // 用户选择退出后,直接调用reset的方法便可重置用户信息 this.reset() } } }
pages/Signin.vue
浏览器
<template> <div class="inner"> <b class="msg" style="color:red" v-if="msg">{{ msg }}</b> <form @submit.prevent="submit"> <div> <label>User name:<input class="name" type="text" v-model="form.name"></label> </div> <div> <label>Password:<input class="pass" type="password" v-model="form.pass"></label> </div> <button>Signin</button> </form> </div> </template> <script> import { mapRules, mapModules } from 'vuet' export default { mixins: [ // 使用manual规则取得user模块里面manuals的方法 mapRules({ manual: 'user' }), // 链接用户的模块信息 mapModules({ user: 'user' }) ], data () { return { msg: null, form: { name: null, pass: null } } }, methods: { async submit () { const res = await this.$user.signin(this.form) this.msg = res.msg if (res.success) { // 登陆成功后,直接赋值更新用户信息 this.user = res.data setTimeout(() => { this.$router.replace({ name: 'home' }) }, 500) } } } } </script> <style scoped> </style>
其实教程并无写得特别详细的过程,主要是为了体现出Vuet一种开放的姿态,它能够在任意组件直接对模块的状态进行直接的赋值更新,也可使用相似action的方法进行更新,它可让你随心所欲,用得好的人可让你开发的效率飙升,用得很差,也会致使你程序中的状态难以追踪变化的记录。哈哈,不当心被吓到了吧,其实这些都是有办法能够解决的,下次有机会,咱们能够再讨论一下使用Vuet的正确姿式。