国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

如何抽象一個Vue公共組件

來源:懂視網 責編:小采 時間:2020-11-27 22:27:39
文檔

如何抽象一個Vue公共組件

如何抽象一個Vue公共組件:之前一直想寫一篇關于抽象 Vue 組件的隨筆,無奈一直沒想到好的例子。恰巧最近為公司項目做了一個數字鍵盤的組件,于是就以這個為例聊聊如何抽象 Vue 的組件。 先上 Demo 與 源碼。(demo最好在瀏覽器里以手機模式瀏覽) 在講具體實現前,我想先分享下自己認
推薦度:
導讀如何抽象一個Vue公共組件:之前一直想寫一篇關于抽象 Vue 組件的隨筆,無奈一直沒想到好的例子。恰巧最近為公司項目做了一個數字鍵盤的組件,于是就以這個為例聊聊如何抽象 Vue 的組件。 先上 Demo 與 源碼。(demo最好在瀏覽器里以手機模式瀏覽) 在講具體實現前,我想先分享下自己認

之前一直想寫一篇關于抽象 Vue 組件的隨筆,無奈一直沒想到好的例子。恰巧最近為公司項目做了一個數字鍵盤的組件,于是就以這個為例聊聊如何抽象 Vue 的組件。

先上 Demo 與 源碼。(demo最好在瀏覽器里以手機模式瀏覽)

在講具體實現前,我想先分享下自己認為的理想的公用組件是什么樣的:

1. 黑盒性,即除了你自己以外,其他的開發者在快速閱讀使用文檔之后可以立刻上手,而不用關心你的內部實現;

2. 獨立性,即做好解耦,不與父組件有過多關聯;

3 自定義性,適當地暴露一些輸入接口或者方法給外部用于自定義,同時也要設置好這些屬性在外部未輸入時的默認值。 

下面我們先以黑盒的方式看看 demo 中數字鍵盤組件是如何調用的(已省略非關鍵部分代碼)。

App.vue

<template>
......
 <keyboard @submit-event='handleSubmit' @change-event='handleChange'></keyboard>
</template>
<script>
import keyboard from 'Keyboard.vue';
export default {
 data() {
 return {
 value: ''
 };
 },
 methods: {
 handleChange(value, currentValue) {
 console.log(value, currentValue);
 this.value = value;
 },
 handleSubmit() {
 console.log('submit: ' + this.value);
 }
 }
}
</script>

如上,最基本的調用就完成了。效果如下:

接著,點擊 1-6 與“確定”。如果如下:

可以看到數字鍵盤已經如我們預期工作了,接下來分析下該數字鍵盤組件所有的輸入項。

@change-event:該事件為自定義事件,父組件通過 v-on 注冊監聽,子組件內部通過 $emit 進行觸發(更多自定義事件相關內容請參考:Vue官方教程)。

每一次點擊數字按鍵以及退格鍵均會觸發該事件,其傳遞兩個參數:value,累積點擊的字符組合;currentValue,當前點擊的字符。父組件通過 handleChange 方法接收該事件的回調內容。

@submit-event:當點擊“確定”鍵即會觸發該事件,其不傳遞參數,只是告訴父組件“我的確定按鈕被點擊了,你要做什么操作自己看著辦吧,之前點擊的數字已經通過 change-event 傳給你了”。父組件通過 handleSubmit 方法接收回調。

如果只寫這兩個方法未免也太沒誠意了,我還根據一些場景編寫了以下幾個自定義屬性。

max:最大輸入長度,超過的部分將不會觸發 change-event 事件,默認無限制。

<keyboard max='6'></keyboard>

sp-key:自定義的特殊字符,如身份證輸入時的“X”,會添加到左下角空白格,默認無。

<keyboard sp-key='X'></keyboard>

random:是否打亂數字順序,一些有關銀行賬戶或密碼的輸入經常會見到這種場景,默認 false。

<keyboard random='true'></keyboard>

從上面的幾個自定義屬性與事件,我們大概知道了父組件是如何向子組件傳值以及監聽子組件的變化,但父組件該如何直接調用子組件內部的函數呢?我們看下面這個場景。

數字鍵盤上的鍵盤圖標,點擊之后會將數字鍵盤收起隱藏。組件內部擁有一個方法 keyboardToggle(true|false) 來控制鍵盤的彈起和收回,那么如果在組件外部也想調用這個方法呢?比如當父組件中的 input 獲取到焦點時。

可以通過 Vue 中的 ref 屬性來獲取到鍵盤的組件引用,從而調用其內部的方法,如下:

$refs.[refName].keyboardToggle(true|false)

<template>
 <input type='text' @focus='handleShowKeyboard($event)' />
 <keyboard ref='kbref'></keyboard>
</template>
<script>
import keyboard from 'Keyboard';
export default {
 //...
 methods: {
 handleShowKeyboard(e) {
 e && e.preventDefault();
 this.$refs.kbref.keyboardToggle(true);
 }
 }
}
</script>

以上面這種形式便可以在父組件上下文中調用子組件內的方法。

$refs.[refName].handleInit()

數字鍵盤組件內部的初始化方法,用于重新渲染組件。若 random 屬性為 true,則數字鍵會刷新隨機排列。

$refs.[refName].handleClear()

清除之前輸入的字符組合,并觸發 change-event 且返回空字符串。

上面分享了這個組件所有對外的屬性與事件,可以發現我們并未看過該組件內部的一行代碼,但已經可以完整的使用它了,下面來聊聊內部實現。

