Vue computed 和 watch

本文介绍了Vue中计算属性(computed)和监听属性(watch)的使用方法。计算属性基于其依赖的数据进行缓存,只有当相关数据改变时才会重新计算。而监听属性则可以响应数据变化并执行指定的操作。

computed 计算属性:通过属性计算得来的属性

    计算属性,是在相关联的属性发生变化才计算,计算过一次,如果相关属性没有变化,下一次就不需要计算了,直接去缓存的值

  a:<input type="number" v-model.number="a" />
  b:<input type="number" v-model.number="b" />
 <!--c:<input type="number" v-model.number="c" />-->
 总和:{{sum()}}
 总和:{{count}}
 平均值:{{avg}}

 <p v-once>单价:{{price}}</p>
 <p>数量:<input type="number" v-model.number="count"/></p>
 <p>总价:{{sum}}</p>
 <p>运费:{{free}}</p>
 <p>应付:{{pay}}</p>

    data: {
            a: '',
            b:'',
            c:'',
            price: 28.8,
            count: '',
            free: 10
    },
    computed: {
        count(){
            console.log('计算属性触发了');
                return this.a+this.b;
        },
        avg(){
            return this.count/2;
        },
       sum(){
            return this.price * this.count;
        },
      pay(){
        if(this.count>0){
            if(this.sum>=299){
                return this.sum;
        }else{
            return this.sum + this.free;
        }
          }else{
                return 0;
        }
        }
     }

watch
属性变化,就会触发监听的函数。
监听属性变化,一般是用于跟数据无关的业务逻辑操作。
计算属性,适用于属性发生变化后,需要计算得到新的数据。

     <div id="app">
            a: <input type="number" v-model.number="a" /><br />
            b: <input type="number" v-model.number="b" /><br />
            总和:{{count}}
            
            <br /><br /><br />
            
            name: <input type="text" v-model="obj.name" /><br />
            age: <input type="text" v-model.number="obj.age" /><br />
            
        </div>
        
        <script src="vue.js"></script>
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    a: '',
                    b: '',
                    count: '',
                    obj: {
                        name: '',
                        age: ''
                    }
                },
                watch: {
                    a(newVal, oldVal){
                        console.log('触发了a-watch');
                        this.count = this.a + this.b;
                    },
                    b(newVal){
                        console.log('触发了b-watch');
                        this.count = this.a + this.b;
                    },
//                    obj(newVal, oldVal){
//                        console.log('触发了obj的监听');
//                    }
//
                    obj: {
                        //监听对象中的每一个值
                        handler(newVal, oldVal){
                            console.log('触发了obj的监听');
                        },
                        deep: true//深度监听
                    },
                    //监听对象中的某个属性
                    'obj.name': function(){
                        console.log('触发了obj.name的监听');
                    }
                }
            })
            
        </script>
        

watch 也可以在methods里面进行监听配置

<div id="app">
            a: <input type="number" v-model.number="a" /><br />
            b: <input type="number" v-model.number="b" /><br />
            总和:{{count}}
            
            <br /><br /><br />
            
            name: <input type="text" v-model="obj.name" /><br />
            age: <input type="text" v-model.number="obj.age" /><br />
            
            <button @click="btnAction()">开始监听</button>
            
        </div>
        
        <script src="vue.js"></script>
        <script>
            var vm = new Vue({
                el: '#app',
                data: {
                    a: '',
                    b: '',
                    count: '',
                    obj: {
                        name: '',
                        age: ''
                    }
                },
                methods: {
                    btnAction(){
                        this.$watch('a', (newVal, oldval)=>{
                            console.log('监听到了a的变化');
                            console.log(newVal, oldval);
                        })
                        
                        this.$watch('obj.name', (newVal, oldval)=>{
                            console.log('监听到了obj.name的变化');
                            console.log(newVal, oldval);
                        })
                        
                        this.$watch('obj', (newVal, oldval)=>{
                            console.log('监听到了obj的变化');
                            console.log(newVal, oldval);
                        }, {
                            deep: true
                        })
                    }
                }
            })
            
            
//            vm.$watch('a', (newVal, oldval)=>{
//                console.log('监听到了a的变化');
//                console.log(newVal, oldval);
//            })
//            
//            vm.$watch('obj.name', (newVal, oldval)=>{
//                console.log('监听到了obj.name的变化');
//                console.log(newVal, oldval);
//            })
//            
//            vm.$watch('obj', (newVal, oldval)=>{
//                console.log('监听到了obj的变化');
//                console.log(newVal, oldval);
//            }, {
//                deep: true
//            })
            
        </script>
