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

資訊專欄INFORMATION COLUMN

Vue 2.0 升(cai)級(keng)之旅

lidashuang / 1004人閱讀

摘要:前言這節凈是些嘮叨,只想看升級的可直接跳過。在不久之前,如約發布了版本。正如計劃之初,博客的版本也將升級到。升級之旅首先,升級依賴。那該怎么做哪再一次谷哥和查閱文檔,然而一無所獲。返回的是整個項目路由的實例,它是只讀的。

Troubleshooting of upgrading Vue from 1.0 to 2.0

系列文章:

Vue 2.0 升(cai)級(keng)之旅 (本文)

Vuex — The core of Vue application

從單頁應用(SPA)到服務器渲染(SSR)

本文不包含 Vue 2.0 所有新特性,如 SSR 等,本文并沒有涉及,本文只包含 個人博客項目 升級中所遇到的經驗分享,如有興趣,可以查看 Vue 2.0 changes log。

前言

這節凈是些嘮叨,只想看升(tian)級(keng)的可直接跳過。

從去年年底開始寫博客,那時對怎么搞個博客網站一竅不通,看別人用 Github Pages 寫博客挺贊的,就也想搞個玩玩。技術選型時,在 jekyll 和 hexo 中選擇了前者,或許你會問為什么?估計當時大腦的供氧量不足了吧...

于是,我的博客就這么誕生了。(jekyll 版的博客已經廢棄了,如果你有興趣,可以查看之前的提交)

可是,用久了就發現并不怎么好用,雖然支持 markdown,可代碼塊要轉換成 highlighter 標簽;其次,主題模板是挺好看,可換成中文字雜就那么別扭哪;還有,對 jekyll 的模板又不熟,自定義也不方便。

年初有一天,突然想到自己也是搞技術的,為啥不自己搭一個博客網站哪?對,順帶還能學學新技術,何樂而不為。又到了技術選型的時候了,這次擺在我面前又有 2 個選擇,React 和 Vue,這次我選擇了后者。

Why?因為,后者更輕量級,也更貼近我熟悉的 Angular 的語法,還有,那時網上就有說今年 4 月 Vue 會升級到 2.0 和 Vue 兼具 React 和 Angular 的優點等等。(好吧,老實說,不選 React 只是因為不喜歡 JSX 而已。-_-||)

So,我就用 Vue 1.10+ 搭建了自己的新博客——Disciple.Ding Blog(點這里看源碼),并漸漸地往里添加一些新學到的東西,ES6, webpack, docker 等,并在 DAOcloud 上發布了。(免費用了人家那么久的服務,在這里做個硬廣也是應該的,DAOcloud 的確很好用,特別和 Github 綁定之后能自動構建,應用更新也及其簡單,只是有個缺點就是有帶寬限制。)

在不久之前,Vue 如約發布了 2.0 版本。正如計劃之初,博客 Vue 的版本也將升級到 2.0。

說了那么多,再不進入正題就要變成標題黨了。好,那就開始我們的升(cai)級(keng)之旅。

升(tian)級(keng)之旅

首先,升級依賴。

npm install vue@next vue-router@next --save
import vue

順利安裝完成并按 changelog 做了修改之后,啟動項目也正常,當我興致勃勃地打開 Browser,駕輕就熟地輸入 localhost,并自然而然地按下 Enter,一切水到渠成。

然而,迎接我的竟是一片白板,控制臺里赫然映著一串紅字。

[Vue warn] : You are using the runtime-only build of Vue where the template option is not available. Either pre-compile the templates into render functions, or use the compiler-included build. (found in root instance)

What? template 選項不能用了,changelog 沒提到啊?但 vue-router 的例子中都在用啊,什么鬼?甚至我將代碼全部替換成例子中的代碼依舊無法運行,但在 vue-router 項目里就能跑,什么鬼啊!

但是,我并不妥協,分別打斷點運行,發現兩者竟然跑的不是同一段代碼,納尼!

import vue from "vue"

同樣的 import 語句,卻有不一樣的結果,vue-router 中引的是 vue.js,而在我的項目中引的竟然是 vue.common.js...common...mon...n...

為什么會引 vue.common.js,from "vue" 不該引的是 vue.js 么?這就要引入另一個知識點:package.json。

package.json 中的 main 屬性決定了,當項目被引入時,輸出的是哪個文件,而 vue 的 package.json 中的 main 指向的是 dist/vue.common.js

福利時間:推薦一個網站 json.is,它對 package.json 里的每條屬性都有詳細的解釋。

找到了問題產生的原因,那么解決也就輕而易舉了。

import vue from "vue/dist/vue.js"

每次引用 vue 的時候都要寫那么長,一點都不優雅,而且為什么 vue-router 的例子可以用啊?

我要一探究竟。確認了 vue-router 中依賴的 vue 的 package.json 文件中的 main 字段指向的也是 dist/vue.common.js。那就只有一個可能了,webpack 對引入做了處理,查看 webpack.config.js

