国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Vue.js輕松實(shí)現(xiàn)頁面后退時(shí),還原滾動(dòng)位置

趙連江 / 3170人閱讀

摘要:前言從發(fā)布之后,陸陸續(xù)續(xù)做了七八個(gè)項(xiàng)目,摸索出來了一套自己的狀態(tài)管理模式,我將之稱為。其實(shí)自帶的規(guī)則能夠支持同時(shí)記錄全局滾動(dòng)條自身的滾動(dòng)條,這樣就能大大的提升了我們的用戶體驗(yàn)例子源碼官方

前言

Vue.js 2.x發(fā)布之后,陸陸續(xù)續(xù)做了七八個(gè)項(xiàng)目,摸索出來了一套自己的狀態(tài)管理模式,我將之稱為Vuet。它以規(guī)則來驅(qū)動(dòng)狀態(tài)更新,它帶來的是開發(fā)效率上的飆升,它就像草原,而你是野馬,任你隨意馳騁,總之它是為敏捷開發(fā)而誕生。

緣由

在大型的Vue應(yīng)用程序開發(fā)中,多組件通信、多頁面通信,往往是跨不過的坎,一個(gè)頁面組件中往往參雜著頁面獲取數(shù)據(jù)的代碼和響應(yīng)用戶操作的代碼,稍有不慎,就使得代碼混亂不堪。A、B、C三個(gè)頁面中,都需要同樣的數(shù)據(jù),然后每一個(gè)頁面都寫一次、發(fā)送一次請求,不久之后,代碼就十分臃腫了。因此我們就需要vuex這樣的第三方庫來管理狀態(tài)了

Vuet誕生初衷

從列表點(diǎn)擊進(jìn)去到詳情,從詳情返回后,我們期望能顯示回原來的位置,而不是整個(gè)頁面重新初始化,重新請求數(shù)據(jù),這樣帶來的是用戶體驗(yàn)的極度糟糕的,我們期望能有一種規(guī)則來定義狀態(tài)應(yīng)該如何更新,這便是Vuet.js誕生的初衷。它以規(guī)則來定義狀態(tài)的更新,它也是一種Vue.js全新的狀態(tài)管理模式。天生的規(guī)則驅(qū)動(dòng),使得本次教程的主題,也將變得異常簡單,因?yàn)槲覀冎恍枰x好頁面更新的規(guī)則即可實(shí)現(xiàn)。

有了Vuex還需要Vuet做什么?

Vuex和Vuet的出發(fā)點(diǎn)不一樣,Vuex不建議直接更新狀態(tài),而是通過提交mutation來更新狀態(tài),而Vuet則是允許的。因此Vuex和Vuet是可以配合使用的,并且有著不同的應(yīng)用場景,該用Vuex的地方就用Vuex,可用Vuet的地方,就可以使用Vuet

開始

上面廢話了那么久,也是因?yàn)閂uet.js才剛剛誕生,急需大家的支持。嗯,接下來我們開始本次的主題!

目錄結(jié)構(gòu)
|-- pages                 // 頁面組件
|   |-- topic             // 主題模塊
|       |-- Detail.vue    // 主題詳情
|       |-- List.vue      // 主題列表
|-- router                // router相關(guān)
|   |-- index.js          // 入口文件
|   |-- router.js         // 實(shí)例化VueRouter
|-- vuet                  // vuet相關(guān)
|   |-- index.js          // 入口文件
|   |-- topic-detail.js   // 主題詳情的狀態(tài)
|   |-- topic-list.js     // 主題列表的狀態(tài)
|   |-- vuet.js           // 實(shí)例化Vuet
|- index.html             // 程序頁面入口文件
|- main.js                // Vue實(shí)例化入口文件

上面是我們本次項(xiàng)目的基本目錄結(jié)構(gòu)

安裝模塊
npm install vue vue-router vuet --save

這些都是基本的模塊,想必不用多說,大家都知道的。

route規(guī)則

先給出官方文檔地址
本章的主題,核心就是在route規(guī)則身上,它能幫你獲取、更新、重置頁面的狀態(tài),配合v-route-scroll指令就能幫你處理頁面的全局滾動(dòng)條和div元素自身的滾動(dòng)條

code社區(qū)api為例子

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

  
  
  

pages/topic/Detail.vue

  
  
  

總結(jié)

咋的一看,Vuet看起來也不是很復(fù)雜,只需要定義好模塊狀態(tài),然后在組件中設(shè)置對應(yīng)的規(guī)則來更新模塊的狀態(tài)即可。其實(shí)vuet自帶的route規(guī)則能夠支持同時(shí)記錄全局滾動(dòng)條、div自身的滾動(dòng)條,這樣就能大大的提升了我們的用戶體驗(yàn)

例子源碼

Vuet官方

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/87047.html

相關(guān)文章

  • Vue.js項(xiàng)目重構(gòu),輕松實(shí)現(xiàn)上拉加載滾動(dòng)位置還原

    摘要:這是基于進(jìn)行狀態(tài)管理的完整項(xiàng)目,包含了用戶的登錄退出,路由頁面,滾動(dòng)位置還原,帖子編輯狀態(tài)保存等等,麻雀雖小,卻是五臟俱全。 前言 上一篇《Vue.js輕松實(shí)現(xiàn)頁面后退時(shí),還原滾動(dòng)位置》只是簡單的實(shí)現(xiàn)了路由切換時(shí)進(jìn)行的滾動(dòng)位置還原,很多朋友就來問上拉加載怎么實(shí)現(xiàn)啊!于是我想起了以前做過一個(gè)叫vue-cnode的項(xiàng)目,于是花了兩天時(shí)間進(jìn)行了重構(gòu),完全的移除了Vuex,使用了Vuet來做為...

    junbaor 評論0 收藏0
  • Ajax局部頁面刷新和History API結(jié)合的陷阱

    摘要:對于那些老網(wǎng)站或者老項(xiàng)目來說全盤改造成并不現(xiàn)實(shí),于是就有了局部頁面刷新這個(gè)解決方案。如果不知道局部頁面刷新是何物請看這里,這里和這里。但實(shí)際上,第一次后退無法還原的內(nèi)容陷阱,第二次后退頁面刷新了一切恢復(fù)最初的樣子。 ajax在現(xiàn)代網(wǎng)站已經(jīng)得到非常普遍地應(yīng)用,主要的好處大家都知道(異步加載數(shù)據(jù),不用刷新整個(gè)瀏覽器,更小的數(shù)據(jù)傳輸尺寸)。對于那些老網(wǎng)站或者老項(xiàng)目來說全盤改造成ajax并不現(xiàn)...

    JasinYip 評論0 收藏0
  • 關(guān)于Vue2一些值得推薦的文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...

    sutaking 評論0 收藏0

發(fā)表評論

0條評論

趙連江

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<