透過Vue實現限制數入字數

我們都知道,平常在社群網站上會限制使用者輸入的字數。最具代表性的網站就是Twitter,Twitter限制一般使用者每次發表文章的字數在140字以內。讓使用者用最簡短的文字來表達想法。對於優化使用者體驗比較好的方式是,當使用者在輸入的同時,提示使用者還有多少字可以輸入,當使用這輸入的字數達到限制時,及時地停止使用者繼續輸入。 像這樣子限制使用者輸入字數的機制要如何來實現呢? 有兩的點需要注意: 如何計算使用者輸入了多少字? 當使用這輸入的字數達到限制時,該如何停止繼續輸入? 今天我們就要透過Vue.js來製作一個可以幫我們控制輸入字數的程式。首先,我們先準備好需要的HTML檔案。 <!DOCTYPE html> <html lang=“zh-TW”> <head> <meta charset=“UTF-8” /> <meta name=“viewport” content=“width=device-width, initial-scale=1.0” /> <meta http-equiv=“X-UA-Compatible” content=“ie=edge” /> <link rel=“stylesheet” href=“https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css” integrity=“sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO” crossorigin=“anonymous” /> <title>Start</title> </head> <body> <div id=“app” class=“container”> <div class=“row”> <div class=“col”> <textarea cols=“30”

Vue Component 元件初探



什麼是元件?

一般來說,當我們製作一個網頁時,可以將網頁拆解成一個一個的區塊。這個由各種區塊組成的網頁,除了中間的主內容區之外,還包含了頁首、頁尾、側欄等區塊。每個區塊都有對應該區塊所需要執行的javascript程式碼與CSS檔案。在開發網頁時,如果將這些程式碼全部寫在一起,會導致整個專案的程式碼冗長,檔案也變得很肥大。

試想,若把網頁部分的區塊取出來獨立成一個個的元件,並且將重複用到元件拿來重複使用的話,是否就可以減低程式碼冗長的狀況?Vue元件的出現,就是解決這樣的問題。


為什麼使用元件?

Vue元件(Vue Component)可以說是 Vue JS 最核心的功能。Vue元件可以加強重用性,讓一些常用的程式碼,例如控制項程式,可以被重複使用。你可以把元件想像成樂高積木,一塊塊小程式元件像積木一樣的組合成一個完整的系統。

以上面這個網頁來說,我們可以把Header、Footer、Content、Aside等拆分出來,成為個別的元件,並且在Aside裡面放置Item子元件。透過這樣的設計,可簡化程式碼讓程式更小,並且每個元件可以被多次呼叫使用。整個程式碼看起來更具備組織性、更容易被維護。可以達到DRY Code的效果。

如何使用元件?

使用元件有兩個步驟:註冊與安裝『Register first and install later』。元件需要註冊才可以使用。註冊有兩種方式,分為全域註冊與區域註冊兩種。經過全域註冊的元件是為全域元件(Global Component ),經過區域註冊的元件是為區域元件( Local Component)。兩者的差別是,全域元件可以被「所有的」vue 實例使用,而區域元件只能在其所在vue 實例的作用範圍內有效使用。此外,也可以使元件成為巢狀結構,在元件中再註冊元件。以下是全域註冊與區域註冊的註冊方式:

全域註冊 (Registration)

使用Vue.component(tagName, options)來註冊一個元件。第一個是元件的名稱,它必須是小寫,第二個參數是JSON物件。JSON物件通常會放下面四種屬性:
  1. props
  2. data
  3. methods
  4. computed

另外要注意的是,元件的註冊必須在Vue實例初始化前完成。而且Vue.component 的Vue要大寫。
Vue.component(‘my-comp’, { 

 // options 選項 

}) 

var app = new Vue({ 

 el: ‘#app’, 

}) 

最簡單的元件本身沒有動態資料,也不需要跟別人交換資料。使用這種簡單元件時,可以在html裡面加入<my-comp></my-comp> 來使用。如果選項的部分空白的話,雖然註冊的元件,網頁上面還是不會顯示任何內容。

選項的部分,可以放 template ,由於 Vue2要求每個元件的template只能有一個 root 。因此在template裡面必須有一組根<div>,並且將所有html都要放在這個root <div>裡面,不然是無法繪製出畫面。
Vue.component(‘my-comp’, { 

   template:’<div>全域元件內容區</div>’ 

}) 


區域註冊 (Local Registration)


前面提到區域元件只能在其所在vue 實例的作用範圍內有效使用。如果元件不需提供給其他Vue實例共用的話,建議使用區域註冊。區域註冊的註冊方式如下:

var Child = { 

  template:’<div>區域元件內容區</div>’ 

} 

var app = new Vue({ 
 el: ‘#app’, 
 components:{ 
 ‘my-comp’: Child 
 } 
}) 


與全域元件比較起來,區域元件的註冊方式必須在Vue實例裡面加上components選項。

元件的名稱

要注意的是,元件的名稱在 javaScript區與在html區的地方,寫法有點不同。
在 javaScript區,大小寫不同,例如:myComp與mycomp是不一樣的。

由於在html區,無法分辨大小寫的差異,所以如果在body中使用<myComp></myComp>的話,是無法正常顯示元件內容的。此時必須把它改成小寫並且加上減號,例如:<my-comp></my-comp>。如此才能正常顯示元件內容。

X-template

範本除了放在元件裡面的 template外,Vue提供了另外一個定義的方式,這個方式稱作X-template。

透過X-template的方式建立元件的template,首先要把範本的內容放在<script>標籤裡面,<script>標籤要註明text/x-template的類型,並且指定一個id,並將這個id賦予template:
<script type=“text/x-template” id=“my-comp”> 
 <div> 
 全域元件內容區 
 </div> 
</script> 


Vue.component(‘my-comp’, { 
   template:’#my-comp’ 
}) 


其中,id對應 template:’#my-comp’ 的名稱。這樣子寫的好處是,你可以像是寫一般html網頁一樣的在<script>標籤裡面寫範本,不用考慮換行問題。

data 必須是函數

是在 Vue 實例中,data 可以是 物件(object)或函數( function)。這裡要特別注意的是,這裡與我們使用指令的方式不一樣,在元件裡的 data 選項必須是一個函數( function)並且return資料。

有這樣的規定是因為每一個元件之中會各自擁有自己的 data,data 與 data之間非共用的關係,反之如果沒有這樣一個規定的話,各個元件之間的data必將相互影響,導致資料產生連動的狀況。

如下,元件化的Vue可以獨立儲存每個狀態。其中<counter-component>是呈現在畫面上的標籤,元件可以重複使用。元件與元件之間的數字是獨立的,不會共用資料。
<counter-component></counter-component> 

Vue.component('counter-component', { 
            data: function () { 
                //建立component時,一定要用function來return資料內容 
                return { 
                    counter: 0 
                } 
            }, 

            template:` 
            <div> 
            <button class="btn"></button> 
            </div> 
` 
        });



下一篇我們來試著將頁面元件化

留言

這個網誌中的熱門文章

用Python的條件實現電影分級流程

Vue元件實作,將HTML網頁Vue元件化

Python基礎篇--[條件]如果發生這種狀況時,我該怎麼辦?