vue2 0 如何自定義元件(vue元件的封裝)

2022-06-26 17:39:09 字數 3494 閱讀 3667

一、前言

之前的部落格聊過 vue2.0和react的技術選型;聊過vue的axios封裝和vuex使用。今天簡單聊聊 vue 元件的封裝。

vue 的ui框架現在是很多的,但是鑑於移動裝置的複雜性,相容性問題突出。像 mint-ui 等說實話已經很不錯了,但是坑也是不少,而且專案中很多功能僅憑這些也實現不了,這需要我們去封裝自己的可復用元件。

二、封裝元件的步驟

1.建立元件的模板,先把架子搭起來,寫寫樣式,考慮好元件的基本邏輯。    os:思考1小時,碼碼10分鐘,程式猿的準則。

2.準備好元件的資料輸入。即分析好邏輯,定好 props 裡面的資料、型別。(後面詳解)

3.準備好元件的資料輸出。即根據元件邏輯,做好要暴露出來的方法。(後面詳解)

4.封裝完畢了,直接呼叫即可。

接下來以乙個很簡單的例子具體說明一下

現在先看一下demo的效果圖

三、**詳解

1.先說一下 props

我們在父元件中需要將子元件需要的資料匯入,用法如下:

:searchlist="searchlist"  就是我們的資料,這個可以寫多個。這裡我傳輸了2個引數過去,主要是做資料修改的說明。大家可以先忽略。

在子元件中,我們的接收和使用方法如下:

props: ,

mounted() ,

我們在 props 中接收資料,注意props物件裡面 鍵值 是對改資料的 資料型別 的規定。做了規範,使用者就只能傳輸指定型別的資料,否則報警告

而props物件中的資料,我們可以直接在當前元件中使用  this.searchlist,可以直接使用。這裡要強調一下,props傳過來的資料只做展示,不得修改,想修改,再新寫乙個data中的變數承接做資料的再處理。至於原因,同上,可以看一下js的原型。至於原理嘛,不懂的可以取腦補一下 js的原型 。    os:這些基礎,在這就不做詳述了。

以上就是props傳遞過來的資料的使用了。

2. emit的使用(如何暴露元件方法)

我們已經會使用 父元件向子元件傳資料了,那如子元件如何來修改父元件的資料呢?

這裡提供 2 種實現方法,但是 第一種不推薦,強烈不推薦

方式一:

selectvalue: ,

。。。。。。。。。。。。。。。

this.selectvalue.data = '我被修改了'

即,父元件將 物件 資料傳遞給子元件,子元件直接修改props過來的物件的值

他的實現原理簡單提一下: 這個物件、陣列啦,是引用資料型別,說白了,就是儲存單元的資訊是指標,真正資料在別的地方,通過指標查詢的資料,所以這樣寫,對瀏覽器來說僅僅是傳遞了乙個指標,資料還是同乙份資料。所以你能修改。

方式二:

正兒八經的通過 $emit 方法去掉父元件的方法,在父元件中修改data的資料。(根正苗紅的方法,規範寫法)

// 子元件

this.$emit('selectfunc', value)

// 父元件

selectfunc(value)

將父元件的方法注入子元件  @selectfunc="selectfunc" ,然後在子元件中通過 $emit 呼叫他,並傳遞引數。達到修改的目的。

四、 demo**

父元件:

子元件:

}

}暫無資料

五、 總結這裡主要是總結一下vue元件封裝的思路,幫大家梳理一下。很簡單,和jquery外掛程式、react元件一樣,所有元件都是乙個套路,就是 函式思想。

元件就是臺做烤腸的機器,我放進去豬肉,再按一下各種開關,然後你給我烤腸。

1. 定義好 你需要使用者傳入的資料

2. 定義好 你提供給使用者的方法

3. 寫好元件的內部邏輯

這就ok了,乙個完美的,可復用的元件就完成了。    os: 在此吐槽一下,那些自認為是優秀的元件,其實,別人拿著是沒法用的。 o(╥﹏╥)o 

注:

os:  2018/06/06

1.  父子元件通訊的方式,遠不止我說的那兩種。但是,通過 $emit 的方式是根正苗紅的,不帶任何差錯的,是封裝優秀元件最好的方式()

(1) 通過ref 通訊

父元件設定ref,通過$refs物件來獲取子元件的資料

.......

console.log(this.$refs.reftest3)

console.log(this.$refs.reftest3.selectvalue.data)

其實,很簡單。ref 就是直接獲取了你的dom節點,如果是div一類的基本dom和js的document.getelementsbytagname()效果一樣的,而且這樣節省開銷。你可以在父元件中直接 this.$refs.reftest3.selectvalue.data。直接獲取子元件data中的資料,或者別的資料都可以獲取。但是,這個不是我們封裝元件會用的東西,因為這個用在父元件。元件的思想是 獨立的。所以,大家平時用用就好了,如果要封裝可復用的元件,這個還是不實用的。  os:可能他有特殊用法是我不清楚的,如果有請大家分享

(2)通過 vuex 通訊

vuex 大家都知道,變數統一管理(方便的很),╮(╯▽╰)╭  但是用這個來封裝元件的完全就是抬槓了。vuex、redux等等這些都是針對元件多層傳輸資料不便,而做的狀態統一管理,說白了是針對大家都要用的資料才會放到vuex中,而元件思想,是封裝乙個獨立的、可復用的功能模組。這根本就是2個理念。希望大家不要被誤導。

(3).aync 父子元件資料雙向繫結

說實話,這也是來抬槓的。說白了,雙向繫結不還是 通過  $emit 監聽資料更新事件,來呼叫父元件的方法嗎?

這裡簡單說一下這個資料雙向繫結的,還是很常用的方法。不囉嗦,看**:

.........

this.$emit('update:synctest', value)

其實,很簡單。在父元件向子元件props資料的時候,加乙個  .sync  修飾符,然後在子元件顯示的呼叫 emit 來修改他。   說白了就是新增這樣的乙個事件繫結  @update:foo="val => bar = val">

上述的方法就是  父子元件資料雙向繫結。子元件實時修改  props 的方法。

vue2 0 如何自定義元件(vue元件的封裝)

一 前言 之前的部落格聊過 vue2.0和react的技術選型 聊過vue的axios封裝和vuex使用。今天簡單聊聊 vue 元件的封裝。vue 的ui框架現在是很多的,但是鑑於移動裝置的複雜性,相容性問題突出。像 mint ui 等說實話已經很不錯了,但是坑也是不少,而且專案中很多功能僅憑這些也...

vue2 0 自定義 提示框(Toast)元件

1.自定義 提示框 元件 src components toast index.js 自定義 提示框 toast 元件 var toast var showtoast false,儲存toast顯示狀態 showload false,儲存loading顯示狀態 toastvm null,儲存toas...

Vue 2 0學習筆記 自定義指令

在vue中為了更好的操作dom元素,其內建了一些指令,比如v model v if v show v text v html v for和v bind等。除此之外,vue也允許註冊自定義指令 建立自定義指令,在vue中乙個指令定義物件可以提供下面幾個鉤子函式,而這幾個鉤子函式都是可選的 bind 只...