美文网首页
Vue4.计算属性与监视

Vue4.计算属性与监视

作者: 黑咔 | 来源:发表于2019-03-11 14:10 被阅读0次

1.计算属性-computed

1.1 要显示的数据不存在,要通过计算得来。
1.2. 在 computed 对象中定义计算属性。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>姓名案例_计算属性实现</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!--
    计算属性:
            1.定义:要用的属性不存在,要通过已有属性计算得来。
            2.原理:底层借助了Objcet.defineproperty方法提供的getter和setter。
            3.get函数什么时候执行?
                        (1).初次读取时会执行一次。
                        (2).当依赖的数据发生改变时会被再次调用。
            4.优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。
            5.备注:
                    1.计算属性最终会出现在vm上,直接读取使用即可。
                    2.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。
 -->
<!-- 准备好一个容器-->
<div id="root">
    姓:<input type="text" v-model="firstName"> <br/><br/>
    名:<input type="text" v-model="lastName"> <br/><br/>
    全名:<span>{{fullName}}</span> <br/><br/>
</div>
</body>

<script type="text/javascript">
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

    const vm = new Vue({
        el: '#root',
        data: {
            firstName: '李',
            lastName: '寄 '
        },
        computed: {
            fullName: {
                get() {
                    return this.firstName + '-' + this.lastName
                },
                set(value) {
                    const arr = value.split('-')
                    this.firstName = arr[0]
                    this.lastName = arr[1]
                }
            }
        }
    })
</script>
</html>

计算属性简写

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>姓名案例_计算属性实现</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!-- 准备好一个容器-->
<div id="root">
    姓:<input type="text" v-model="firstName"> <br/><br/>
    名:<input type="text" v-model="lastName"> <br/><br/>
    全名:<span>{{fullName}}</span> <br/><br/>
</div>
</body>

<script type="text/javascript">
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

    const vm = new Vue({
        el: '#root',
        data: {
            firstName: '李',
            lastName: '寄',
        },
        computed: {
            //完整写法
            /* fullName:{
                get(){
                    console.log('get被调用了')
                    return this.firstName + '-' + this.lastName
                },
                set(value){
                    console.log('set',value)
                    const arr = value.split('-')
                    this.firstName = arr[0]
                    this.lastName = arr[1]
                }
            } */
            //简写的前提: 不需set的时候
            fullName() {
                console.log('get被调用了')
                return this.firstName + '-' + this.lastName
            }
        }
    })
</script>
</html>
2.监视属性-watch

2.1 通过通过 vm 对象的$watch()或 watch 配置来监视指定的属性
2.2 当属性变化时, 回调函数自动调用, 在函数内部进行计算

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>天气案例_监视属性</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!--
        监视属性watch:
            1.当被监视的属性变化时, 回调函数自动调用, 进行相关操作
            2.监视的属性必须存在,才能进行监视!!
            3.监视的两种写法:
                    (1).new Vue时传入watch配置
                    (2).通过vm.$watch监视
 -->
<!-- 准备好一个容器-->
<div id="root">
    <h2>今天天气很{{info}}</h2>
    <button @click="changeWeather">切换天气</button>
</div>
</body>

<script type="text/javascript">
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

    const vm = new Vue({
        el: '#root',
        data: {
            isHot: true,
        },
        computed: {
            info() {
                return this.isHot ? '炎热' : '凉爽'
            }
        },
        methods: {
            changeWeather() {
                this.isHot = !this.isHot
            }
        },
        // watch: {
        //     isHot: {
        //         immediate: true, //初始化时 让handler调用一下
        //         handler(newValue, oldValue) {
        //             console.log('isHot被修改了', newValue, oldValue)
        //         }
        //     }
        // }
    })
    vm.$watch('isHot', {
        immediate: true, //初始化时 让handler调用一下
        handler(newValue, oldValue) {
            console.log('isHot被修改了', newValue, oldValue)
        }
    })
</script>
</html>

深度监视

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>天气案例_深度监视</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!--
        深度监视:
                (1).Vue中的watch默认不监测对象内部值的改变(一层)。
                (2).配置deep:true可以监测对象内部值改变(多层)。
        备注:
                (1).Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以!
                (2).使用watch时根据数据的具体结构,决定是否采用深度监视。
 -->
<!-- 准备好一个容器-->
<div id="root">
    <h2>今天天气很{{info}}</h2>
    <button @click="changeWeather">切换天气</button>
    <hr/>
    <h3>a的值是:{{numbers.a}}</h3>
    <button @click="numbers.a++">点击让a++</button>
    <h3>b的值是:{{numbers.b}}</h3>
    <button @click="numbers.b++">点击让b++</button>

    {{numbers.c.d.e}}
</div>
</body>