首先來看看布局,我將鍵盤分為左右兩部分,右邊部分不用多說,左邊的部分是將一個鍵位數組通過 v-for 循環生成。

那么是如何讓 0 和 9 之間空出一格呢,下面看下初始化鍵盤組件的方法。

keyboard.vue

handleInit()

<template>
 <div>
 <div class='kb-left'>
 <div class='kb-item' v-for='item in keyArr'>{{item}}</div>
 <div class='kb-item kb-toggle'></div> //鍵盤圖標
 </div>
 <div class='kb-right'>
 //... 
 </div>
 </div>
</template>
<script>
export default {
 data() {
 return {
 baseArr: []
 }
 },
 computed: {
 keyArr() {
 this.handleInit();
 return this.baseArr;
 }
 },
 methods: {
 handleInit() {
 this.baseArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'];
 this.baseArr.splice(this.baseArr.length - 1, 0, '');
 }
 }
}
</script>

即在鍵位數組倒數第二位插入一個空字符,然后循環生成按鍵。下面看下自定義參數是如何生效的。

sp-key

<script>
export default {
 props: ['spKey'],
 data() {
 return {
 baseArr: []
 }
 },
 //....
 methods: {
 handleInit() {
 let spKey = this.spKey;
 this.baseArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'];

       this.baseArr.splice(this.baseArr.length - 1, 0, spKey);
 }
 }
}
</script>

在組件內部通過 props 屬性接收父組件傳遞的 spKey,之后就可在組件內的屬性和方法中通過 this.spKey 進行訪問。首先判斷 spKey 值是否有效,并代替空字符插入鍵位數組倒數第二項。

random

<script>
export default {
 props: ['spKey', 'random'],
 data() {
 return {
 baseArr: []
 }
 },
 //....
 methods: {
 handleInit() {
 let spKey = this.spKey;
 this.baseArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'];

   if (this.random && this.random != 'false') {
   this.baseArr.sort(function() {
    return Math.random() - Math.random();
     });
 }

 this.baseArr.splice(this.baseArr.length - 1, 0, spKey);
 }
 }
}
</script>

將鍵位打亂順序其實也很簡單,只要通過數組的 sort 方法。sort 方法可以接收一個函數作為參數,若函數返回正數則交換前后兩項的位置,若函數返回負數則不作交換。所以將兩個隨機數相減的結果返回,即可將鍵位數組隨機排序。

下面看看在組件內部是如何觸發 change-event 的。

handleInput()

<template>
 <div>
 <div class='kb-left'>
 <div @click='handleInput(item)' class='kb-item' v-for='item in keyArr'>{{item}}</div>
 <div class='kb-item kb-toggle'></div> //鍵盤圖標
 </div>
 //...
 </div>
</template>
<script>
export default {
 data() {
 return {
 inputStr: ''
 }
 },
 //...
 methods: {
 handleInput(value) {
 this.inputStr += value;
 this.$emit('change-event', this.inputStr, value);
 }
 }
}
</script>

增加了 max 屬性后修改方法如下:

handleInput(value) {
 let max = Number(this.max);
 if (!isNaN(max) && this.inputStr.length+1 > max) {
 return;
 }

 this.inputStr += value;
 this.$emit('change-event', this.inputStr, value);
}

最后看看退格刪除是如何實現的。

handleDelete()

handleDelete() {
 let str = this.inputStr;
   if (!str.length) return;

 this.inputStr = str.substring(0, str.length - 1);
 this.$emit('change-event', this.inputStr);
} 

上面的例子都是些核心代碼的片段,并且其他輔助函數并未列出,想查看完整的代碼請看源碼。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

如何抽象一個Vue公共組件

如何抽象一個Vue公共組件:之前一直想寫一篇關于抽象 Vue 組件的隨筆,無奈一直沒想到好的例子。恰巧最近為公司項目做了一個數字鍵盤的組件,于是就以這個為例聊聊如何抽象 Vue 的組件。 先上 Demo 與 源碼。(demo最好在瀏覽器里以手機模式瀏覽) 在講具體實現前,我想先分享下自己認
推薦度:
標簽: 一個 VUE 公共
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 成人无高清96免费 | 久久一道本 | 国产一区二区日韩欧美在线 | 亚洲精品国产成人99久久 | 国产精品第4页 | 亚洲精品电影 | 国产精品视频a | 超级毛片 | 国产偷窥女洗浴在线观看 | 国产手机精品自拍视频 | 国产在线精品一区二区 | 一级黄网站 | 国产一区二区福利久久 | 九一毛片| 午夜精品一区二区三区免费视频 | 日韩欧美一二三区 | 亚洲综合日韩在线亚洲欧美专区 | 欧美成人高清在线视频大全 | 国产高清免费在线观看 | 在线观看亚洲一区 | 日韩国产在线播放 | 欧美色图中文字幕 | 91在线 | 欧美: | 日韩一级精品久久久久 | 国偷自产一区二区免费视频 | 国产成人精品视频 | 国产亚洲欧美另类一区二区三区 | 国产一区二区福利 | 自拍 欧美 在线 综合 另类 | 欧美日本道免费二区三区 | 日韩国产欧美一区二区三区 | 日韩精品亚洲电影天堂 | 欧美日本韩国一区二区 | 国产资源视频在线观看 | 日本欧美另类 | 欧美日韩国产码高清综合人成 | 欧美日本道免费一区二区三区 | 中文字幕欧美在线 | 精品一区二区三区免费毛片爱 | 日本久久精品免视看国产成人 | va欧美国产在线视频 |