module.exports = {
    // 省略...
    resolve: {
        alias: {
            "vue": "vue/dist/vue.js"
        }
    },
    ...

果然啊~他用 webpack 的別名功能把 vue/dist/vue.js 命名成了 vue,防不勝防。

在自己項目的 wepack.config.js 里同樣給 vue 起別名,這樣就又能愉快地使用 import vue from "vue" 了。

你是不是以為這樣就結束了?不,對待一個問題要刨根問底,不能不求甚解。

為什么 vue 默認導出的是 vue.common.js,它和 vue.js 的區別在哪里,又有什么關系?

這個問題在囧克斯的博客中有提到。

Vue 最早會打包生成三個文件,一個是 runtime only 的文件 vue.common.js,一個是 compiler only 的文件 compiler.js,一個是 runtime + compiler 的文件 vue.js。

也就是說,vue.js = vue.common.js + compiler.js,而如果要使用 template 這個屬性的話就一定要用 compiler.js,那么,引入 vue.js 是最恰當的。

路由升級

vue-router 的升級并不困難,參照 Releases Note 上的注釋修改應該沒有什么大問題,主要的變化有兩點:

路由配置從一系列的方法調用,變成了傳遞一個配置對象

原先的 v-link 指令,變成了 router-link Component,路徑指向用 to 屬性

正當你以為會一路順風順水,輕松升級路由完成的時候,現實總會給你當頭一棒。

之前博客的 vue-router 中使用了 beforeEachafterEach 方法,根據 Release Note

router.beforeEach (replaced by the beforeEach option)

router.afterEach (replaced by the afterEach option)

行,那我把它改到配置里

const ROUTER_SETTING = {
    routes: [
        // 省略...
    ],
    beforeEach: () => { /* some function */ },
    afterEach: () => { /* some function */ }
}

But, not work. What"s wrong?

難道我哪里寫錯了?又經過我一番谷哥和查閱文檔之后,發現在下一個版本的 Release Note 中有這么一段

beforeEach and afterEach are reverted as router instance methods (options removed). This makes it more convenient for plugins/modules to add hooks after the router instance has been created.

好吧,它又被恢復回路由實例的方法了。那么,改回去

const router = new VueRouter(ROUTER_SETTING);

router
    .beforeEach(() => { /* some function */ })
    .afterEach(() => { /* some function */ });

OK,這樣總好了吧。然而,并沒有...console 中報出無法從 undefined 中讀取 afterEach,好吧,我猜這應該是 beforeEach 中沒有像之前一樣返回路由對象,所以不能鏈式調用。

class VueRouter {
    // 省略...
    beforeEach (fn: Function) {
        this.beforeHooks.push(fn)
    }
    
    afterEach (fn: Function) {
        this.afterHooks.push(fn)
    }
    // 省略...
}

看一眼源碼,果然如此。

那再將之前的代碼稍作修改就可以了。

const router = new VueRouter(ROUTER_SETTING);

router.beforeEach(() => { /* some function */ });
router.afterEach(() => { /* some function */ });

不過,不能鏈式調用似乎沒之前的優雅了哪~

最后,提一下 vue-router 2.0 里所有的 hook(就像之前的 beforeEach, afterEach,以及每個路由狀態中的 beforeEnter, beforeRouteLeave等)都具有相同的參數簽名,這在 Release Note 中也有提到。

fn (toRoute, redirect, next) {
    // toRoute: {Object} 當前路由對象
    // redirect: {Function} 調用跳轉至另一路由
    // next: {Function} 調用繼續當前路由跳轉
    // 什么都不做,則取消當前跳轉
}

路由升級完成后,如果控制臺沒有什么報錯,那么,路由可以相互切換了,那些不依賴數據讀取的組件已經可以正常顯示了。

那些依賴數據讀取的組件哪?

這就要提到組件的生命周期鉤子(即 lifecycle hooks)

Lifecycle hooks

生命周期鉤子應該算 vue 這次升級中 broken changes 最多的一部分了,對照 1.0 的文檔和 release note,作了下面這張表

vue 1.0+ vue 2.0 Description
init beforeCreate 組件實例剛被創建,組件屬性計算之前,如 data 屬性等
created created 組件實例創建完成,屬性已綁定,但 DOM 還未生成,$el 屬性還不存在
beforeCompile beforeMount 模板編譯/掛載之前
compiled mounted 模板編譯/掛載之后
ready mounted 模板編譯/掛載之后(不保證組件已在 document 中)
- beforeUpdate 組件更新之前
- updated 組件更新之后
- activated for keep-alive,組件被激活時調用
- deactivated for keep-alive,組件被移除時調用
attached - 不用了還說啥哪...
detached - 那就不說了吧...
beforeDestory beforeDestory 組件銷毀前調用
destoryed destoryed 組件銷毀后調用

知道了 hooks 升級前后的對應關系,那么升級起來就輕而易舉了,改改組件的屬性名就可以了。

那么,改完屬性名是不是就完成了?然而并沒有。

因為,在 vue 1.0+ 中,如果一個組件和路由相關,那么,它就可能不單單有自己組件的 lifecycle hooks,它還會有基于 vue-router 的 lifecycle hooks。

而在 vue 2.0 中,router lifecycle hooks 全部被移除了,因為,這些 hooks 可以通過其他的方式來代替,這樣不但簡化了配置,還不用在組件中去處理路由相關的業務,降低了耦合。那這些 hooks 該如何替換,我們接下來就來看一下。

activate & deactivate:使用組件自身的 lifecycle hook 替代

data:通過組件 watch 屬性來監聽當前路由 $route 的變化

canActivate:由路由屬性 beforeEnter 來代替

canDeactivate:由路由屬性 beforeRouteLeave 來代替

canReuse:去除

那個這個是不是也直接改改屬性名就好了哪?

恩,差不多。不過需要注意的是,如果原先 hooks 中使用了有關路由信息的 transition 參數是肯定不能用了。比如,根據路由參數來進行查詢,原先通過 transition.to.params 獲取路由參數,現在就要通過剛剛提到的當前路由對象 this.$route.params 來獲取。

在升級這里的過程中,還遇到一個問題:當用戶輸入的 URL 滿足路由匹配,但根據路由參數無法獲得正確的文章時,我想讓路由直接跳轉到首頁。

在 1.0 版本中,我通過 transition.redirect("/"); 就輕松的回到了首頁,由于 2.0 中沒有 transition 參數,而 $route 只包含當前路由的信息,并不包換路由切換的操作。那該怎么做哪?再一次谷哥和查閱文檔,然而一無所獲。

最后在 vue-router 的例子中找到了解決問題的鑰匙——$router

$router 返回的是整個項目路由的實例,它是只讀的。于是,剛剛那個問題就可以通過 this.$router.replace("/"); 來解決。

這里還有一點,在 1.0 版本中組件配置 route 屬性時還可以設置一個叫 waitForData 的屬性。這個在 2.0 中,我還沒有找到直接的替換方式,不過,我在整個組件上添加 v-if 來處理。從理論和效果的角度上講,v-if 是可以替代原先的 waitForData 屬性,就似乎不那么優雅。

剩余其他小點,看控制臺報錯信息,然后查查 Release Note 都能輕松處理啦~

至此,我的整個 Blog 也升級完成了,歡迎來訪。(查看源碼戳這里)

寫在最后

如果現在再讓我選一個技術來搭博客的話,我會選 React。為啥?

因為 vue 我已經玩過啦,哈哈哈~

最后,借用外國網友的一句話:

I"m constantly rewriting / refactoring this silly little blog using the latest and buzziest tech, so that I can stay up to date on these libraries and frameworks.

這也是我自己搭博客,而不是直接使用博客系統的主要原因。

最后的最后,安利下自己的 Blog,以及 Source Code。

歡迎交流,噴子繞道。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87845.html

相關文章

  • Vuex — The core of Vue application

    摘要:個人看來,一個狀態管理的應用,無論是使用,還是,最困難的部分是在的設計。中,并沒有移除,而是改為用于觸發。也是一個對象,用于注冊,每個都是一個用于返回一部分的。接受一個數組或對象,根據相應的值將對應的綁定到組件上。 系列文章: Vue 2.0 升(cai)級(keng)之旅 Vuex — The core of Vue application (本文) 從單頁應用(SPA)到服務器...

    Aldous 評論0 收藏0
  • 從0開始用python寫一個命令行小游戲(一)

    摘要:最近在用寫一個命令行游戲升級版植物大戰僵尸,順便鞏固一下編程技巧。目前版已經在上發布,這是鏈接。我想在一開始盡量簡化游戲,所以用了一個一維數組我想先不管陽光的問題,用一個類實現基礎的植物大戰僵尸角色的功能。 最近在用python寫一個命令行游戲:升(jian)級(hua)版植物大戰僵尸,順便鞏固一下python編程技巧。在這個過程中,也收獲(cai)了不少樂趣(keng)。目前1.0版...

    Jiavan 評論0 收藏0
  • 開發了一款寫作軟件(OSX,Windows),附帶Electron開發指南

    摘要:本來寫這個項目時就沒打算來自己實現富文本編輯器,本著能用開源就用開源的原則,在項目里測試了一些開源的編輯器,發現或多或少都有些問題,后來一琢磨,反正這個項目的富文本編輯器需求不復雜,就自己實現一個好了。 斷斷續續寫了個把月,終于在昨天完成了第一版… 筆落寫作 一款幫助網絡寫手更方便地進行小說創作的PC軟件,目前支持 OSX/Windows 名字靈感來自于杜甫的一首詩,前兩句是: 《寄...

    OnlyLing 評論0 收藏0
  • 認識Vue組件

    摘要:認識組件組件是強大的功能之一。注意,所有的組件同時也都是的實例,可接受相同的選項對象。組件全局注冊時通過方式注冊。考慮到會出現禁止使用的場景,需要禁止和啟用組件的功能,所以需要。同樣也是先在子組件的選項中定義好傳遞過來的數據。 前言 Vue.js是一套構建用戶界面的漸進式框架(官方說明)。通俗點來說,Vue.js是一個輕量級的,易上手易使用的,便捷,靈活性強的前端MVVM框架。簡潔的A...

    xumenger 評論0 收藏0

發表評論

0條評論

lidashuang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<