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

資訊專欄INFORMATION COLUMN

詳解vue組件三大核心概念

rickchen / 2411人閱讀

摘要:前言本文主要介紹屬性事件和插槽這三個(gè)基礎(chǔ)概念使用方法及其容易被忽略的一些重要細(xì)節(jié)。至于如何改變,我們接下去詳細(xì)介紹單向數(shù)據(jù)流這個(gè)概念出現(xiàn)在組件通信。比如上例中在子組件中修改父組件傳遞過來的數(shù)組從而改變父組件的狀態(tài)。的一個(gè)核心思想是數(shù)據(jù)驅(qū)動。

前言

本文主要介紹屬性、事件和插槽這三個(gè)vue基礎(chǔ)概念、使用方法及其容易被忽略的一些重要細(xì)節(jié)。如果你閱讀別人寫的組件,也可以從這三個(gè)部分展開,它們可以幫助你快速了解一個(gè)組件的所有功能。

本文的代碼請猛戳github博客,紙上得來終覺淺,大家動手多敲敲代碼!

一、屬性 1.自定義屬性props

prop 定義了這個(gè)組件有哪些可配置的屬性,組件的核心功能也都是它來確定的。寫通用組件時(shí),props 最好用對象的寫法,這樣可以針對每個(gè)屬性設(shè)置類型、默認(rèn)值或自定義校驗(yàn)屬性的值,這點(diǎn)在組件開發(fā)中很重要,然而很多人卻忽視,直接使用 props 的數(shù)組用法,這樣的組件往往是不嚴(yán)謹(jǐn)?shù)摹?/p>

// 父組件
 
  
// 子組件
  props: {
    name: String,
    type: {
   //從父級傳入的 type,它的值必須是指定的 "success", "warning", "danger"中的一個(gè),如果傳入這三個(gè)以外的值,都會拋出一條警告
      validator: (value) => {
        return ["success", "warning", "danger"].includes(value)
      }
    },
    onChange: {
    //對于接收的數(shù)據(jù),可以是各種數(shù)據(jù)類型,同樣也可以傳遞一個(gè)函數(shù)
      type: Function,
      default: () => { }
    },
    isVisible: {
      type: Boolean,
      default: false
    },
    list: {
      type: Array,
      // 對象或數(shù)組默認(rèn)值必須從一個(gè)工廠函數(shù)獲取
      default: () => []
    }
  }

從上面的例中,可以得出props 可以顯示定義一個(gè)或一個(gè)以上的數(shù)據(jù),對于接收的數(shù)據(jù),可以是各種數(shù)據(jù)類型,同樣也可以傳遞一個(gè)函數(shù)。通過一般屬性實(shí)現(xiàn)父向子通信;通過函數(shù)屬性實(shí)現(xiàn)子向父通信

2.inheritAttrs

這是2.4.0 新增的一個(gè)API,默認(rèn)情況下父作用域的不被認(rèn)作 props 的特性綁定將會“回退”且作為普通的 HTML 特性應(yīng)用在子組件的根元素上。可通過設(shè)置 inheritAttrs 為 false,這些默認(rèn)行為將會被去掉。注意:這個(gè)選項(xiàng)不影響 class 和 style 綁定
上個(gè)例中,title屬性沒有在子組件中props中聲明,就會默認(rèn)掛在子組件的根元素上,如下圖所示:

3. data與props區(qū)別

相同點(diǎn)

兩者選項(xiàng)里都可以存放各種類型的數(shù)據(jù),當(dāng)行為操作改變時(shí),所有行為操作所用到和模板所渲染的數(shù)據(jù)同時(shí)都會發(fā)生同步變化。

不同點(diǎn)

data 被稱之為動態(tài)數(shù)據(jù),在各自實(shí)例中,在任何情況下,我們都可以隨意改變它的數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu),不會被任何環(huán)境所影響。

props 被稱之為靜態(tài)數(shù)據(jù),在各自實(shí)例中,一旦在初始化被定義好類型時(shí),基于 Vue 是單向數(shù)據(jù)流,在數(shù)據(jù)傳遞時(shí)始終不能改變它的數(shù)據(jù)類型,而且不允許在子組件中直接操作 傳遞過來的props數(shù)據(jù),而是需要通過別的手段,改變傳遞源中的數(shù)據(jù)。至于如何改變,我們接下去詳細(xì)介紹:

4.單向數(shù)據(jù)流

這個(gè)概念出現(xiàn)在組件通信。props的數(shù)據(jù)都是通過父組件或者更高層級的組件數(shù)據(jù)或者字面量的方式進(jìn)行傳遞的,不允許直接操作改變各自實(shí)例中的props數(shù)據(jù),而是需要通過別的手段,改變傳遞源中的數(shù)據(jù)。那如果有時(shí)候我們想修改傳遞過來的prop,有哪些辦法呢?

方法1:過渡到 data 選項(xiàng)中

在子組件的 data 中拷貝一份 prop,data 是可以修改的

export default {
  props: {
    type: String
  },
  data () {
    return {
      currentType: this.type
    }
  }
}

