1. 程式人生 > >vue.js的幾個小技巧

vue.js的幾個小技巧

第一招:化繁為簡的Watchers

場景還原:

created(){

this.fetchPostList()

},

watch:{

searchInputValue(){

this.fetchPostList()

}

}

元件建立的時候我們獲取一次列表,同時監聽input框,每當發生變化的時候重新獲取一次篩選後的列表這個場景很常見,有沒有辦法優化一下呢?

招式解析:

首先,在watchers中,可以直接使用函式的字面量名稱;其次,宣告immediate:true表示建立元件時立馬執行一次。

watch:{

searchInputValue:{

handler:'fetchPostList',

immediate:true

}

}

第二招:一勞永逸的元件註冊  

場景還原:

created(){

this.fetchPostList()

},

watch:{

searchInputValue(){

this.fetchPostList()

}

}

<BaseInput

v-model="searchText"

@keydown.enter="search"

/>

<BaseButton@click="search">

  <BaseIconname="search"/>

</BaseButton>

我們寫了一堆基礎UI元件,然後每次我們需要使用這些元件的時候,都得先import,然後宣告components,很繁瑣!秉持能偷懶就偷懶的原則,我們要想辦法優化!

招式解析:

我們需要藉助一下神器webpack,使用 require.context() 方法來建立自己的(模組)上下文,從而實現自動動態require元件。這個方法需要3個引數:要搜尋的資料夾目錄,是否還應該搜尋它的子目錄,以及一個匹配檔案的正則表示式。

我們在components資料夾新增一個叫global.js的檔案,在這個檔案裡藉助webpack動態將需要的基礎元件統統打包進來。

import Vuefrom'vue'

functioncapitalizeFirstLetter(string){

returnstring.charAt(0).toUpperCase()+string.slice(1

)

}

constrequireComponent=require.context(

'.',false,/\.vue$/

//找到components資料夾下以.vue命名的檔案

)

