原本只是想寫個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的正確姿式。