Vue计算属性与监视属性

计算属性

计算属性:

  1. 定义:要用的属性不存在,要通过已有属性计算得来。
  2. 原理:地城记住了Object.defineproperty方法提供的getter和serter。
  3. get函数什么时候执行?
    1. 初次读取f时会调用一次。

    2. 所依赖的数据发生变化时会再次调用。

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

  5. 备注:

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

    2. 如果计算属性被修改,那必须写set函数去相应修改,且set中有引用的计算时依赖的属性发生变化,一般情况下计算属性不会修改。

    3. 计算属性不能靠异步任务去返回返回值,因为它是靠返回值获取对应值的。

<div id="root">
    <!-- @keyup.enter代表回车键弹起 -->
    请输入姓:<input type="text" v-model="name_1">
    <br>
    请输入名:<input type="text" v-model="name_2">
    <br>
    输入的内容:<label>{{fullName}}</label>
    <hr>
</div>
<script>
    let val = "xin";
    const vm = new Vue({
        el: "#root",
        data: {
            name_1: "",
            name_2: ""
        },
        computed: {
         //------完整版写法-------
            fullName: {
                //get的作用:当读取fullName时,get就会被调用,且返回值为fullName的值。
                //get的调用:初次读取fullName时,所得来的数据发生变化时。
                get() {
                    //此处的this是vue对象
                    return this.name_1 + "-" + this.name_2;
                },

                //修改fullName的属性时会被调用
                //一般情况下计算属性不会修改
                set(value) {
                    let arr = value.split("-");
                    this.name_1=arr[0];
                    this.name_2=arr[1];
                }
            }
        //-------简写版写法(只考虑读取不考虑修改时才能用简写形式)-------
            //与只有一个get函数的效果相同,调用方法与插值语法一样,不加括号
            fullName(){
                return this.name_1 + "-" + this.name_2;               
            }
        }
    })
</script>

监视属性(侦听属性)

监视属性:

  1. 被监视的属性变化时,回调函数自动调用,进行相关操作。
  2. 被监视属性必须存在才能进行监视(被监视的属性可以是计算属性)
  3. 监视属性的两种写法:
    1. new New时传入watch配置。
    2. 通过vm.$watch监视。
<div id="root">
    <h1>今天天气很{{info}}</h1>
    <br>
    <button @click="changeWeather">点我切换</button>
    <hr>
</div>
<script>
    const vm = new Vue({
        el: "#root",
        data: {
            isHot: true
        },
        computed: {
            info() {
                return this.isHot ? "热" : "冷";
            }
        },
        methods: {
            changeWeather() {
                this.isHot = !this.isHot;
            }
        },
        watch: {
            //监听isHot值得改变
            isHot: {
                immediate: false,  //初始化的时候自动调用handler,默认是false,旧参数值(lowValue为undefine)
                //isHot改变时会调用handler,第一次参数是新的值,第二个参数是旧的值。
                handler(newVlaue, lowValue) {
                    console.log("isHot被改了 " + "新的值:" + newVlaue + " 旧的值:" + lowValue);

                }
            }
        }
    })

    //后续添加监视属性
    vm.$watch("isHot",{
            //监听isHot值得改变
            isHot: {
            immediate: false,  //初始化的时候自动调用handler,默认是false,旧参数值(lowValue为undefine)
            //isHot改变时会调用handler,第一次参数是新的值,第二个参数是旧的值。
            handler(newVlaue, lowValue) {
                console.log("isHot被改了 " + "新的值:" + newVlaue + " 旧的值:" + lowValue);

            }
        }
    });

</script>

深度监视(深度侦听)

深度监视:

  1. vue中的watch默认不监测对象内部值的改变(一层)。
  2. 配置deep:true可以监测队形内部值的改变(多层)。
  3. vue自身可以监测对象内部值的改变,但vue提供的watch默认不可以。
  4. 使用watch是根据数据的具体结构,决定是否采用深度监视。
  5. 如果使用简写方式就不能进行深度监视等操作了。
<div id="root">
    <h1>a的值{{number.a}}</h1><br>
    <button @click="number.a++">改变a的值</button>
    <hr><br>
    <h1>b的值{{number.b}}</h1><br>
    <button @click="number.b++">改变a的值</button>
    <hr>
</div>

<script>
    new Vue({
        el: "#root",
        data: {
            number: {
                a: 1,
                b: 2
            }
        },

        watch: {
            //监测number中的属性a是否改变
            "number.a": {
                handler(){
                    console.log("a的值改变了");
                }
            },

            //监测number的所有属性是否改变
            number:{
                deep:true,
                handler(){
                    console.log("number有值改变了");
                }
            }
        }
    })

//----------------------------后续添加监听属性-----------------------------------

    //正常写法
    vm.$watch("number",{
        immediate:true,
        deep:true,
        handler(newValue, lowValue){
            console.log("number的值改变了" + "新的值:" + newValue + " 旧的值" + lowValue);
        }
    })

    //简写方法
    vm.$watch("xin",function(newValue, lowValue){
        console.log("xin-的值改变了" + "新的值:" + newValue + " 旧的值" + lowValue);
    })

</script>

 computed与watch的区别

computed与watch的区别:

  1. computed能完成的功能,watch都可以完成。
  2. watch能完成的功能computed不一定能完成,例如:watch可以进行异步操作。

两个重要的小原则:

  1. 所有被vue管理的函数,最好写成普通函数,这样this的指向才是vm或者组件实力对象。
  2. 所有不被vue管理的函数(定时器的回调函数,ajax的回调函数等),最好写成箭头函数,这样this的指向才是vm或者组件实例对象。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端Vue计算属性在其依赖项之一发生更改时重新运行。计算属性的使用方法如下: ```html <template> {{ 方法名 }} </template> <script> export default { computed: { 方法名() { /* return 内容 */ }, }, } </script> ``` 计算属性可以用于过滤数组,并且与监听属性(watch)有一些区别。计算属性可以通过函数写法返回一个结果,用于呈现数据,而大多数计算属性都不需要设置setter方法。如果确定计算属性只用于呈现数据,可以使用简写形式,如下所示: ```javascript computed: { fullName() { return this.lastName + '-' + this.firstName; }, } ``` 而监听属性(watch)用于监听特定的数据变化,可以通过写函数来执行一些额外的逻辑。可以使用`@事件="方法"`或者`watch`来定义监听属性。监听属性还支持深度监听多级结构变化。 所以,前端Vue计算属性的更改可以通过修改计算属性的依赖项来实现重新计算。123 #### 引用[.reference_title] - *1* [前端vue计算属性](https://blog.csdn.net/weixin_46372074/article/details/124164831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* *3* [前端vue计算属性监视属性](https://blog.csdn.net/weixin_46372074/article/details/124404058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值