LoginSignup
0
0

More than 1 year has passed since last update.

【Vue.js】フォームバリデーションで使うgetter/setter

Posted at

Tips1

公式リファレンス

  • 入力文字列が20文字以上だった場合にリアルタイムでerrorの表示をさせたい。
  • 算出プロパティのget/setを使用して入力を監視する。

vue


 <script>
        let app = new Vue({
            el:'#app',
            data(){
                return {
                    contact:{
                        yourName:'', //input要素を定義する。
                    },
                    hasError:{
                        nameError: false //error判定用の初期値
                    }
                }
            },
            computed:{
                yourName:{
                    get(){  //yourNameで入力された取得。
                        return this.contact.yourName
                    },
                    set(value){ //yourNameで入力された値を引数で受け取る。
                        if(value.length <= 20){
                            this.hasError.nameError = false //20文字以内だったらfalseをセット
                        } else {
                            this.hasError.nameError = true //20文字以上だったらtrueをセット
                        }
                        return this.contact.yourName = value //valueをyourNameに帰す
                    }
                }
            }
        })
    </script>

html

  • CSS:20文字以上だった場合のerrorクラスにcssをあてる。
  • 文字数カウント:20文字以上だった場合に、errorクラスを付与させる。
  • v-show:20文字以上の時にメッセージを表示

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>
    <style>
        .error{ //20文字以上だった場合のerrorクラスにcssをあてる。
            color:red;
        }
    </style>
</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.js"></script>
    <div id="app">
        <form>
            <label for="yourName">氏名</label>
            <input id="yourName" type="text" v-model="yourName"><br> <!-- computedで監視している値 -->
            <p :class="{error: hasError.nameError}">{{yourName.length}}/20</p> //20文字以上だった場合に、errorクラスを付与させる。
            <p v-show="hasError.nameError" class="error">氏名は20文字以内</p> //v-show:20文字以上の時にメッセージを表示
            {{contact.yourName}}
        </form>
    </div>

全体

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>
    <style>
        .error{
            color:red;
        }
    </style>
</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.js"></script>
    <div id="app">
        <form>
            <label for="yourName">氏名</label>
            <input id="yourName" type="text" v-model="yourName"><br> <!-- computedで監視している値 -->
            <p :class="{error: hasError.nameError}">{{yourName.length}}/20</p>
            <p v-show="hasError.nameError" class="error">氏名は20文字以内</p>
            {{contact.yourName}}
        </form>
    </div>

    <script>
        let app = new Vue({
            el:'#app',
            data(){
                return {
                    contact:{
                        yourName:'',
                    },
                    hasError:{
                        nameError: false //error判定用の初期値
                    }
                }
            },
            computed:{
                yourName:{
                    get(){
                        return this.contact.yourName
                    },
                    set(value){ //yourNameで入力された値を引数で受け取る。
                        if(value.length <= 20){
                            this.hasError.nameError = false
                        } else {
                            this.hasError.nameError = true
                        }
                        return this.contact.yourName = value //valueをyourNameに帰す
                    }
                }
            }
        })
    </script>
</body>
</html>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0