在 data 選項(xiàng)里通過 currentType接收 props中type數(shù)據(jù),相當(dāng)于對 currentType= type進(jìn)行一個(gè)賦值操作,不僅拿到了 currentType的數(shù)據(jù),而且也可以改變 currentType數(shù)據(jù)。

方法2:利用計(jì)算屬性

export default {
  props: {
    type: String
  },
  computed: {
    normalizedType: function () {
      return this.type.toUpperCase();
    }
  }
}

以上兩種方法雖可以在子組件間接修改props的值,但如果子組件想修改數(shù)據(jù)并且同步更新到父組件,卻無濟(jì)于事。在一些情況下,我們可能會需要對一個(gè) prop 進(jìn)行『雙向綁定』,此時(shí)就推薦以下這兩種方法:

方法3:使用.sync

// 父組件


// 子組件

父組件向子組件 props 里傳遞了 msg 和 show 兩個(gè)值,都用了.sync 修飾符,進(jìn)行雙向綁定。
不過.sync 雖好,但也有限制,比如:

1)不能和表達(dá)式一起使用(如 v-bind:title.sync="doc.title + "!"" 是無效的);
2)不能用在字面量對象上(如 v-bind.sync="{ title: doc.title }" 是無法正常工作的)。

方法4:將父組件中的數(shù)據(jù)包裝成對象傳遞給子組件

這是因?yàn)樵?JavaScript 中對象和數(shù)組是通過引用傳入的,所以對于一個(gè)數(shù)組或?qū)ο箢愋偷?prop 來說,在子組件中改變這個(gè)對象或數(shù)組本身將會影響到父組件的狀態(tài)。比如上例中在子組件中修改父組件傳遞過來的數(shù)組arr,從而改變父組件的狀態(tài)。

5.向子組件中傳遞數(shù)據(jù)時(shí)加和不加 v-bind?

對于字面量語法和動態(tài)語法,初學(xué)者可能在父組件模板中向子組件中傳遞數(shù)據(jù)時(shí)到底加和不加 v-bind 會感覺迷惑。

v-bind:msg = "msg"

這是通過 v-bind 進(jìn)行傳遞數(shù)據(jù)并且傳遞的數(shù)據(jù)并不是一個(gè)字面量,雙引號里的解析的是一個(gè)表達(dá)式,同樣也可以是實(shí)例上定義的數(shù)據(jù)和方法(其實(shí)就是引用一個(gè)變量)。

msg="浪里行舟"

這種在沒有 v-bind 的模式下只能傳遞一個(gè)字面量,這個(gè)字面量只限于 String 類量,字符串類型。那如果想通過字面量進(jìn)行數(shù)據(jù)傳遞時(shí),如果想傳遞非String類型,必須props名前要加上v-bind,內(nèi)部通過實(shí)例尋找,如果實(shí)例方?jīng)]有此屬性和方法,則默認(rèn)為對應(yīng)的數(shù)據(jù)類型。

:msg="11111" //Number 
:msg="true" //Bootlean 
:msg="()=>{console.log(1)}" //Function
:msg="{a:1}" //Object
二、事件 1.事件驅(qū)動與數(shù)據(jù)驅(qū)動

用原生JavaScript事件驅(qū)動通常是這樣的流程:

先通過特定的選擇器查找到需要操作的節(jié)點(diǎn) -> 給節(jié)點(diǎn)添加相應(yīng)的事件監(jiān)聽

然后用戶執(zhí)行某事件(點(diǎn)擊,輸入,后退等等) -> 調(diào)用 JavaScript 來修改節(jié)點(diǎn)

這種模式對業(yè)務(wù)來說是沒有什么問題,但是從開發(fā)成本和效率來說會比較不理想,特別是在業(yè)務(wù)系統(tǒng)越來越龐大的時(shí)候。另一方面,找節(jié)點(diǎn)和修改節(jié)點(diǎn)這件事,效率本身就很低,因此出現(xiàn)了數(shù)據(jù)驅(qū)動模式。

Vue的一個(gè)核心思想是數(shù)據(jù)驅(qū)動。所謂數(shù)據(jù)驅(qū)動,是指視圖是由數(shù)據(jù)驅(qū)動生成的,我們對視圖的修改,不會直接操作 DOM,而是通過修改數(shù)據(jù),其流程如下:

用戶執(zhí)行某個(gè)操作 -> 反饋到 VM 處理(可以導(dǎo)致 Model 變動) -> VM 層改變,通過綁定關(guān)系直接更新頁面對應(yīng)位置的數(shù)據(jù)

可以簡單地理解:數(shù)據(jù)驅(qū)動不是操作節(jié)點(diǎn)的,而是通過虛擬的抽象數(shù)據(jù)層來直接更新頁面。主要就是因?yàn)檫@一點(diǎn),數(shù)據(jù)驅(qū)動框架才得以有較快的運(yùn)行速度(因?yàn)椴恍枰フ垓v節(jié)點(diǎn)),并且可以應(yīng)用到大型項(xiàng)目。

2.修飾符事件

Vue事件分為普通事件和修飾符事件,這里我們主要介紹修飾符事件。

