亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何寫好一個vue組件,老夫的一年經(jīng)驗全在這了(推薦)

 更新時間:2019年05月18日 09:11:34   作者:sarva  
這篇文章主要介紹了如何寫好一個vue組件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一個適用性良好的組件,一種是可配置項很多,另一種就是容易覆寫,從而擴(kuò)展功能

Vue 組件的 API 來自三部分——prop、事件和插槽:

  1. prop 允許外部環(huán)境傳遞數(shù)據(jù)給組件
  2. event 允許從組件內(nèi)觸發(fā)外部環(huán)境的副作用
  3. slot 允許外部環(huán)境將額外的內(nèi)容組合在組件中

prop

組件具有自身狀態(tài),當(dāng)沒有相關(guān) porps 傳入時,使用自身狀態(tài)完成渲染和交互邏輯;當(dāng)該組件被調(diào)用時,如果有相關(guān) props 傳入,那么將會交出控制權(quán),由父組件控制其行為

僅一個值傳入組件

如果該組件設(shè)計上支持雙向綁定,可使用v-model將該參數(shù)傳入組件,減少記憶成本(畢竟 vue 官方的語法糖,不用白不用)

<my-component v-model="foo" />

如果該組件可以獨(dú)立運(yùn)行,不依賴父組件時,還是給這個值起個名字吧

<component-no-sync :childNeed="foo" />

很多值需要傳入組件

我們原先的父組件寫法:

<child-component :prop1="var1" :prop2="var2" :prop="var3" ... />

其實可以在父組件上直接使用v-bind={子組件props集合}

傳入一個對象

比如當(dāng)一個組件有諸多配置項,且當(dāng)沒有傳入配置項取用組件內(nèi)部默認(rèn)項的時候,為了方便覆寫子組件的內(nèi)部配置項,不妨使用一個對象將配置收集到一起,但是這種做法有兩個缺點,謹(jǐn)慎使用

  1. 不能利用 props 驗證對象里面每個的值類型
  2. 如果你子組件修改了父組件傳入的對象A,父組件的對象A也會發(fā)生修改,所以我一般只有子組件不會修改父組件傳入的值的情況下,我才會傳入對象。父組件把對象傳入子組件,是實現(xiàn)雙向綁定的hack方式,但不推薦,vue 3.0可能就要對這種方式說拜拜了,為了以后代碼好改,還是不要用這種方式實現(xiàn)雙向綁定
<child-component v-model="text" :setting="{color:'bule'}" />

// 子組件內(nèi)部讀取配置,通過擴(kuò)展運(yùn)算符替換掉默認(rèn)配置
const setting ={
 ...defaultSetting,
 ...this.setting
}

 還有一種魚和熊掌兼得的方法,可以給子組件包一層,叫中間組件。父組件將配置項作為一個對象傳入中間組件,在中間組件里面對默認(rèn)配置項進(jìn)行初始化和覆寫,然后再以v-bind={生成好的配置}的方式傳入子組件,在子組件里面進(jìn)行驗證。

computed 屬性

vue 的 computed 屬性默認(rèn)是只讀的,你可以提供一個 setter。它可以優(yōu)化我寫組件的邏輯,適用于父組件處理的值和子組件處理的值是同一個的情況

<template>
 <el-select v-model="email">
  <el-option
   v-for="item in adminUserOptions"
   :key="item.email"
   :label="item.email"
   :value="item.email"
  />
 </el-select>
</template>

export default {
 props: {
  value: {}
 },
 computed: {
  email: {
   get() {
    return this.value
   },
   set(val) {
    this.$emit('input', val)
    this.$emit('change', val)
   }
  }
 }
}

靈活的 prop

我們??吹揭恍﹥?yōu)秀的組件庫,傳入的值既可以是一個 String/Number,也可以是一個函數(shù)。

比如ElementUI的Table組件,當(dāng)你想要顯示樹形數(shù)據(jù)的時候,必須傳入row-key。看它的介紹就知道是有多靈活:

row-key的作用:行數(shù)據(jù)的 Key,用來優(yōu)化 Table 的渲染;在使用 reserve-selection 功能與顯示樹形數(shù)據(jù)時,該屬性是必填的。類型為 String 時,支持多層訪問:user.info.id,但不支持 user.info[0].id,此種情況請使用 Function

處理 rowKey 生成 RowIdentity 的函數(shù)源碼:

//https://github.com/ElemeFE/element/blob/dev/packages/table/src/util.js
export const getRowIdentity = (row, rowKey) => {
 if (!row) throw new Error('row is required when get row identity')
 // 行數(shù)據(jù)的key
 if (typeof rowKey === 'string') {
  if (rowKey.indexOf('.') < 0) {
   return row[rowKey]
  }
  // 支持多層訪問:user.info.id
  let key = rowKey.split('.')
  let current = row
  for (let i = 0; i < key.length; i++) {
   current = current[key[i]]
  }
  return current
  // 通過函數(shù)自定義
  // 我處理過父和子id可能相同的情況,只好通過Function自定義
  // 不可以通過時間或者隨機(jī)字符串生成ID
 } else if (typeof rowKey === 'function') {
  return rowKey.call(null, row)
 }
}

