搜尋
首頁web前端js教程抽象Vue公共組件詳解

抽象Vue公共組件詳解

Jan 15, 2018 am 11:25 AM
組件詳解

本文主要介紹如何抽象化一個Vue公共組件,以一個數字鍵盤組件為例,具有一定的參考價值,有興趣的小伙伴們可以參考一下,希望能幫助到大家。

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

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

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

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

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

3 自訂性,適當地揭露一些輸入介面或方法給外部用於自訂,同時也要設定好這些屬性在外部未輸入時的預設值。 

下面我們先以黑盒子的方式看看 demo 中數字鍵盤元件是如何被呼叫的(省略非關鍵部分程式碼)。

App.vue

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

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

接著,點選 1-6 與「確定」。如果如下:

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

@change-event:此事件為自訂事件,父元件透過v-on 註冊監聽,子元件內部透過$emit 觸發(更多自訂事件相關內容請參考:Vue官方教學) 。

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

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

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

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

<keyboard></keyboard>

sp-key:自訂的特殊字符,如身分證輸入時的“X”,會新增到左下角空白格,預設為無。

<keyboard></keyboard>

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

<keyboard></keyboard>

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

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

可以透過Vue 中的ref 屬性來取得到鍵盤的元件引用,從而呼叫其內部的方法,如下:

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


<script>
import keyboard from &#39;Keyboard&#39;;
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>
  <p>
    </p>
<p>
      </p>
<p>{{item}}</p>
      <p></p> //键盘图标
    
    <p>
      //...    
    </p>
  
</template>
<script>
export default {
  data() {
    return {
      baseArr: []
    }
  },
  computed: {
    keyArr() {
      this.handleInit();
      return this.baseArr;
    }
  },
  methods: {
    handleInit() {
      this.baseArr = [&#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;, &#39;6&#39;, &#39;7&#39;, &#39;8&#39;, &#39;9&#39;, &#39;0&#39;];
      this.baseArr.splice(this.baseArr.length - 1, 0, &#39;&#39;);
    }
  }
}
</script>

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

sp-key

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

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

在组件内部通过 props 属性接收父组件传递的 spKey,之后就可在组件内的属性和方法中通过 this.spKey 进行访问。首先判断 spKey 值是否有效,并代替空字符插入键位数组倒数第二项。

random

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

      if (this.random && this.random != &#39;false&#39;) {
        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>
  <p>
    </p>
<p>
      </p>
<p>{{item}}</p>
      <p></p> //键盘图标
    
    //...
  
</template>
<script>
export default {
  data() {
    return {
      inputStr: &#39;&#39;
    }
  },
  //...
  methods: {
    handleInput(value) {
      this.inputStr += value;
      this.$emit(&#39;change-event&#39;, 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);
}

上面的例子都是些核心代码的片段,并且其他辅助函数并未列出,想查看完整的代码请看源码。

相关推荐:

微信小程序公共组件的封装制作方式

Vue组件之Tooltip实例详解

Vue高阶组件的使用方法

以上是抽象Vue公共組件詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

JavaScript是用C編寫的嗎?檢查證據JavaScript是用C編寫的嗎?檢查證據Apr 25, 2025 am 12:15 AM

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript的角色:使網絡交互和動態JavaScript的角色:使網絡交互和動態Apr 24, 2025 am 12:12 AM

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C和JavaScript:連接解釋C和JavaScript:連接解釋Apr 23, 2025 am 12:07 AM

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能