摘要:前言從發(fā)布之后,陸陸續(xù)續(xù)做了七八個項目,摸索出來了一套自己的狀態(tài)管理模式,我將之稱為。其實自帶的規(guī)則能夠支持同時記錄全局滾動條自身的滾動條,這樣就能大大的提升了我們的用戶體驗例子源碼官方
前言
從Vue.js 2.x發(fā)布之后,陸陸續(xù)續(xù)做了七八個項目,摸索出來了一套自己的狀態(tài)管理模式,我將之稱為Vuet。它以規(guī)則來驅(qū)動狀態(tài)更新,它帶來的是開發(fā)效率上的飆升,它就像草原,而你是野馬,任你隨意馳騁,總之它是為敏捷開發(fā)而誕生。
緣由在大型的Vue應(yīng)用程序開發(fā)中,多組件通信、多頁面通信,往往是跨不過的坎,一個頁面組件中往往參雜著頁面獲取數(shù)據(jù)的代碼和響應(yīng)用戶操作的代碼,稍有不慎,就使得代碼混亂不堪。A、B、C三個頁面中,都需要同樣的數(shù)據(jù),然后每一個頁面都寫一次、發(fā)送一次請求,不久之后,代碼就十分臃腫了。因此我們就需要vuex這樣的第三方庫來管理狀態(tài)了
Vuet誕生初衷從列表點擊進(jìn)去到詳情,從詳情返回后,我們期望能顯示回原來的位置,而不是整個頁面重新初始化,重新請求數(shù)據(jù),這樣帶來的是用戶體驗的極度糟糕的,我們期望能有一種規(guī)則來定義狀態(tài)應(yīng)該如何更新,這便是Vuet.js誕生的初衷。它以規(guī)則來定義狀態(tài)的更新,它也是一種Vue.js全新的狀態(tài)管理模式。天生的規(guī)則驅(qū)動,使得本次教程的主題,也將變得異常簡單,因為我們只需要定義好頁面更新的規(guī)則即可實現(xiàn)。
有了Vuex還需要Vuet做什么?Vuex和Vuet的出發(fā)點不一樣,Vuex不建議直接更新狀態(tài),而是通過提交mutation來更新狀態(tài),而Vuet則是允許的。因此Vuex和Vuet是可以配合使用的,并且有著不同的應(yīng)用場景,該用Vuex的地方就用Vuex,可用Vuet的地方,就可以使用Vuet
開始上面廢話了那么久,也是因為Vuet.js才剛剛誕生,急需大家的支持。嗯,接下來我們開始本次的主題!
目錄結(jié)構(gòu)|-- pages // 頁面組件 | |-- topic // 主題模塊 | |-- Detail.vue // 主題詳情 | |-- List.vue // 主題列表 |-- router // router相關(guān) | |-- index.js // 入口文件 | |-- router.js // 實例化VueRouter |-- vuet // vuet相關(guān) | |-- index.js // 入口文件 | |-- topic-detail.js // 主題詳情的狀態(tài) | |-- topic-list.js // 主題列表的狀態(tài) | |-- vuet.js // 實例化Vuet |- index.html // 程序頁面入口文件 |- main.js // Vue實例化入口文件
上面是我們本次項目的基本目錄結(jié)構(gòu)
安裝模塊npm install vue vue-router vuet --save
這些都是基本的模塊,想必不用多說,大家都知道的。
route規(guī)則先給出官方文檔地址
本章的主題,核心就是在route規(guī)則身上,它能幫你獲取、更新、重置頁面的狀態(tài),配合v-route-scroll指令就能幫你處理頁面的全局滾動條和div元素自身的滾動條
main.js
import Vue from "vue" import router from "./router/" import vuet from "./vuet/" export default new Vue({ el: "#app", vuet, router, render (h) { return h("router-view") } })
vuet/index.js
import vuet from "./vuet" export default vuet
vuet/vuet.js
import Vue from "vue" import Vuet from "vuet" import topicList from "./topic-list" import topicDetail from "./topic-detail" Vue.use(Vuet) const vuet = new Vuet({ data () { return { loading: true, // 請求中 loaderr: false // 請求失敗 } }, pathJoin: "-", // 父子模塊的連接路徑 modules: { topic: { list: topicList, detail: topicDetail } } }) vuet.beforeEach(({ path, params, state }) => { state.loading = true state.loaderr = false }) vuet.afterEach((err, { path, params, state }) => { state.loading = false state.loaderr = !!err }) export default vuet
vuet/topic-list.js
export default { routeWatch: "query", // 定義頁面的更新規(guī)則 data () { return { data: [], tabs: [ { label: "全部", value: "all" }, { label: "精華", value: "good" }, { label: "分享", value: "share" }, { label: "問答", value: "ask" }, { label: "招聘", value: "job" } ] } }, async fetch ({ route }) { const { tab = "" } = route.query const { data } = await window.fetch(`https://cnodejs.org/api/v1/topics?mdrender=false&tab=${tab}`).then(response => response.json()) return { data } } }
vuet/topic-detail.js
export default { routeWatch: "params.id", // 定義頁面的更新規(guī)則 data () { return { data: { id: null, author_id: null, tab: null, content: null, title: null, last_reply_at: null, good: false, top: false, reply_count: 0, visit_count: 0, create_at: null, author: { loginname: null, avatar_url: null }, replies: [], is_collect: false } } }, async fetch ({ route }) { const { data } = await window.fetch(`https://cnodejs.org/api/v1/topic/${route.params.id}`).then(response => response.json()) return { data } } }
router/index.js
import router from "./router" export default router
router/router.js
import Vue from "vue" import VueRouter from "vue-router" import TopicList from "../pages/topic/List" import TopicDetail from "../pages/topic/Detail" Vue.use(VueRouter) const RouterView = { render (h) { return h("router-view") } } const router = new VueRouter({ routes: [ { path: "/", component: RouterView, children: [ { path: "", name: "topic-list", component: TopicList }, { path: "/:id", name: "topic-detail", component: TopicDetail } ] } ] }) export default router
pages/topic/List.vue
{{ item.label }}
{{ item.title }}
pages/topic/Detail.vue
總結(jié){{ detail.data.title }}
咋的一看,Vuet看起來也不是很復(fù)雜,只需要定義好模塊狀態(tài),然后在組件中設(shè)置對應(yīng)的規(guī)則來更新模塊的狀態(tài)即可。其實vuet自帶的route規(guī)則能夠支持同時記錄全局滾動條、div自身的滾動條,這樣就能大大的提升了我們的用戶體驗
例子源碼
Vuet官方
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/87047.html
摘要:這是基于進(jìn)行狀態(tài)管理的完整項目,包含了用戶的登錄退出,路由頁面,滾動位置還原,帖子編輯狀態(tài)保存等等,麻雀雖小,卻是五臟俱全。 前言 上一篇《Vue.js輕松實現(xiàn)頁面后退時,還原滾動位置》只是簡單的實現(xiàn)了路由切換時進(jìn)行的滾動位置還原,很多朋友就來問上拉加載怎么實現(xiàn)?。∮谑俏蚁肫鹆艘郧白鲞^一個叫vue-cnode的項目,于是花了兩天時間進(jìn)行了重構(gòu),完全的移除了Vuex,使用了Vuet來做為...
摘要:對于那些老網(wǎng)站或者老項目來說全盤改造成并不現(xiàn)實,于是就有了局部頁面刷新這個解決方案。如果不知道局部頁面刷新是何物請看這里,這里和這里。但實際上,第一次后退無法還原的內(nèi)容陷阱,第二次后退頁面刷新了一切恢復(fù)最初的樣子。 ajax在現(xiàn)代網(wǎng)站已經(jīng)得到非常普遍地應(yīng)用,主要的好處大家都知道(異步加載數(shù)據(jù),不用刷新整個瀏覽器,更小的數(shù)據(jù)傳輸尺寸)。對于那些老網(wǎng)站或者老項目來說全盤改造成ajax并不現(xiàn)...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
閱讀 1462·2021-09-13 10:25
閱讀 631·2019-08-30 15:53
閱讀 2325·2019-08-30 15:44
閱讀 2110·2019-08-29 17:20
閱讀 1656·2019-08-29 16:36
閱讀 1867·2019-08-29 14:10
閱讀 1846·2019-08-29 12:44
閱讀 1231·2019-08-23 14:13