由于業(yè)務(wù)場景多變,組件的設(shè)計者很難考慮完全,不妨設(shè)計靈活的 prop,由開發(fā)者自行定義

事件

emit/on

讀者肯定知道 emit/on 如何使用,我就簡單說一下 vue 的 v-model和sync的語法糖,我們可以利用這些語法糖,幫助我們寫出簡潔的代碼(父組件可以少寫監(jiān)聽子組件的事件,比如你不用寫@input)

v-model

看一下下面的代碼示例,就能懂這句話了。v-model 會忽略所有表單元素的 value、checked、selected 特性的初始值而總是將 Vue 實例的數(shù)據(jù)作為數(shù)據(jù)來源。你應(yīng)該通過 JavaScript 在組件的 data 選項中聲明初始值

<input v-model="searchText" />

<input
 v-bind:value="searchText"
 v-on:input="searchText = $event.target.value"
/>

// 當(dāng)把v-model用在組件上

<custom-input
 v-bind:value="searchText"
 v-on:input="searchText = $event"
></custom-input>

為了讓它正常工作,這個組件內(nèi)的 <input> 必須:將其 value 特性綁定到一個名叫 value 的 prop 上在其 input 事件被觸發(fā)時,將新的值通過自定義的 input 事件拋出,即this.$emit('input',changedValue)

自定義 v-model

為啥要自定義組件的 v-model 呢,因為數(shù)據(jù)不符合要求唄。你的輸入值不可能總是 value ,你的事件不可能總是 input,具體詳見文檔

sync(雙向綁定語法糖)

vue 真的是方便了開發(fā)者很多,站在開發(fā)者的角度考慮,很大的提升開發(fā)效率

以  update:myPropName  的模式觸發(fā)事件取代雙向綁定this.$emit('update:title', newTitle),具體詳見文檔

Function 通過 prop 傳入

本來想放在 prop 部分的,但是個人覺得其實它和 emit/on 更有關(guān)系一點

有讀者可能會問,為什么不能把子組件里面的事件 emit 出來,通過父組件處理?然后傳入一個控制子組件的 prop 屬性。
我想說的是,可以,但是這樣真的很麻煩,子組件內(nèi)部的狀態(tài)卻要依賴父組件傳值。

該組件內(nèi)部的狀態(tài),我們需要把它暴露出來嘛?我覺得不需要,組件內(nèi)部的狀態(tài)就讓它處于組件內(nèi)部

但是可以通過傳入 function(你可以理解為一個鉤子),參與組件狀態(tài)變更的行為。比如很好用的拖拽庫,Vue.Draggable控制元素是否被拖動的行為。

Vue.Draggable可以傳入一個 move 方法,我們看一下它如何處理的。

 

onDragMove(evt, originalEvent) {
   const onMove = this.move;
   // 如果沒有傳入move,那么返回true,可以移動
   if (!onMove || !this.realList) {
    return true;
   }

   const relatedContext = this.getRelatedContextFromMoveEvent(evt);
   const draggedContext = this.context;
   const futureIndex = this.computeFutureIndex(relatedContext, evt);
   Object.assign(draggedContext, { futureIndex });
   const sendEvt = Object.assign({}, evt, {
    relatedContext,
    draggedContext
   });
   // 組件行為由傳入的move函數(shù)控制
   return onMove(sendEvt, originalEvent);
}

 這樣做的好處,就是組件內(nèi)部自由一套運(yùn)行邏輯,但是我可以通過傳入 function 來干預(yù)。我沒有直接修改組件內(nèi)部狀態(tài),而是通過函數(shù)(你可以稱它為鉤子)去觸發(fā),方便調(diào)試組件,使得組件行為具有可預(yù)測性

父組件直接操作子組件

很少有這樣的騷操作,但是由于數(shù)據(jù)和操作的復(fù)雜性,當(dāng)數(shù)據(jù)結(jié)構(gòu)復(fù)雜,嵌套過深的情況下,父組件很難對于子組件的數(shù)據(jù)的精細(xì)控制

因此,如果不得已而為之,請在文檔里,把子組件可以調(diào)用的方法暴露出來,供使用者使用。使用這種組件比較麻煩,得去看文檔,沒有文檔的只好去看源碼

ElementUI的tree組件提供了很多方法,用于父組件去操作子組件。

eg:this.$refs.tree.setCheckedKeys([]);

插槽

HTML <slot> element 是 Web Components 技術(shù)的一部分,是自定義 web 組件的占位符,vue 里面的 slot 的靈感來自 Web Components 規(guī)范草案,具體見文檔

默認(rèn)插槽

能用默認(rèn)插槽就不要使用具名插槽,我真的不想使用你這個組件的時候還去翻看你的插槽叫什么名字

之前我司一個網(wǎng)頁模板 三個插槽,header,body,footer,我用的是真的難受,每次都記不得,看似三個單詞都挺熟悉的,但是其實 head,content,foot 這些單詞也都行啊,誰知道用啥(可能我老了吧,組件如果不是必要盡量不要讓人有記憶成本)。

