vue技術分享之你可能不知道的7個秘密

2021-09-02 01:11:59 字數 4015 閱讀 3739

本文是vue原始碼貢獻值chris fritz在公共場合的一場分享,覺得分享裡面有不少東西值得借鑑,雖然有些內容我在工作中也是這麼做的,還是把大神的ppt在這裡翻譯一下,希望給朋友帶來一些幫助。

一、善用watch的immediate屬性

這一點我在專案中也是這麼寫的。例如有請求需要再也沒初始化的時候就執行一次,然後監聽他的變化,很多人這麼寫:

created(),

watch:

}

上面的這種寫法我們可以完全如下寫:

watch: 

}

二、元件註冊,值得借鑑

一般情況下,我們元件如下寫:

import basebutton from './basebutton'

import baseicon from './baseicon'

import baseinput from './baseinput'

export default

}//前端全棧學習交流圈:866109386

//面向1-3經驗年前端開發人員

//幫助突破技術瓶頸,提公升思維能力

步驟一般有三部,

第一步,引入、

第二步註冊、

第三步才是正式的使用,

這也是最常見和通用的寫法。但是這種寫法經典歸經典,好多元件,要引入多次,註冊多次,感覺很煩。

我們可以借助一下webpack,使用 require.context() 方法來建立自己的(模組)上下文,從而實現自動動態require元件。

思路是:在src資料夾下面main.js中,借助webpack動態將需要的基礎元件統統打包進來。

**如下:

import vue from 'vue'

import upperfirst from 'lodash/upperfirst'

import camelcase from 'lodash/camelcase'

// require in a base component context

const requirecomponent = require.context(

『./components', false, /base-[\w-]+\.vue$/)

requirecomponent.keys().foreach(filename => )

//前端全棧學習交流圈:866109386

//面向1-3經驗年前端開發人員

//幫助突破技術瓶頸,提公升思維能力

這樣我們引入元件只需要第三步就可以了:

三、精簡vuex的modules引入

對於vuex,我們輸出store如下寫:

import auth from './modules/auth'

import posts from './modules/posts'

import comments from './modules/comments'

// ...

export default new vuex.store(

})

要引入好多modules,然後再註冊到vuex.store中~~

精簡的做法和上面類似,也是運用 require.context()讀取檔案,**如下:

import camelcase from 'lodash/camelcase'

const requiremodule = require.context('.', false, /\.js$/)

const modules = {}

requiremodule.keys().foreach(filename =>

})export default modules

//前端全棧學習交流圈:866109386

//面向1-3經驗年前端開發人員

//幫助突破技術瓶頸,提公升思維能力

這樣我們只需如下**就可以了:

import modules from './modules'

export default new vuex.store()

四、路由的延遲載入

這一點,關於vue的引入,我之前在 vue專案重構技術要點和總結 中也提及過,可以通過require方式或者import()方式動態載入元件。

或者

載入路由。

五、router key元件重新整理

下面這個場景真的是傷透了很多程式設計師的心…先預設大家用的是vue-router來實現路由的控制。 假設我們在寫乙個部落格**,需求是從/post-haorooms/a,跳轉到/post-haorooms/b。然後我們驚人的發現,頁面跳轉後資料竟然沒更新?!原因是vue-router"智慧型地"發現這是同乙個元件,然後它就決定要復用這個元件,所以你在created函式裡寫的方法壓根就沒執行。通常的解決方案是監聽$route的變化來初始化資料,如下:

data() 

}, watch:

},methods: ,

getpost(id)

}

bug是解決了,可每次這麼寫也太不優雅了吧?秉持著能偷懶則偷懶的原則,我們希望**這樣寫:

data() 

},created () ,

methods ()

}

解決方案:給router-view新增乙個唯一的key,這樣即使是公用元件,只要url變化了,就一定會重新建立這個元件。

六、唯一元件根元素

場景如下:

(emitted value instead of an instance of error)

error compiling template:

-component template should contain exactly one root element. if you are using v-if on multiple elements, use v-else-if to chain them instead.

模板中div只能有乙個,不能如上面那麼平行2個div。

例如如下**:

}   

會報錯!

我們可以用render函式來渲染

functional: true,

render(h, )

)}//前端全棧學習交流圈:866109386

//面向1-3經驗年前端開發人員

//幫助突破技術瓶頸,提公升思維能力

七、元件包裝、事件屬性穿透問題

當我們寫元件的時候,通常我們都需要從父元件傳遞一系列的props到子元件,同時父元件監聽子元件emit過來的一系列事件。舉例子:

//父元件

//子元件}

這樣寫很不精簡,很多屬性和事件都是手動定義的,我們可以如下寫:

computed: 

}}

$attrs包含了父作用域中不作為 prop 被識別 (且獲取) 的特性繫結 (class 和 style 除外)。當乙個元件沒有宣告任何 prop 時,這裡會包含所有父作用域的繫結,並且可以通過 v-bind="$attrs" 傳入內部元件。

$listeners包含了父作用域中的 (不含 .native 修飾器的) v-on 事件***。它可以通過 v-on="$listeners" 傳入內部元件。

你可能不知道的東西

元素可以分為塊級元素,行內元素以及行內塊級元素。行內元素的margin或者padding只有margin left和margin right以及padding left和padding right有效果,margin top margin bottom padding top padding bot...

你可能不知道的const

眾所周知,使用 const 宣告的變數必須同時初始化為某個值。一經宣告,在其生命週期的任何時候都不能再重新賦予新值 const a syntaxerror 常量宣告時沒有初始化 const b 3 console.log b 3 b 4 typeerror 給常量賦值const 宣告只應用到頂級原語...

你可能不知道的python logging機制

先來看幾個例子,先想一下執行結果,答案稍後揭曉 例一 mylogger logging.getlogger mylogger mylogger.info mylogger info mylogger.warning mylogger warning 例二 mylogger logging.getlo...