Vue 提供了大量的修飾符封裝了這些過濾和判斷,讓開發(fā)者少寫代碼,把時(shí)間都投入的業(yè)務(wù)、邏輯上,只需要通過一個(gè)修飾符去調(diào)用。我們先來思考這樣問題:怎樣給這個(gè)自定義組件 custom-component 綁定一個(gè)原生的 click 事件?

組件內(nèi)容

如果你的回答是,那就錯(cuò)了。這里的 @click 是自定義事件 click,并不是原生事件 click。綁定原生的 click 是這樣的:

組件內(nèi)容

實(shí)際開發(fā)過程中離不開事件修飾符,常見事件修飾符有以下這些:

表單修飾符

1).lazy

在默認(rèn)情況下,v-model?在每次?input?事件觸發(fā)后將輸入框的值與數(shù)據(jù)進(jìn)行同步 。你可以添加?lazy?修飾符,從而轉(zhuǎn)變?yōu)槭褂?change事件進(jìn)行同步。適用于輸入完所有內(nèi)容后,光標(biāo)離開才更新視圖的場景。

2).trim

如果要自動過濾用戶輸入的首尾空白字符,可以給 v-model 添加 trim 修飾符:

這個(gè)修飾符可以過濾掉輸入完密碼不小心多敲了一下空格的場景。需要注意的是,它只能過濾首尾的空格!首尾,中間的是不會過濾的。

3).number

如果想自動將用戶的輸入值轉(zhuǎn)為數(shù)值類型,可以給 v-model 添加 number 修飾符:

從上面例子,可以得到如果你先輸入數(shù)字,那它就會限制你輸入的只能是數(shù)字。如果你先輸入字符串,那它就相當(dāng)于沒有加.number

事件修飾符





三、插槽

插槽分為普通插槽和作用域插槽,其實(shí)兩者很類似,只不過作用域插槽可以接受子組件傳遞過來的參數(shù)。

1.作用域插槽

我們不妨通過一個(gè)todolist的例子來了解作用域插槽。如果當(dāng)item選中后,文字變?yōu)辄S色(如下圖所示),該如何實(shí)現(xiàn)呢?

// 父組件

// 子組件

值得注意:v-bind:style 的對象語法十分直觀——看著非常像 CSS,但其實(shí)是一個(gè) JavaScript 對象。CSS 屬性名可以用駝峰式 (camelCase) 或短橫線分隔 (kebab-case,記得用引號括起來) 來命名。

2.v-slot新語法

在 2.6.0 中,我們?yōu)榫呙宀酆妥饔糜虿宀垡肓艘粋€(gè)新的統(tǒng)一的語法 (即?v-slot?指令)。它取代了?slot?和?slot-scope?。我們來思考個(gè)問題:相同名稱的插槽是合并還是替換

Vue2.5版本,普通插槽合并、作用域插槽替換

Vue2.6版本,都是替換(見下面例子)

我們通過一個(gè)例子介紹下Vue2.6版本默認(rèn)插槽、具名插槽和作用域插槽的新語法:

// 父組件

// 子組件

給大家推薦一個(gè)好用的BUG監(jiān)控工具Fundebug,歡迎免費(fèi)試用!

歡迎關(guān)注公眾號:前端工匠,你的成長我們一起見證!

參考文章

珠峰架構(gòu)課(強(qiáng)烈推薦)

Vue開發(fā)實(shí)戰(zhàn)

Vue.js 組件精講

Vue.js 官方文檔

Vue 組件通信全揭秘

vue修飾符--可能是東半球最詳細(xì)的文檔(滑稽)

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

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

相關(guān)文章

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

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

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

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

    khs1994 評論0 收藏0
  • 用WEB技術(shù)棧開發(fā)NATIVE應(yīng)用(二):WEEX 前端SDK原理詳解

    摘要:依舊采取傳統(tǒng)的開發(fā)技術(shù)棧進(jìn)行開發(fā),同時(shí)在終端的運(yùn)行體驗(yàn)不輸。首先來看下前端開發(fā)框架目前與構(gòu)成了三大最流行的前端開發(fā)框架,具有組件化以及三大特性,還學(xué)習(xí)的,引入了狀態(tài)管理模塊。 摘要: WEEX依舊采取傳統(tǒng)的web開發(fā)技術(shù)棧進(jìn)行開發(fā),同時(shí)app在終端的運(yùn)行體驗(yàn)不輸native app。其同時(shí)解決了開發(fā)效率、發(fā)版速度以及用戶體驗(yàn)三個(gè)核心問題。那么WEEX是如何實(shí)現(xiàn)的?目前WEEX已經(jīng)完全開...

    ls0609 評論0 收藏0
  • 前端窩 - 收藏集 - 掘金

    摘要:毫無疑問,設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的設(shè)計(jì)模式使代碼編寫真正工程化設(shè)計(jì)模小書前端掘金這是一本關(guān)于的小書。 JavaScript 常見設(shè)計(jì)模式解析 - 掘金設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無疑問,設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的;設(shè)計(jì)...

    李文鵬 評論0 收藏0

發(fā)表評論

0條評論

rickchen

|高級講師

TA的文章

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