摘要:首先我們從登錄頁面以及開始,因?yàn)楹罄m(xù)很多其它的頁面都需要登錄信息。大家還是看看我這做個(gè)指引,具體還是看代碼原文地址其他使用快速開發(fā)單頁應(yīng)用主體結(jié)構(gòu)使用快速開發(fā)單頁應(yīng)用使用快速開發(fā)單頁應(yīng)用登錄頁面使用快速開發(fā)單頁應(yīng)用功能組件與路由組件通信
本文所涉及代碼全在vue-cnode
前面兩篇都是介紹組織結(jié)構(gòu)和vue-router,從本文開始我們將講一些如何優(yōu)雅的用vue編寫單頁應(yīng)用。首先我們從登錄頁面以及開始,因?yàn)楹罄m(xù)很多其它的頁面都需要登錄信息。
路由,文件組織首先我們第一步肯定是指定一條路由啦,在src/config_router.js里面增加一條路由
export function configRouter (router) { router.map({ "/login": { name: "login", title: "登錄", // es6箭頭函數(shù) component: (resolve) => require(["./components/login/login.vue"], resolve) } }) }
上面compenents部分,使用了webpack代碼分割功能,這樣他會(huì)安需加在./components/login/login.vue組件。也可以這樣寫component: require("./components/login/login.vue"),這樣就不會(huì)按需載入了。編譯的第一個(gè)文件就有這個(gè)。
然后我們需要在src/conponengts/下面創(chuàng)建一個(gè)login的文件夾一個(gè)login.vue的文件。最開始login.vue里面應(yīng)該是這樣的:
// something
上面是vue-loader的結(jié)構(gòu),你可以看到,樣式、模版、js三者很清晰,不像react中的寫法全是js,jsx感覺還有點(diǎn)混亂(個(gè)人觀點(diǎn))。
上面的style中lang是指定解析語言,我們這里用的是stylus,然后src指定文件路徑,最后的一個(gè)scoped是指定樣式只在當(dāng)前組件生效。template和script里面的內(nèi)容就部多介紹了,現(xiàn)在開始編寫業(yè)務(wù)邏輯。
vuex這里我們不介紹vuex是個(gè)啥,文檔在這里。
我們需要保存登錄的信息,因?yàn)樵诤罄m(xù)的所有接口中去獲取數(shù)據(jù)我們都需要服務(wù)器返回的用戶信息。這里我們將獲取用戶信息、保存用戶信息邏輯全部拆出來交給vuex。
modules先安裝vuex:npm install vuex --save,然后我們建一個(gè)store。在src文件夾下面創(chuàng)建`/vuex/modules/user_info.js:
// content import { SET_BASEINFO, SET_DETAIL } from "../mutation_types" const state = { // 保存第一頁數(shù)據(jù) id: "", accessToken: "", loginName: "", avatarUrl: "", score: "", recentTopics: "", recentReplies: "", github: "", createAt: "" } const mutations = { // 設(shè)置 token 登錄名 頭像 [SET_BASEINFO] (state, data) { try { state.id = data.id state.accessToken = data.accesstoken state.loginName = data.loginname state.avatarUrl = data.avatar_url } catch (err) { console.log(err) } }, [SET_DETAIL] (state, data) { try { state.score = data.score state.recentTopics = data.recent_topics state.recentReplies = data.recent_replies state.github = data.githubUsername || "" state.createAt = data.create_at } catch (err) { console.log(err) } } } export default { state, mutations }
上面有個(gè)mutation_types是用來讓mutation唯一的,在mutation_types里面是這樣的:
// user info export const SET_BASEINFO = "SET_BASEINFO" export const SET_DETAIL = "SET_DETAIL"
用const來保證唯一性。
然后我們需要將modules加到store里面,新建一個(gè)/src/vuex/store.js文件:
import Vue from "vue" import Vuex from "vuex" import userInfo from "./modules/user_info" Vue.use(Vuex) const debug = process.env.NODE_ENV !== "production" export default new Vuex.Store({ modules: { userInfo }, strict: debug, middlewares: debug ? [] : [] })
再把其在App.vue里面引用,App.vue加入:
import store from "./vuex/store" export default { store }
這樣我們就可以用:
vuex: { getters: { accessToken: ({ userInfo }) => userInfo.accessToken } }
來獲取用戶數(shù)據(jù)了。
actions我們將獲取用戶信息,保存用戶信息的邏輯全放在vuex的actions里面,而不是在業(yè)務(wù)邏輯里面獲取,只是在vuex里面保存一下。這樣業(yè)務(wù)邏輯就更扁平了,數(shù)據(jù)的獲取只需要調(diào)用一下actions里面的函數(shù),用getter來動(dòng)態(tài)獲取。具體代碼如下:
// /src/vuex/actions/user_actions.js import * as types from "../mutation_types" import { setMsg } from "../../tool" import Vue from "vue" let localStorage = window.localStorage let storeBaseInfo = (data) => { localStorage.setItem("cnodeBaseInfo", JSON.stringify(data)) } let storeDetailInfo = (data) => { localStorage.setItem("cnodeDetailInfo", JSON.stringify(data)) } // 獲取存儲(chǔ)在localStorage中的數(shù)據(jù) export const getStore = ({ dispatch, state }) => { if (localStorage.getItem("cnodeBaseInfo")) { let data = JSON.parse(localStorage.getItem("cnodeBaseInfo")) dispatch(types.SET_BASEINFO, data) } if (localStorage.getItem("cnodeDetailInfo")) { let data = JSON.parse(localStorage.getItem("cnodeDetailInfo")) dispatch(types.SET_DETAIL, data) } } // 設(shè)置基礎(chǔ)數(shù)據(jù) export const setBaseInfo = ({ dispatch, state }, token, callback) => { Vue.http({ url: "/api/v1/accesstoken", method: "POST", body: JSON.stringify({ accesstoken: token }), headers: { contentType: "application/x-www-form-urlencoded" } }).then(function (res) { let data = JSON.parse(res.data) if (data.success) { data.accesstoken = token delete data.success storeBaseInfo(data) dispatch(types.SET_BASEINFO, data) callback(setMsg(true, "登錄成功")) } else { console.log(data.error_msg) callback(setMsg(false, data.error_msg)) } }).catch(err => { console.log(err) let errBody = JSON.parse(err.body) callback(setMsg(false, errBody.error_msg)) }) }
上面有個(gè)setMsg的函數(shù),只是用來將格式化返回給組件的內(nèi)容的,把a(bǔ)ction寫的就像一個(gè)接口一樣。
上面用了vue-resource。然后我們做的事主要就件,調(diào)用接口,拿數(shù)據(jù),錯(cuò)誤處理,保存數(shù)據(jù)到localStorage,返回?cái)?shù)據(jù)。
接下來,我們看看組件里面的獲取數(shù)據(jù):
import dialog from "../common/dialog" import { setBaseInfo, setDetail } from "../../vuex/actions/user_actions" import { setMenu, setTip } from "../../vuex/actions/doc_actions" export default { vuex: { actions: { setBaseInfo, setMenu, setTip, setDetail } }, data () { return { config: { visible: false, text: "在 Cnode社區(qū)網(wǎng)站端登錄你的賬戶,然后在右上角找到【設(shè)置】按鈕,點(diǎn)擊進(jìn)入后將頁面滑動(dòng)到最底部來查看你的Access Token。", sureText: "確定" }, access: "" } }, methods: { dialog () { this.config.visible = true }, success () { window.history.go(-1) this.setMenu(true) this.setDetail() }, login () { if (this.access.length < 6) { this.setTip({ text: "請(qǐng)輸入正確的Access Token" }) return } this.setBaseInfo(this.access, (res) => { if (res.success) { this.success() } this.setTip({ text: res.msg }) }) } }, components: { dialog } }
首先引入actions,然后調(diào)用,因?yàn)榉祷財(cái)?shù)據(jù)格式事固定的,直接做判斷,錯(cuò)誤就用dialog彈錯(cuò)錯(cuò)誤。是不是很清爽。
小結(jié)我感覺要仔仔細(xì)細(xì)把所有全部講完,篇幅太長了。。。大家還是看看我這做個(gè)指引,具體還是看代碼
原文地址:http://hiluluke.cn/2016/08/20...
其他
使用Vue快速開發(fā)單頁應(yīng)用-主體結(jié)構(gòu)
使用Vue快速開發(fā)單頁應(yīng)用-vue-router
使用Vue快速開發(fā)單頁應(yīng)用-登錄頁面
使用Vue快速開發(fā)單頁應(yīng)用-功能組件與路由組件通信
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/80172.html
摘要:本文以及后面相應(yīng)文章,主要是相關(guān)技術(shù)棧來快速的實(shí)現(xiàn)單頁應(yīng)用開發(fā)。原文出處其他使用快速開發(fā)單頁應(yīng)用主體結(jié)構(gòu)使用快速開發(fā)單頁應(yīng)用使用快速開發(fā)單頁應(yīng)用登錄頁面使用快速開發(fā)單頁應(yīng)用功能組件與路由組件通信 本文所涉及代碼全在vue-cnode 單頁應(yīng)用,即在一個(gè)頁面集成系統(tǒng)中所有功能,整個(gè)應(yīng)用只有一個(gè)頁面。因?yàn)槁酚傻目刂圃谇岸耍瑔雾撁鎽?yīng)用在頁面切換時(shí)比傳統(tǒng)頁面更快,從而在前端體驗(yàn)更好。 將邏輯從...
摘要:展示信息展示時(shí)間結(jié)束后,執(zhí)行回調(diào)函數(shù)如果有上面就完成了組件的整套邏輯,最后我們還需要把組件掛在。原文鏈接其他使用快速開發(fā)單頁應(yīng)用主體結(jié)構(gòu)使用快速開發(fā)單頁應(yīng)用使用快速開發(fā)單頁應(yīng)用登錄頁面使用快速開發(fā)單頁應(yīng)用功能組件與路由組件通信 本文所涉及代碼全在vue-cnode showImg(https://segmentfault.com/image?src=http://7fvhwe.com1...
摘要:當(dāng)前路由對(duì)象調(diào)用此函數(shù)處理切換過程的下一步終止切換重定向到另一個(gè)路由由于是路由切換后,只有上面的兩個(gè)屬性。原文地址其他使用快速開發(fā)單頁應(yīng)用主體結(jié)構(gòu)使用快速開發(fā)單頁應(yīng)用使用快速開發(fā)單頁應(yīng)用登錄頁面使用快速開發(fā)單頁應(yīng)用功能組件與路由組件通信 本文所涉及代碼全在vue-cnode vue-router主要作用是將路由控制,轉(zhuǎn)移到前端。我們將會(huì)在vue-router里面保存一個(gè)路由表,在vue...
摘要:上周末看這篇文章時(shí),偶有靈光,所以,分享出來給大家一起看看前端面試四月二十家前端面試題分享請(qǐng)各位讀者添加一下作者的微信公眾號(hào),以后有新的文章,將在微信公眾號(hào)直接推送給各位,非常感謝。 前端切圖神器 avocode 有了這個(gè)神器,切圖再也腰不酸,腿不疼了。 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果讀完本文還不懂,...
摘要:前段時(shí)間項(xiàng)目組計(jì)劃快速開發(fā)一個(gè)新的項(xiàng)目,開發(fā)那邊提供殼子和部分系統(tǒng)級(jí)功能,所有的頁面由完成,考慮兼容性安卓及。后面會(huì)繼續(xù)優(yōu)化,先把目前的基本部署方式記錄下來。 前段時(shí)間項(xiàng)目組計(jì)劃快速開發(fā)一個(gè)新的App項(xiàng)目,App開發(fā)那邊提供殼子和部分系統(tǒng)級(jí)功能,所有的頁面由h5完成,考慮兼容性安卓4.1及ios7.1。全新的項(xiàng)目,沒有歷史包袱,就嘗試了新的開發(fā)模式,采用了webpack + vue-c...
閱讀 1303·2021-11-11 10:57
閱讀 3717·2021-09-07 10:10
閱讀 3442·2021-08-03 14:03
閱讀 3067·2019-08-30 13:45
閱讀 681·2019-08-29 11:19
閱讀 1038·2019-08-28 18:07
閱讀 3099·2019-08-26 13:55
閱讀 808·2019-08-26 12:17