透過Vue實現限制數入字數

我們都知道,平常在社群網站上會限制使用者輸入的字數。最具代表性的網站就是Twitter,Twitter限制一般使用者每次發表文章的字數在140字以內。讓使用者用最簡短的文字來表達想法。對於優化使用者體驗比較好的方式是,當使用者在輸入的同時,提示使用者還有多少字可以輸入,當使用這輸入的字數達到限制時,及時地停止使用者繼續輸入。

像這樣子限制使用者輸入字數的機制要如何來實現呢?

有兩的點需要注意:

  1. 如何計算使用者輸入了多少字?
  2. 當使用這輸入的字數達到限制時,該如何停止繼續輸入?

今天我們就要透過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” rows=“5” type=“text” class=“form-control” placeholder=“輸入文字”></textarea>
                <div class=“text-sm-right”>
                    <i>字數限制:50</i>
                    <i>剩餘字數:1/ 50</i>
                </div>
            </div>
        </div>
        <div class=“row”>
            <div class=“col”>
                <p>顯示文字</p>
            </div>
        </div>
    </div>
</body>
</html>

接下來,將vue.js加入檔案中。

<script src=“https://cdn.jsdelivr.net/npm/vue/dist/vue.js”></script>

建立Vue實例。
 <script>
      app = new Vue({
        el: "#app",
        data: {
          message: "這是一個APP",
        },
      });
    </script>

如此,就已經完成了一個Vue的檔案。

message的內容要顯示在html上面我們預先選好的位置。也就是<p>顯示文字</p>這個地方,要把它替換成<p>{{ message }}</p>。如此data裡面的message: "這是一個APP”就會將『這是一個APP』顯示到<p></p>裡面。你會看到html上面的結果是:
<p>這是一個APP</p>

計算使用者輸入字數

由於我們想要限制使用者輸入的字數,必須先知道使用者已經輸入了多少字。
在 JavaScript 中想要判斷字串長度可以使用 length 來取得,如果要知道使用者輸入的字串長度到底多長,可以使用length來取得字數:
message.length
上面的式子可以得到message這字串的長度,也就是到底有多少字組成message這個字串。

限制使用者輸入字數

另一個是,當使用者超過輸入的限制時,要如何裁切掉多出來的部分?
有幾種解決方案可以採用。我們可以直接disable掉 input欄位讓input失效,或者是停止接收多出來的資料。這裡的實作範例採取第二種解決方案。

如果是想要用第二種方式解決的話,可以使用substring來裁切。JavaScript substring 可以在字串中擷取出設定好範圍的其中一段字串,substr() 有兩個參數,第一個參數arg1是開始擷取的位置,第二個arg2是結束擷取的位置,也就是你想要擷取的字數數量。arg1與arg2決定了取出來的字串範圍。你可以自己設定擷取範圍,但參數不可以是負數,且不可以是兩個相同的數字,否則會行成空字串。
substr(arg1,arg2)
如下表示,對message這字串,從0這個位置開始(也就是最開頭的位置)裁切到10的地方。
message.substr(0, 10)

實作

我們現在就利用這個方式計算一下使用者的輸入字數

1. 先雙向綁定message與<textarea>的值


我們改造一下下面的textarea標籤:
< textarea cols=“30” rows=“5” type=“text” class=“form-control” placeholder=“ 輸入文字 ”>< / textarea >

移除placeholder,加上v-model=“message”
< textarea cols=“30” rows=“5” type=“text” class=“form-control” v-model=“message”>< / textarea >


2.計算字數

我們預計將字數限制與剩餘字數顯示在下面區塊,
我們設定兩個變數,要限制的字數用limit變數表示,剩餘字數則用remain表示。limit變數是一個固定值,由我們事先決定,可以寫在data中。remain則是透過使用者輸入的字數與limit變數相減而計算出來的結果,我們需要透過computed來計算。
<div class=“text-sm-right”>
       <i>字數限制:50</i>
       <i>剩餘字數:1/ 50</i>
</div>
可以改成:
<div class=“text-sm-right”>
      <i>字數限制:{{ limit }}</i>
      <i>剩餘字數:{{ remain }}/ {{ limit }}</i>
</div>

並且在data中加入limit變數的初始值,並且設定為50。
data: {
          Message: “這是一個APP”,
          limit: 50
        },


透過前面提到的方式,在computed中計算remain的值。
this.limit - this.message.length 其中 this.limit 為限制的字數,this.message.length 為使用者輸入的字數。

computed: {
   remain() {
       return this.limit - this.message.length;
    }
 },

3.設置限制使用者輸入字數機制

接下來製作一個check方法,一旦使用者輸入完畢的時候,就啟動check方法檢查字數。在< textarea >加上v-on:input,當input完畢,啟動vi-on,呼叫check方法。
下面是HTML部分的修改:
< textarea cols=“30” rows=“5” type=“text” class=“form-control” v-on:input=“check” v-model=“message”>< / textarea >

下面是javascript的部分,加上check() ,並且透過前面說的加上this.message.substr(0, 10) ,如此使用者只能輸入10個字串。如果超過10個字,就會因為 this.message = this.message.substr(0, 10)而只接受10個數字:
<script>
        app = new Vue({
            el: “#app",
            data: {
                message: “這“一個APP”,”            },
            methods: {
                check() {
                    this.message = this.message.substr(0, 10)
                }
            },
        });
    </script>

我們把10換成limit變數,
message.substr(0, this.limit) 就表示從0這個位置開始裁切到 limit變數設定的字數,由於data中的limit被設定為50,因此我們可以輸入50個字,如果想要增加或者減少字數,只需要在limit變數的地方修改數值就可以。如此式子就比上面更有彈性。
 methods: {
     check() {
          this.message = this.message.substr(0, this.limit)
      }
  },

到目前為止,基本的功能已經具備。我們可以再加上判斷式優化一下程式碼。

 methods: {
   check() {
     if (this.remain < 0) {
        this.message = this.message.substr(0, this.limit)
      };
    }
 },
加上CSS效果,警告使用者已經達到輸入上限。由於我們使用Bootstrap4,所以可以使用 .is-invalid 來切換效果Forms · Bootstrap 當remain為false的時候,就會綁定.is-invalid
v-bind:class=“{‘is-invalid’:!remain}” 

大功告成,下面是完整的程式碼。




留言

這個網誌中的熱門文章

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

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

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