### 回答1: 当使用Vue.js时,`computed`,`watch``methods`都是非常有用的功能。 `computed`属性是一种计算属性,可以根据其依赖关系动态地计算属性值。当它所依赖的属性发生变化时,它会自动重新计算属性值。这使得计算属性非常适合处理动态数据,例如将一组数据进行过滤、排序或计数。 示例代码: ```javascript computed: { // 计算属性,基于 count factor 计算 total total: function () { return this.count * this.factor; } } ``` `watch`属性是一种观察属性,它可以监视Vue实例中的属性,并在其发生变化时执行指定的函数。这使得它非常适合处理异步数据,例如通过Ajax请求获取数据。 示例代码: ```javascript watch: { // 监视 message 属性的变化,并在变化时执行 showMessage 函数 message: function (newVal, oldVal) { this.showMessage(newVal); } } ``` `methods`属性是一个方法集合,它包含了Vue实例中可用的所有方法。当你需要执行某些特定的操作时,你可以调用其中一个方法。 示例代码: ```javascript methods: { // 定义一个 greet 方法 greet: function () { alert('Hello!'); } } ``` 总的来说,`computed``watch`适合处理不同类型的数据,而`methods`则是执行特定操作的最佳选择。 ### 回答2: Vue.js是一款MVVM模式的渐进式JavaScript框架。其中的computedwatchmethods是Vue.js中非常重要的3个元素,它们分别用于计算、监听数据存放方法。 1. Computed computed属性可以定义一个计算属性,类似于Vue.js中的响应式变量,可以根据依赖数据的变化自动计算得出新的值。computed属性可以使用getset方法来实现对计算属性的读取写入操作,在模板中该属性会被当做一个正常的属性来处理。 computed适用于需要计算或派生新的值的场景,因为是缓存的,所以可以提升效率。如果依赖的数据没有发生改变,那么计算属性不会重新运行。通常computed适用于重复调用一个函数,但结果又不想重复计算的情况。 2. Watch watch属性是Vue.js中用于监听数据变化的方法。它可以监听任何位于data属性中的数据变化,当数据变化时,watch会立即执行指定的回调函数。watch可以监听单个变量,也可以监听一个对象或数组,当一个数据集合发生变化时,回调函数只会执行一次,这样可以防止多重操作的影响。 watch适用于需要执行异步操作或需要监听数据变化的场合。watchcomputed运行开销要大,因为它需要在数据发生变化时立刻运行回调函数,这样可能会导致性能问题。通常watch适用于数据变化需要执行比较复杂的操作情况。 3. Methods methods属性是Vue.js中存放方法的地方。它们可以在模板中通过v-on指令来进行调用。与computed不同的是,methods属性中的方法不会自动计算,也不会缓存。每次需要调用方法时,都需要重新运行方法。 methods适用于需要执行一些常规操作、事件的处理、绑定指令等任务。当需要在模板中执行复杂操作或有一些逻辑判断时,也可以使用methods。因为methods需要每次都重新计算运行,因此,如果该方法在模板中被多次调用,可能会导致性能问题。 综上所述,computedwatchmethods在Vue.js中各有所长,选择何种方法取决于具体的需求场景。使用computed可以提升性能,使用watch适用于需要异步处理或监听数据变化的场景,使用methods则适合处理一些常规操作事件绑定。 ### 回答3: 在 Vue 中,computedwatch methods 都是非常重要的工具,它们都有自己独特的用途作用。 Computed Computed 是一种计算属性,基于已有的数据生成新的数据并自动更新,通常用于数据计算,并将结果返回给模板使用。 Computed 应该是纯函数,依赖于数据响应式系统,只有当依赖的数据发生改变时,computed 才会重新计算。 在代码实现中,computed 的实现方法类似于一个函数,可以使用 get set 语法,也可以简写。 Watch Watch 是数据监听的一种方法,用于监听数据变化并作出相应的操作,可以监听一个或多个属性,当被监听的属性发生变化时,就会触发所声明的函数。 在声明 watch 时,需要指定其监听的数据回调函数,监听的数据可以是简单类型也可以是复杂类型,当监听的数据属性值发生变化时,watch 回调函数就会被调用,可以在回调函数中进行相应的操作。 Methods Methods 是 Vue 实例上定义的方法,可以在模板中调用它们完成特定的功能。与 computed 不同的是,methods 方法可以接受参数,通过 this 调用实例上的数据,它们是可变的而 computed 不可变。 方法的代码实现类似于一个函数,可以接受参数,可以调用实例上的数据、方法其他组件等,并在模板中通过方法来执行相应的操作。 在实际开发过程中,要灵活选择computedwatchmethods进行数据处理绑定,根据不同的需求来进行选择使用,以达到高效运行最佳性能的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值