Vue计算属性和监视属性

目录

计算属性computed

监事属性

深度监视


计算属性computed

计算属性:

定义:要用的属性不存在,要通过已有属性计算得来

2、原理:底层借助了Object.defineproperty方法提供的getter和setter

3、get函数什么时候执行?

  • 1、初次读取时会执行一次。
  • 2、当依赖的数据发生改变时会被在次调用

4、优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。

5、备注:

1、计算属性最终会出现在vm上,直接读取使用即可。

2、如果计算属性要被修改,那必须写set函数去响应,,且set中要引起计算是依赖的数据发生变化

<!DOCTYPE html>
<html lang="en" xmlns:v-model="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--vue-->
    <script src="https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script>

</head>

<div id="root">

    姓:<input type="text" v-model:value="firstName"></br><br>
    名:<input type="text" v-model="lastName"></br><br>
全名:{{allName}}
</div>


<script type="text/javascript">
   vm = new Vue({
        el: '#root',
        data: {
            firstName:"孔",
            lastName:"超"
        },
        computed:{
            allName:{
                //get在当有人读取allName的时,get就会被调用,且返回值就作为allName的值
                //get什么时候被调用?1、初次读取allName时。2、所依赖的数据发生拜年话式
                get(){
                    //this就是当前vue对象,里面有所有属性
                    return this.firstName+"-"+this.lastName;
                },
               //当allName被修改时,set方法调用
                set(value){ //value就是all被修改后的值
                    const arr=value.split('-')//value得是String,以-作为分隔符,将这个字符串分割成数组
                    this.firstName=arr[0]
                    this.lastName=arr[1]
                }
            }

        }

    });
    console.log(vm)

</script>

<body>

</body>
</html>

运行结果 

 计算属性-天气案例

<div id="root">
今天天气很{{info}}
    <button @click="change">点击切换</button>
</div>


<script type="text/javascript">
    const vm = new Vue({
        el: '#root',
        data: {
            isHot:true
        },
        methods: {
            change(){
                this.isHot=!this.isHot
            }
        },
        computed: {
            info() {
                return this.isHot? "炎热" : "凉爽"
            }
        }

    });
    console.log(vm)

</script>

监事属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>监视属性</title>
    <!--vue-->
    <script src="https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script>

</head>

<div id="root">
    今天天气很{{info}}
    <button @click="change">点击切换</button>
</div>


<script type="text/javascript">
    const vm = new Vue({
        el: '#root',
        data: {
            isHot: true
        },
        methods: {
            change() {
                this.isHot = !this.isHot

            }
        },
        computed: {
            info() {
                return this.isHot ? "炎热" : "凉爽"
            }
        },
        watch: {
            isHot: {
                // immediate是否立即执行
                immediate:true,
                //handler什么时候调用?当isHot发生改变时调用
                handler(newV, oldV) {
                    // console.log(Math.ceil(Math.random()*10))
                    console.log("isHot被修改了," + newV+"---" + oldV)
                }
            }
        }

    });
    console.log(vm)

</script>

<body>

</body>
</html>

另一种写法

    vm.$watch('isHot',{
        // immediate是否立即执行
        immediate:true,
        //handler什么时候调用?当isHot发生改变时调用
        handler(newV, oldV){
            // console.log(Math.ceil(Math.random()*10))
            console.log("isHot被修改了," + newV+"---" + oldV)
        }}
    )
    console.log(vm)

</script>

监事属性watch:

1、当被监视的属性变化时,回调函数自动调用,进行相关操作

2、监视的属性必须存在,才能进行监视

3、监视的两种写法

  1. new Vue时传入watch配置
  2. 通过vm.$watch监视

深度监视

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--vue-->
    <script src="https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script>

</head>

<div id="root">
b:{{number.a}}
    <button @click="number.a++">点击a的值加1</button>
    b:{{number.b}}
    <button @click="number.b++">点击a的值加1</button>
</div>


<script type="text/javascript">
    const vm = new Vue({
        el: '#root',

        data: {
            number:{
                a:10,
                b:20
            },
        },
        methods: {

        },
        watch:{
            number: {
                //开启深度监视,number中每一个值变化都会变
                deep:true,
                handler() {
                    console.log("number的值变了")
                }
            },
           // 其中的值
           "number.a": {

                handler() {
                    console.log("a的值变了")
                }
            }
        }

    });
    console.log(vm)

</script>

<body>

</body>
</html>

1、Vue中的watch默认不见时对象内部值的改变(一层)

2、配置deep:true可以检测对象内部值改变(多层)

备注:

1、Vue自身可以检测对象内部值的改变,但Vue提供的watch默认不可以

2、使用watch是根据数据的具体结构,决定时候采用深度监测

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执久呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值