javascript プログラミング

Vue.jsで文字数カウンターを作る

2021/01/30

※ 本ページはプロモーションが含まれています。

勉強がてらvue.jsを使って「文字数カウンター」を作ってみました。

仕様とコード

勉強がてらvue.jsを使って「文字数カウンター」を作ってみました。

仕様的には、入力された文字数を「空白スペースを含めた文字数」「空白スペースを含めない文字数」2パターンを出力するものです。「リセット」ボタンを押すと入力された文字は「クリア」されます。

Vue.jsはCDNで読み込んでいます。

DEMO

コードは以下になります。

index.html(一部抜粋)


<div class="container" id="app">
        <h1>文字数カウンター</h1>
        <textarea v-model="inputText" placeholder="文字を入力してください" cols="30" rows="10" class="text-area"></textarea>
        <p class="char-box">文字数: <span>{{ textNormal }}<span></p>
        <p class="char-box">空白を除いた文字数: <span>{{ textNospace }}</span></p>
        <button @click="reset" class="btn-reset">リセット</button>
</div>

index.js(一部抜粋)


var vm = new Vue({
    el: '#app',
    data() {
      return {
        inputText: ''
      };
    },
    computed: {
      textNormal: function() {
        //console.log("SPACE : " + this.inputText.length)

        return this.inputText.length
      },
      textNospace: function() {
        var spaceText = this.inputText;
        var noSpaceText = spaceText.replace(/\s+/g,'')
        //console.log("no : " + noSpaceText.length)
        return noSpaceText.length
      }
    },
    methods: {
      reset () {
          Object.assign(this.$data, this.$options.data.apply(this));
      }
    }

  });

style.scss


body,html {
  margin: 0;
  padding: 0;
}

* {
  box-sizing: border-box;
}

/* body
--------------------------------*/


html {
  width: 100%;
  margin: 0 auto;
  font-size: 0.625rem;
}

body {
  width: 100%;
  background: #416daf;
  color: #000;
  font-family: "メイリオ", Meiryo, "Hiragino Kaku Gothic ProN", "Hiragino Kaku Gothic Pro", "游ゴシック", "Yu Gothic",
    YuGothic, "MS ゴシック", sans-serif;
  font-weight: 400;
  line-height: 1.6;
  text-align: left;
  -webkit-text-size-adjust: 100%;
  overflow-x: hidden;
}

/* style
--------------------------------*/

.inner {
    width: 100%;
    height: 100vh;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
}

h1 {
    font-size: 3.6rem;
    color: #1d3b67;
    margin-bottom: 40px;
    letter-spacing: 0.1rem;
    text-align: center;
    line-height: 1.1;
}

.container {
    background: #fff;
    max-width: 600px;
    width: 80%;
    border-radius: 40px;
    padding: 40px 35px 30px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    box-shadow: -3px 1px 17px 0px rgba(0, 0, 0, 0.04);
}

.text-area {
  width: 100%;
  max-height: 400px;
  padding: 15px;
  box-sizing: border-box;
  border-radius: 10px;
  border: none;
  background: #e0edea;
  font-size: 18px;
  color: #1d3b67;
  outline: none;
  line-height: 1.6;
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  margin-bottom: 30px;
}


.char-box {
  width: 100%;
  padding: 18px 15px 15px;
  box-sizing: border-box;
  border-radius: 10px;
  font-size: 1.8rem;
  font-weight: bold;
  color: #1d3b67;
  background: #e0edea;
  span {
    font-size: 2.4rem;
  }
}

.btn-reset {
  width: 250px;
  font-size:2.0rem;
  font-weight: bold;
  color: #fff;
  background: #d7286a;
  padding: 15px 75px 13px;
  border-radius: 30px;
  border: none;
  outline: none;
  appearance: none;
  margin: 50px auto 0;
  box-shadow: -3px 1px 17px 0px rgba(0, 0, 0, 0.2);
  &:hover {
    background: #ff5b99;
  }
}

メモ

「空白スペースあり」の文字数は、入力された文字数をそのまま返しているだけです。

「空白スペースなし」の文字数は、入力されたテキストにある空白や改行を取り除いて(空白や改行を”空”に置き換えて)、その文字数を出力しています。

リセットボタンのところで、dataを初期化する方法が当初上手くいかず苦戦しました。

下記の参考サイトを見てやったらうまくいったので、とりあえずヨシ!

参考サイト

Reset data in a vue component
体で覚えるVue.js - インスタンスメンバ編 〜 JSおくのほそ道 #024

Vue.js初心者にオススメの書籍・Udemy動画・サイト

読んでみたVue.js関係の書籍 Webデザインの現場で使えるVue.jsの教科書 Webデザインの現場で使えるVue.jsの教科書posted with ヨメレバ廣末 丈士/遠山 恭平 オーム社 2 ...

続きを見る

Vue.jsのサンプル、実例がまとめられているサイト5選

Vue.js Vue.js orgの公式サンプル集。ToDOのサンプルなど12のサンプルを掲載しています。ブラウザ上から試せます。 ≫ Vue.js Vue.js Examples Vue.jsのサン ...

続きを見る


-javascript, プログラミング