vueリスニングプロパティwatchとcomputed

26562 ワード

参照先:
詳細はvue 2.0リスニング属性の使用心得と計算属性の使用
vueリスニングオブジェクトのプロパティ
1.基礎版リスニング:「単一値」をリスニングする
シーンは以下の通りです:入力ボックスはあなたの年齢を入力して、もし年齢が0-15歳ならばヒント情報:あなたはまだ子供で、もし年齢が15-25歳ならば、ヒント情報:あなたはすでに少年で、もし年齢が25歳以上ならば、ヒント情報:あなたはすでに成長しました.必要に応じてリスニングプロパティに合わせて、次のコードを入手します.

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
    <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js">script>
head>
<body>
<div id="app"><input type="number" v-model="age"><br><span>{{infoMsg}}span>
div>

<script type="text/javascript">
    var vm = new Vue({
        el: '#app',
        data: {
            age: 0,
            infoMsg: ""
        },
        watch: {
            age: function (val, oldval) {
                if (val > 0 && val < 15) {
                    this.infoMsg = "      "
                } else if (val > 15 && val < 25) {
                    this.infoMsg = "       "
                } else {
                    this.infoMsg = "      "
                }
            }
        }
    })
script>
body>
html>

ここで特に説明する必要があるのは、堅牢な属性メソッドの2つのパラメータがそれぞれ意味を表していることです.最初のvalは面と向かって傍受している属性の値であり、oldvalは属性が変わる前の値であり、これはパラメータの名前は自分で定義することができますが、パラメータが表す意味は変わりません.
2.ステップアップリスニング:リスニング対象
オブジェクトinfoのプロパティage値の変化を傍受するため、深さ傍受を使用する必要があります.具体的なコードは次のとおりです.

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
    <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js">script>
head>
<body>
<div id="app4"><input type="number" v-model="info4.age4"><br><span>{{infoMsg4}}span>
div>

<script type="text/javascript">
    var vm = new Vue({
        el: '#app4',
        data: {
            info4: {
                age4: ""
            },
            infoMsg4: ""
        },
        watch: {
            info4: {
                handler: function (val, oldval) {
                    var that = this;
                    if (val.age4 > 0 && val.age4 < 15) {
                        that.infoMsg4 = "      ";
                    } else if (val.age4 > 15 && val.age4 < 25) {
                        that.infoMsg4 = "       ";
                    } else {
                        that.infoMsg4 = "      ";
                    }
                },
                deep: true
            }
        }
    })
script>
body>
html>

ここで注意しなければならないのは2つあります.
  • 1、ここでfunctionは矢印関数の代わりに使用できません.矢印関数を使用すると、thisの指向はグローバルになります.
  • 2、ここに追加された属性がdeepであることに気づきます.これは、オープン値がtrueの場合、逆にfalseである場合、深さリスニングをオンにするかどうかを意味します.

  • 3.最上位リスニング:リスニング対象の属性
    2つ目のケースについて、あなたが1つの問題を発見したかどうか分かりません.私たちが傍受しているのは1つのオブジェクトの中の属性の変化ですが、もしこのオブジェクトの中に多くの値がある場合、2つ目の方法で傍受することもできますが、これは資源に対する大きな浪費であり、厳格なプログラマー(微笑みの顔)として、このようなことは絶対に許されないので、computed(計算プロパティ)と組み合わせて上記のコードを最適化することができます.
    
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Titletitle>
        <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js">script>
    head>
    <body>
    <div id="app5"><input type="number" v-model="info5.age5"><br><span>{{infoMsg5}}span>
    div>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#app5',
            data: {
                info5: {
                    age5: "",
                    name5: "",
                    hobit5: ""
                },
                infoMsg5: ""
            },
            computed: {
                ageval: function () {
                    return this.info5.age5;
                }
            },
            watch: {
                ageval: {
                    handler: function (val, oldval) {
                        var that = this;
                        if (val > 0 && val < 15) {
                            that.infoMsg5 = "      ";
                        } else if (val > 15 && val < 25) {
                            that.infoMsg5 = "       ";
                        } else {
                            that.infoMsg5 = "      ";
                        }
                    },
                    deep: true
                }
            }
        })
    script>
    body>
    html>
    

    以上から,今回傍受したのは計算属性agevalであり,計算属性はinfoオブジェクト中のageの値を返し,2回目のコードと比較すると,2回目のコードのうち傍受した1つはオブジェクトinfo,1つはinfoオブジェクト中のageの値であり,性能が大幅に向上していることが期待される結果である.