<script type="text/javascript">
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

    const vm = new Vue({
        el: '#root',
        data: {
            isHot: true,
            numbers: {
                a: 1,
                b: 1,
                c: {
                    d: {
                        e: 100
                    }
                }
            }
        },
        computed: {
            info() {
                return this.isHot ? '炎热' : '凉爽'
            }
        },
        methods: {
            changeWeather() {
                this.isHot = !this.isHot
            }
        },
        watch: {
            isHot: {
                // immediate:true, //初始化时让handler调用一下
                //handler什么时候调用?当isHot发生改变时。
                handler(newValue, oldValue) {
                    console.log('isHot被修改了', newValue, oldValue)
                }
            },
            //监视多级结构中某个属性的变化
            /* 'numbers.a':{
                handler(){
                    console.log('a被改变了')
                }
            } */
            //监视多级结构中所有属性的变化
            numbers: {
                deep: true,
                handler() {
                    console.log('numbers改变了')
                }
            }
        }
    })

</script>
</html>

监视属性的简写

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>天气案例_监视属性_简写</title>
        <!-- 引入Vue -->
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <!-- 准备好一个容器-->
        <div id="root">
            <h2>今天天气很{{info}}</h2>
            <button @click="changeWeather">切换天气</button>
        </div>
    </body>

    <script type="text/javascript">
        Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
        
        const vm = new Vue({
            el:'#root',
            data:{
                isHot:true,
            },
            computed:{
                info(){
                    return this.isHot ? '炎热' : '凉爽'
                }
            },
            methods: {
                changeWeather(){
                    this.isHot = !this.isHot
                }
            },
            watch:{
                //正常写法
                /* isHot:{
                    // immediate:true, //初始化时让handler调用一下
                    // deep:true,//深度监视
                    handler(newValue,oldValue){
                        console.log('isHot被修改了',newValue,oldValue)
                    }
                }, */
                //简写
                /* isHot(newValue,oldValue){
                    console.log('isHot被修改了',newValue,oldValue,this)
                } */
            }
        })

        //正常写法
        /* vm.$watch('isHot',{
            immediate:true, //初始化时让handler调用一下
            deep:true,//深度监视
            handler(newValue,oldValue){
                console.log('isHot被修改了',newValue,oldValue)
            }
        }) */

        //简写
        /* vm.$watch('isHot',(newValue,oldValue)=>{
            console.log('isHot被修改了',newValue,oldValue,this)
        }) */

    </script>
</html>
computed和watch之间的区别
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>姓名案例_watch实现</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!-- 
        computed和watch之间的区别:
                1.computed能完成的功能,watch都可以完成。
                2.watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。
        两个重要的小原则:
                    1.所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。
                    2.所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,
                        这样this的指向才是vm 或 组件实例对象。
-->
<!-- 准备好一个容器-->
<div id="root">
    姓:<input type="text" v-model="firstName"> <br/><br/>
    名:<input type="text" v-model="lastName"> <br/><br/>
    全名:<span>{{fullName}}</span> <br/><br/>
</div>
</body>

<script type="text/javascript">
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

    const vm = new Vue({
        el: '#root',
        data: {
            firstName: '张',
            lastName: '三',
            fullName: '张-三'
        },
        watch: {
            firstName(val) {
                setTimeout(() => {
                    console.log(this)
                    this.fullName = val + '-' + this.lastName
                }, 1000);
            },
            lastName(val) {
                this.fullName = this.firstName + '-' + val
            }
        }
    })
</script>
</html>

相关文章

  • Vue4.计算属性与监视

    1.计算属性-computed 1.1 要显示的数据不存在,要通过计算得来。1.2. 在 computed 对象...

  • Vue3计算属性和监视属性

    计算属性 需要引入computed函数 这里我计算的firstName与laststName加在一起 监视属性 同...

  • vue计算属性与监视

  • Vue基本语法和生命周期

    计算属性和监视 计算属性在computed属性对象中定义计算属性的方法在页面中使用{{方法名}}来显示计算的结果 ...

  • 计算属性和监视

    计算属性和监视1.4.1. 计算属性1)在 computed 属性对象中定义计算属性的方法 2)在页面中使用{{方...

  • Vue的常用的打开姿势

    计算属性和监视 计算属性:1)在 computed 属性对象中定义计算属性的方法2)在页面中使用{{方法名}}来显...

  • Vue基础语法和生命周期

    计算属性和监视 1、计算属性: 在computed属性对象中定义计算属性的方法 在页面中使用{{方法名}}来显示计...

  • VUE计算属性和监视

    计算属性在computed属性对象中定义计算属性的方法在页面中使用{{方法名}}来显示计算的结果 监视属性:通过通...

  • Vue中的计算属性与监视属性

    1. 前言 在本人看来,Vue.js的计算属性是我目前见过最棒的东西,该属性很好的让我们不再关注视图层,只关注代码...

  • Vue计算属性和监视

    计算属性在vm实例中使用computed属性定义属性的方法在页面中使用插值表达式来显示计算的结果 监视属性通过vm...

网友评论

      本文标题:Vue4.计算属性与监视

      本文链接:https://www.haomeiwen.com/subject/nqavpqtx.html