iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0
Modern Web

初學者前端應用30天系列 第 9

[DAY9]v-model、v-if、watch、computed 結合

  • 分享至 

  • xImage
  •  

經過了前幾天的教學,相信大家對v-model、v-if 、 watch、computed有初步的理解,我們現在來做一個小東西,將它們都結合起來。

我們來做三個input欄位,可以判斷有無輸入,並顯示相應字串。

首先要先把data和computed值先設定好。

    data:()=>({
        id: '',//欄位data名稱
        pw: "",//欄位data名稱
        msg: "",//欄位data名稱
        account: 0//計算輸入欄位數量
    }),
    computed:{
        con1(){
            return this.id.length>0 //該欄位有值時為true
        },
        con2(){
            return this.pw.length>0 //該欄位有值時為true
        },
        con3(){
            return this.msg.length>0 //該欄位有值時為true
        },
    },

接著我們來做畫面,用到bootstrap來做排版,有3個輸入欄位和3個p標籤,輸入欄位都要v-model一個data值,p標籤都要用到v-if-else來做判斷,控制其是否顯示。

<div class="container">
    <div class="row">
        <div class="col-4"></div>
        <div class="col-4">
            <input type="text" v-model="id">
            <br>
            <input type="text" v-model="pw">
            <br>
            <input type="text" v-model="msg">
            <br>
            <p v-if="account==3">都有輸入</p>
            <p v-else-if="account==2">只有二個輸入</p>
            <p v-else-if="account==1">只有一個輸入</p>
            <p v-else>都沒輸入</p>
        </div>
        <div class="col-4"></div>
    </div>
</div>

為了要能及時監聽輸入欄位的變動,會用到watch來監聽輸入欄位的data值。
當監聽到變動時都會執行check function。

watch: {
    id: {
        immediate: false,
        handler() {
            this.check();
        }
    },
    pw: {
        immediate: false,
        handler() {
            this.check();
        }
    },
    msg: {
        immediate: false,
        handler() {
            this.check();
        }
    }
},

check function用來判斷你的輸入欄有值時,藉由修改account值,控制p標籤的顯示時機。

methods: {
    check() {
        if (this.con1 && this.con2 && this.con3) {
            this.account = 3
        } else if ((this.con1 && this.con2) || (this.con1 && this.con3) || (this.con3 && this.con2)) {
            this.account = 2
        } else if (this.con1 || this.con2 || this.con3) {
            this.account = 1
        } else {
            this.account = 0
        }
    },
},

做完這些後就完成了。
以下是全程式碼。

<template>
  <div >
        <div class="container">
            <div class="row">
                <div class="col-4"></div>
                <div class="col-4">
                    <input type="text" v-model="id">
                    <br>
                    <input type="text" v-model="pw">
                    <br>
                    <input type="text" v-model="msg">
                    <br>
                    <p v-if="account==3">都有輸入</p>
                    <p v-else-if="account==2">只有二個輸入</p>
                    <p v-else-if="account==1">只有一個輸入</p>
                    <p v-else>都沒輸入</p>
                </div>
                <div class="col-4"></div>
            </div>
        </div>
  </div>
</template>
<script>
// @ is an alias to /src
/*eslint-disable*/
export default {
  name: '',
  components: {
  },
    data:()=>({
        id: '',//欄位data名稱
        pw: "",//欄位data名稱
        msg: "",//欄位data名稱
        account: 0//計算輸入欄位數量
    }),
    computed:{
        con1(){
            return this.id.length>0 //該欄位有值時為true
        },
        con2(){
            return this.pw.length>0 //該欄位有值時為true
        },
        con3(){
            return this.msg.length>0 //該欄位有值時為true
        },
    },
    watch: {
        id: {
            immediate: false,
            handler() {
                this.check();
            }
        },
        pw: {
            immediate: false,
            handler() {
                this.check();
            }
        },
        msg: {
            immediate: false,
            handler() {
                this.check();
            }
        }
    },
    methods: {
        check() {
            if (this.con1 && this.con2 && this.con3) {
                this.account = 3
            } else if ((this.con1 && this.con2) || (this.con1 && this.con3) || (this.con3 && this.con2)) {
                this.account = 2
            } else if (this.con1 || this.con2 || this.con3) {
                this.account = 1
            } else {
                this.account = 0
            }
        },
    },
}
</script>
<style  scoped>
</style>

上一篇
[DAY8]vue v-if-else v-show v-for
下一篇
[DAY10]vue filter 過濾器
系列文
初學者前端應用30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言