摘要:開發(fā)時官方推薦使用,在配置這個項目時,由于考慮登錄態(tài)的維護,所以對路由配置加了數(shù)據(jù),并增加了路由跳轉(zhuǎn)鉤子函數(shù),進行鑒權(quán)控制受登錄態(tài)的頁面。
vue練手項目 目的
這個項目主要是用vue+vuex實現(xiàn)一個單頁面應(yīng)用,純粹是熟悉vue全家桶相關(guān)開發(fā)模式,用于練手非常合適。
著手開發(fā)完了之后可以學的東西:
熟悉vue單文件組件開發(fā)方式
熟悉如何寫一個vue插件
熟悉如何使用vue-router以及掛載路由鉤子函數(shù)
熟悉vuex是如何運作的,模塊化維護應(yīng)用狀態(tài)數(shù)據(jù)
體驗typescript的開發(fā)方式
如果想學vue的不妨進來看看。
技術(shù)棧vue
vuex
vue-router
typescript
開始開始之前,還是有必要去vue官網(wǎng)學習一下vue,至少得有個大致的了解,后面在用到vue-router和vuex時,再去對應(yīng)的倉庫看文檔就可以了。
vue官網(wǎng)地址
vue-router地址
vuex地址
創(chuàng)建項目可以用vue-cli,具體看這里
結(jié)構(gòu)項目結(jié)構(gòu)一般來說非常重要,定義好的目錄結(jié)構(gòu),非常利于后續(xù)的項目維護,以及別人閱讀理解。下面就是這個項目的結(jié)構(gòu),應(yīng)該看一下就知道是干什么的,大致說一下。
項目結(jié)構(gòu)分為靜態(tài)資源目錄,api接口請求目錄,組件目錄,插件目錄,路由配置目錄,公共樣式目錄,狀態(tài)維護目錄,工具類目錄,頁面視圖目錄。
單頁面組件vue開發(fā)一般都是單頁面組件的方式,即一個以vue為后綴的文件就是一個組件,組件里包含了template模版,script腳本,style樣式,組件內(nèi)的邏輯可以完全封裝在里面,對外可以提供接受的Props數(shù)據(jù),可以對外發(fā)射一個事件emit,或者將外部組件組合到自己內(nèi)部的slot里面。
配置路由
由于在客戶端渲染的單頁面應(yīng)用,需要在客戶端配置路由,實現(xiàn)頁面間的切換。開發(fā)vue時官方推薦使用vue-router,在配置這個項目時,由于考慮登錄態(tài)的維護,所以對路由配置加了meta數(shù)據(jù),并增加了路由跳轉(zhuǎn)鉤子函數(shù),進行鑒權(quán)控制受登錄態(tài)的頁面。
import Vue from "vue"; import Router from "vue-router"; import Sign from "@/views/Sign.vue"; import Me from "@/views/Me.vue"; import { hasLogin } from "@/util/session"; Vue.use(Router); const router = new Router({ mode: "history", routes: [ { path: "/", name: "sign", component: Sign, }, { path: "/me", name: "me", component: Me, meta: { requiredAuth: true }, }, ], }); router.beforeEach((to, from, next) => { if (to.matched.some((record) => record.meta.requiredAuth)) { // this route requires auth, check if logged in // if not, redirect to login page. if (!hasLogin()) { next({ path: "/", query: { redirect: to.fullPath }, }); } else { next(); } } else { next(); // 確保一定要調(diào)用 next() } }); export default router;vue插件編寫
對于那種需要全組件共享,或者全局注入的方法等可以使用vue插件。其實,vue-router和vuex實際就是vue的插件,在入口處,調(diào)Vue.use(Router); 就可以了,比如 Vue.use(Router);
一個插件,可以是一個函數(shù),或者一個包含install方法的對象,在調(diào)用Vue.use時,會調(diào)用install方法。
在插件里,我們可以
添加全局方法或者屬性,
添加全局資源
通過全局 mixin 方法添加一些組件選項
添加 Vue 實例方法
import Vue, { VueConstructor, PluginObject } from "vue"; import Loading from "./Loading.vue"; type ShowFunc = () => () => void; const plugin: PluginObject<{}> = { install(Vue: VueConstructor, options = {}) { const CONSTRUCTOR = Vue.extend(Loading); let cache: Vue & { show: ShowFunc } | null = null; function loading(): () => void { const loadingComponent = cache || (cache = new CONSTRUCTOR()); if (!loadingComponent.$el) { const vm = loadingComponent.$mount(); (document.querySelector("body") as HTMLElement).appendChild(vm.$el); } return loadingComponent.show(); } Vue.prototype.$loading = loading; }, }; export default plugin;狀態(tài)管理
單頁面應(yīng)用的狀態(tài)管理使用vuex,上面提到了,它就是一個vue的插件,會在組件實例上注入$store對象,這個對象就是new Vuex.Store(),相比redux ,我覺得vuex簡單很多。使用需要注意一下幾點就可以了,
改變state,始終是通過commit一個mutation方式進行,mutation函數(shù)里必須是同步改變state,不能異步改變state。對應(yīng)redux中,就是reducer函數(shù)的功能了。
對于異步改變state,可以通過dispatch一個action,action里面異步獲取數(shù)據(jù)之后在commit一個對應(yīng)的mutation。這個在redux里,是通過中間件處理異步action的。
對于state的過濾篩選,可以定義getter,getter是緩存依賴的。
對于大型復雜的state,可以采用模塊化的方式管理各個模塊的state,這個跟redux的思想是一樣的。
本次項目也是用模塊化的管理狀態(tài)的方式,把整個應(yīng)用的狀態(tài)以業(yè)務(wù)劃分為子狀態(tài),最后在modules中合并
modules: { user, list, filter, },
對于單個模塊的state,按照上面的注意點即可以。
// user模塊的state import { ActionTree, MutationTree, ActionContext } from "vuex"; import { login, loginOut, LoginInfo } from "@/api/login"; import { getUserInfo, getUserActions } from "@/api/user"; import { User } from "./user"; import { RootState } from "../../rootstate"; const namespaced = true; /* initial state */ const state = () => ({ id: null, username: null, email: null, avatar: null, likes_count: null, goings_count: null, past_count: null, }); /* user actions */ const actions: ActionTree= { login({ commit, state }: ActionContext , payload: LoginInfo) { return login(payload).then( ({ token, user }: { token: string; user: User }) => { commit("saveToken", token, { root: true }); commit("saveUser", user); }, ); }, getUserInfo({ commit, state }: ActionContext ) { return getUserInfo().then((user: User) => { commit("saveUser", user); }); }, }; /* user mutations */ const mutations: MutationTree = { saveUser(state, user) { state.id = user.id; state.username = user.username; state.email = user.email; state.avatar = user.avatar; state.likes_count = user.likes_count; state.goings_count = user.goings_count; state.past_count = user.past_count; }, }; export default { state, actions, mutations, namespaced, };
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/93764.html
摘要:項目地址前言該項目是采用社區(qū)提供的,基于重寫,在此特別感謝然后也要感謝的項目給予我的啟發(fā)。 項目地址 https://github.com/LeeWgg/CNode DEMO http://www.leewgg.cn/projects... 前言 該項目是采用Cnode社區(qū)提供的api,基于vue2.0重寫,在此特別感謝?。?!然后也要感謝 https://github.com/shin...
摘要:初學應(yīng)該學習哪些知識主要學習基礎(chǔ)知識。接下來要學習如何寫函數(shù),計算屬性。事件處理與修飾符事件通過指令來綁定,在中事件為事件名,所以是很好記憶的。這時可通過來獲取父組件傳遞的值并寫入模板,父組件可通過在子組件寫入屬性的方式傳遞數(shù)據(jù)。 前言 本人剛開始學習vue.js幾天,做了一些練習之后,鑒于每隔一段時間就把學習過的內(nèi)容總結(jié)一番,故此寫下此文章。初學Vue.js應(yīng)該學習哪些知識 1、 v...
vue-mobile-starter View README in English 基于 vue2 + vuex + vue-router 構(gòu)建的移動端單頁微應(yīng)用,適合于vue2、vuex、vue-router核心概念的理解與掌握。 前言 做這個項目的初衷其實很簡單,我司之前一直用angular、react進行PC端項目的開發(fā),但是最近新開展了一些項目打算用vue來做移動端的開發(fā)(緊跟大廠的步伐?...
vue-mobile-starter View README in English 基于 vue2 + vuex + vue-router 構(gòu)建的移動端單頁微應(yīng)用,適合于vue2、vuex、vue-router核心概念的理解與掌握。 前言 做這個項目的初衷其實很簡單,我司之前一直用angular、react進行PC端項目的開發(fā),但是最近新開展了一些項目打算用vue來做移動端的開發(fā)(緊跟大廠的步伐?...
閱讀 3489·2023-04-25 22:04
閱讀 2244·2021-11-22 15:29
閱讀 2230·2021-10-11 10:57
閱讀 1481·2021-09-24 09:48
閱讀 3200·2021-09-09 09:34
閱讀 2625·2021-09-02 15:21
閱讀 2448·2019-08-30 15:53
閱讀 1190·2019-08-30 14:07