后備內(nèi)容

就是給組件里面的插槽定義默認(rèn)值,它只會在沒有提供內(nèi)容的時候被渲染。建議用上插槽就給它添加默認(rèn)內(nèi)容

封裝他人組件

有些時候我們可能是對他人的組件進(jìn)行封裝,這里強(qiáng)烈推薦使用v-bind="$attrs" 和 v-on="$listeners"。 vm.$attrs 是一個屬性,其包含了父作用域中不作為 prop 被識別 (且獲取) 的特性綁定 (class 和 style 除外)。這些未識別的屬性可以通過 v-bind="$attrs" 傳入內(nèi)部組件。未識別的事件可通過v-on="$listeners"傳入

舉個例子,比如我創(chuàng)建了我的按鈕組件myButton,封裝了 element-ui 的 el-button 組件(其實什么事情都沒做),在使用組件 <my-button />時,就可以直接在組件上使用 el-button 的屬性,不被 prop 識別的屬性會傳入到 el-button 元素上去

<template>
 <div>
  <el-button v-bind="$attrs">導(dǎo)出</el-button>
 <div>
</template>
// 父組件使用
<my-button type='primary' size='mini'/>

組件命名

這里推薦遵循 vue 官方指南,值得一看

我們構(gòu)建組件的時候通常會將其入口命名為 index.vue ,引入的時候,直接引入該組件的文件夾即可。

但是這樣做會有一個問題,當(dāng)你編輯多個組件的時候,所有的組件入口都叫做index.vue,容易糊涂

vscode 顯然意識到了這個問題,所以當(dāng)文件名相同的文件被打開時,它會在文件名旁邊顯示文件夾名

如何解決呢,我們可以把 index.js 當(dāng)作一個單純的入口,不承擔(dān)任何邏輯。僅僅負(fù)責(zé)引入component-name-container以及export default component-name-container

my-app
└── src
    └── components
        └── component-name
          ├── component-name.css
          ├── component-name-container.vue
          └── index.js

 tips(個人喜好)

template,把一個<template> 元素當(dāng)做不可見的包裹元素,并在上面使用 v-if。最終的渲染結(jié)果將不包含 <template> 元素
能用 computed 計算屬性的,盡量就不用 watch

模板里面寫太多 v-if 會讓你的模板很難看,v-else-if盡量還是別用了吧。一長串的 if else,在模板里面看的很亂

以上所述是小編給大家介紹的如何寫好一個vue組件詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • vue+element-ui實現(xiàn)表格編輯的三種實現(xiàn)方式

    vue+element-ui實現(xiàn)表格編輯的三種實現(xiàn)方式

    這篇文章主要介紹了vue+element-ui實現(xiàn)表格編輯的三種實現(xiàn)方式,主要有表格內(nèi)部顯示和編輯切換,通過彈出另外一個表格編輯和直接通過樣式控制三種方式,感興趣的小伙伴們可以參考一下
    2018-10-10
  • vue如何根據(jù)條件判斷按鈕是否可以點擊

    vue如何根據(jù)條件判斷按鈕是否可以點擊

    這篇文章主要介紹了vue如何根據(jù)條件判斷按鈕是否可以點擊,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue-router 導(dǎo)航鉤子的具體使用方法

    vue-router 導(dǎo)航鉤子的具體使用方法

    本篇文章主要介紹了vue-router 導(dǎo)航鉤子的具體使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • VUE.CLI4.0配置多頁面入口的實現(xiàn)

    VUE.CLI4.0配置多頁面入口的實現(xiàn)

    這篇文章主要介紹了VUE.CLI4.0配置多頁面入口的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • vue.js做一個簡單的編輯菜譜功能

    vue.js做一個簡單的編輯菜譜功能

    本文通過實例代碼給大家一個簡單的基于vue.js實現(xiàn)的編輯菜譜功能,代碼簡答易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-05-05
  • 解決vue中的無限循環(huán)問題

    解決vue中的無限循環(huán)問題

    這篇文章主要介紹了解決vue中的無限循環(huán)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue組件和Route的生命周期實例詳解

    Vue組件和Route的生命周期實例詳解

    這篇文章主要介紹了Vue組件和Route的生命周期的相關(guān)知識,需要的朋友可以參考下
    2018-02-02
  • vue單頁面改造多頁面應(yīng)用詳解

    vue單頁面改造多頁面應(yīng)用詳解

    本文主要介紹了vue單頁面改造多頁面應(yīng)用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • vue select二級聯(lián)動第二級默認(rèn)選中第一個option值的實例

    vue select二級聯(lián)動第二級默認(rèn)選中第一個option值的實例

    下面小編就為大家分享一篇vue select二級聯(lián)動第二級默認(rèn)選中第一個option值的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 關(guān)于element-ui?單選框默認(rèn)值不選中的解決

    關(guān)于element-ui?單選框默認(rèn)值不選中的解決

    這篇文章主要介紹了關(guān)于element-ui?單選框默認(rèn)值不選中的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論