requireComponent.keys().forEach(fileName=>{

constcomponentConfig=requireComponent(fileName)

constcomponentName=capitalizeFirstLetter(

fileName.replace(/^\.\//, '').replace(/\.\w+$/, '')

//因為得到的filename格式是: './baseButton.vue', 所以這裡我們去掉頭和尾,只保留真正的檔名

)

Vue.component(componentName,componentConfig.default||componentConfig)

})

最後我們在main.js中import 'components/global.js',然後我們就可以隨時隨地使用這些基礎元件,無需手動引入了。

(雖然是轉載,不過我測試了,很好用,實錘,就是維護起來不知道你程式碼的人,不太理解怎麼寫的)

第三招:釜底抽薪的router key

場景還原:

下面這個場景真的是傷透了很多程式設計師的心…先預設大家用的是Vue-router來實現路由的控制。

假設我們在寫一個部落格網站,需求是從/post-page/a,跳轉到/post-page/b。然後我們驚人的發現,頁面跳轉後資料竟然沒更新?!原因是vue-router”智慧地”發現這是同一個元件,然後它就決定要複用這個元件,所以你在created函式裡寫的方法壓根就沒執行。通常的解決方案是監聽$route的變化來初始化資料,如下:

data(){

return{

loading:false,

error:null,

post:null

}

},

watch:{

'$route':{

handler:'resetData',

immediate:true

}

},

methods:{

resetData(){

this.loading=false

this.error=null

this.post=null

this.getPost(this.$route.params.id)

},

getPost(id){

}

}

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

data(){

return{

loading:false,

error:null,

post:null

}

},

created(){

this.getPost(this.$route.params.id)

},

methods(){

getPost(postId){

// ...

}

}

招式解析:

那要怎麼樣才能實現這樣的效果呢,答案是給router-view新增一個unique的key,這樣即使是公用元件,只要url變化了,就一定會重新建立這個元件。(雖然損失了一丟丟效能,但避免了無限的bug)。同時,注意我將key直接設定為路由的完整路徑,一舉兩得。

<router-view :key="$route.fullpath"></router-view>

(親測,可以,有些類似java的ssm框架 向後臺送請求總願意在後面加個隨機數,保證都是新請求,不過確實消耗資源)

第四招: 無所不能的render函式

場景還原:

vue要求每一個元件都只能有一個根元素,當你有多個根元素時,vue就會給你報錯

<template>

  <li

v-for="route in routes"

    :key="route.name"

  >

    <router-link:to="route">

{{route.title}}

    </router-link>

  </li>

</template>

ERROR-Component template should contain exactly one rootelement.

Ifyou areusingv-ifon multipleelements,usev-else-if

tochain theminstead.

招式解析:

那有沒有辦法化解呢,答案是有的,只不過這時候我們需要使用render()函式來建立HTML,而不是template。其實用js來生成html的好處就是極度的靈活功能強大,而且你不需要去學習使用vue的那些功能有限的指令API,比如v-for, v-if。(reactjs就完全丟棄了template)

functional:true,

render(h,{props}){

returnprops.routes.map(route=>

    <likey={route.name}>

      <router-linkto={route}>

{route.title}

      </router-link>

    </li>

)

}

第五招:無招勝有招的高階元件

劃重點:這一招威力無窮,請務必掌握

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

//父元件

<BaseInput

    :value="value"

label="密碼"

placeholder="請填寫密碼"

@input="handleInput"

@focus="handleFocus>

</BaseInput>

//子元件

<template>

  <label>

    {{ label }}

    <input

      :value="value"

      :placeholder="placeholder"

      @focus=$emit('focus', $event)"

@input="$emit('input', $event.target.value)"

    >

  </label>

</template>

有下面幾個優化點:

1.每一個從父元件傳到子元件的props,我們都得在子元件的Props中顯式的宣告才能使用。這樣一來,我們的子元件每次都需要申明一大堆props, 而類似placeholer這種dom原生的property我們其實完全可以直接從父傳到子,無需宣告。方法如下:

<input

   :value="value"

v-bind="$attrs"

@input="$emit('input', $event.target.value)"

>

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

2.注意到子元件的@focus=$emit('focus', $event)"其實什麼都沒做,只是把event傳回給父元件而已,那其實和上面類似,我完全沒必要顯式地申明:

<input

    :value="value"

v-bind="$attrs"

v-on="listeners"

>

computed:{

listeners(){

return{

...this.$listeners,

input:event=>

this.$emit('input',event.target.value)

}

}

}

相關推薦

vue.js技巧

第一招:化繁為簡的Watchers場景還原:created(){this.fetchPostList()},watch:{searchInputValue(){this.fetchPostList()}}元件建立的時候我們獲取一次列表,同時監聽input框,每當發生變化的時候

NuGet的技巧

com packages 影響 頁面 兼容 images eight 記錄 cef 因為可視化庫程序包管理器的局限性,有很多需要的功能在界面中無法完成。 以下技巧均需要在“程序包管理器控制臺”中使用命令來完成。 一、改變項目目標框架後,更新程序包 當改變項目的目標框架後,無

高效的技巧

編碼格式 輸出 indent 默認 asc encode mps family 寫入 json json 序列化dumps之後,數據會變成很長的一行,如果,數據量非常大就會相當不易查看,使用indent參數來輸出便於查看的JSON。 如: { "終點站": "貴陽站", "

技術好卻進不了大公司?iOS程序員面試的技巧你可要收好了

朋友 知識 了解 一點 今天 刪除 就會 為什麽 年輕 前言: 有很多程序員,專業技術挺好,項目經驗充足,簡歷上金碧輝煌,也面試了很多國內大廠,但就是沒有一家能成功的。處境可以說是相當尷尬。 大家都知道程序員本身就是要吃年輕飯,不僅是技術活,也是體力活。早點跳槽,早點漲薪,

Vue.js 的一個技巧---利用v-for中的index值,來實現隔行變色

type 樣式 lin class idt title mes har oct   首先定義好樣式,利用v-for中的index值,然後綁定樣式來實現隔行變色效果。    以下為完整代碼,很簡單,但也是個技巧。 <!DOCTYPE html> &

第八天,scrapy的技巧

一次 load 動態 content btn ajax加載 select efi def 一. 微博模擬登陸 1. 百度搜微博開放平臺可滿足爬取量不大的情況 2. 微博模擬登陸和下拉鼠標應對ajax加載 from selenium import webdriver

NetLogo程式設計的技巧

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

乾貨:閱讀跟蹤 Java 原始碼的技巧

今天跟大家分享一下我平時閱讀原始碼的幾個小技巧,對於閱讀Java中介軟體如Spring、Dubbo等框架原始碼的同學有一定幫助。 本文基於Eclipse IDE,我們每天都使用的IDE其實提供了很多強大的功能,掌握它們,往往能夠事半功倍。 1、Quick Type Hierarchy 快速檢視類繼承體

PuTTY技巧

增加視窗儲存的輸出 執行了一個命令,輸出了好多東西,但是預設的配置下,PuTTY只儲存了最後200行的內容,滿足不了我們的需求。 我們可以在標題欄上點右鍵選擇 Change settings…,在配置視窗的左邊選擇Window,修改右邊的 Lines of scrollback,改大

Python中使用字典的技巧

讀取 只需要 管理 解包 領取 意思 創建 小技巧 其它 1 解包 所謂解包,就是將字典通過 ** 操作符轉為 Key=Value 的形式,這種形式可以直接傳給函數作為關鍵字參數。 說說適用的幾種情況。 1.1 搜索拼接條件 當應用中使用類似 SQLAlchemy 的 OR

ACM中的技巧(離散化,尺取法,資料預處理)

離散化 使用STL演算法離散化: 思路:先排序,再刪除重複元素,然後就是索引元素離散化後對應的值。 假定待離散化的序列為a[n],b[n]是序列a[n]的一個副本,則對應以上三步為: sor

安裝Oracle Grid的過程中用到的技巧

1.利用檔案來模擬塊裝置 在grid的安裝教程中有一步是 provision the disk devices for use with ASM Filter Driver。但是如果我們沒有多個磁碟怎麼辦,這時可以這樣, 先dd出幾個檔案,例如: dd  bs=30M count=1024 i

使用解構的技巧

本文內容來自Nicholas C. Zakas的《Understanding ECMAScript 6》。 ES6簡化了從物件和陣列中獲取資料的方法,解構可以把一個數據結構拆分成任意小的部分。我們在開發中經常使用物件和陣列的解構來簡化程式碼,以下幾個很有用但經常被忽略的用法。 Value Swapping

提高工作效率的技巧

圖片發自簡書App 一:json解析工具提供線上JSON工具,線上,JSON,JSON校驗,JSON格式化,xml轉json工具,線上工具,json檢視,視覺化,程式,伺服器,域名註冊,正則表示式,測試,線上json格式化工具二:Bootstrap視覺化佈局系統Layout

linux cd 命令的技巧

轉載:http://hi.baidu.com/pie138/item/488ebf5eac9e23404eff200b 說linux cd命令是Linux上使用率最高的兩個命令之一不為過吧(另一個當然是ls了),前兩天看到了一個linux cd命令的幾個小技巧,這裡順便記

技術好卻進不了大公司?程式設計師面試的技巧請收好

有很多程式設計師,專業技術挺好,專案經驗充足,簡歷上金碧輝煌,也面試了很多國內大廠,但就是沒有一家能成功的。處境可以說是相當尷尬。 大家都知道程式設計師本身就是要吃年輕飯,不僅是技術活,也是體力活。早點跳槽,早點漲薪,就顯得格外的重要了。 那麼我就給大家分享一下程式設計師面試的幾個小技巧: 1.面試準備要

Chrome瀏覽器F12開發者工具的技巧總結

1、直接修改頁面元素   選擇頁面上元素,右鍵“檢查”,會開啟開發者工具視窗,顯示當前選擇元素的原始碼,可以雙擊進行修改。 如果要修改的東西比較多,可以摺疊元素並單擊選擇,再右鍵Edit as HTML修改。2、顏色取色器   選擇頁面上元素,右鍵“檢查”,會開啟開發者工具

ORCAD 技巧記錄

從concept 轉向ORCAD,還在摸索這個軟體中。記錄一些學到的小技巧。 1、按住ctrl同時拖拽器件,即為複製。 2、按住Alt同時拖拽器件,則沒有“橡皮筋”功能。 3、畫wire時,同時按住shift,可以實現任意角度走線。 4、關於repeat的使用,目前發

【轉載】python 提高效率的技巧

1.1. 最常見 一個最常見的速度陷坑(至少是俺在沒看到網上這篇介紹時陷進去 過好些次的) 是: 許多短字串併成長字串時, 大家通常會用: Toggle line numbers    1 shortStrs = [ str0, str1, ..., strN]   

UE4關於材質的技巧

相信很多程式出生的開發者對美術不是很瞭解 但是開發過程中又需要美術部分的一些技巧, 今天我就來安利一些UE4美術方面的技巧 希望能夠幫助到大家 1,不用 PS 也可以製作法線 2.製作毛玻璃 3,次表面材質 4,Fresne