深入浅析Vue中的 computed 和 watch


Posted in Javascript onJune 06, 2018

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>

下面在看下computed 和 watch

  都可以观察页面的数据变化。当处理页面的数据变化时,我们有时候很容易滥用watch。 而通常更好的办法是使用computed属性,而不是命令是的watch回调。

/*html:
  我们要实现 第三个表单的值 是第一个和第二个的拼接,并且在前俩表单数值变化时,第三个表单数值也在变化
  */
<div id="myDiv">
  <input type="text" v-model="firstName">
  <input type="text" v-model="lastName">
  <input type="text" v-model="fullName">
</div>
<!--js: 用watch方法来实现-->
//将需要watch的属性定义在watch中,当属性变化氏就会动态的执行watch中的操作,并动态的可以更新到dom中 
 new Vue({
 el: '#myDiv',
 data: {
  firstName: 'Foo',
  lastName: 'Bar',
  fullName: 'Foo Bar'
 },
 watch: {
  firstName: function (val) {
   this.fullName = val + ' ' + this.lastName
  },
  lastName: function (val) {
   this.fullName = this.firstName + ' ' + val
  }
 }
})
<!--js: 利用computed 来写-->
  //计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会重新求值。
  //这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。
 new Vue({
    el:"#myDiv",
      data:{
        firstName:"Den",
        lastName:"wang",
      },
      computed:{
        fullName:function(){
          return this.firstName + " " +this.lastName;
        }
      }
  })

  很容易看出 computed 在实现上边的效果时,是更简单的。

总结

以上所述是小编给大家介绍的Vue中的 computed 和 watch,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
TextArea设置MaxLength属性最大输入值的js代码
Dec 21 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
Nov 19 Javascript
js采用concat和sort将N个数组拼接起来的方法
Jan 21 Javascript
深入理解setTimeout函数和setInterval函数
May 20 Javascript
Bootstrap 附加导航(Affix)插件实例详解
Jun 01 Javascript
浅谈移动端之js touch事件 手势滑动事件
Nov 07 Javascript
jquery.pager.js实现分页效果
Jul 29 jQuery
Layui给switch添加响应事件的例子
Sep 03 Javascript
vue+element树组件 实现树懒加载的过程详解
Oct 21 Javascript
vue 微信扫码登录(自定义样式)
Jan 06 Javascript
vue-resource post数据时碰到Django csrf问题的解决
Mar 13 Javascript
jQuery实现的分页插件完整示例
May 26 jQuery
详解创建自定义的Angular Schematics
Jun 06 #Javascript
vue组件实现进度条效果
Jun 06 #Javascript
Express的HTTP重定向到HTTPS的方法
Jun 06 #Javascript
vue组件实现可搜索下拉框扩展
Oct 23 #Javascript
微信小程序实现美团菜单
Jun 06 #Javascript
详解express + mock让前后台并行开发
Jun 06 #Javascript
vue element项目引入icon图标的方法
Jun 06 #Javascript
You might like
php实现memcache缓存示例讲解
2013/12/04 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
Js中sort()方法的用法
2006/11/04 Javascript
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
jquery中ajax学习笔记一
2011/10/16 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
浅谈使用MVC模式进行JavaScript程序开发
2015/11/10 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
2016/03/25 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
JS文件上传神器bootstrap fileinput详解
2021/01/28 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
详解Python字符串切片
2019/05/20 Python
Python3内置模块pprint让打印比print更美观详解
2019/06/02 Python
python itchat给指定联系人发消息的方法
2019/06/11 Python
安装完Python包然后找不到模块的解决步骤
2020/02/13 Python
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
法雷奥SQA(electric)面试问题
2016/01/23 面试题
我的动漫时代的创业计划书范文
2014/01/27 职场文书
单身联谊活动方案
2014/01/29 职场文书
踏青活动策划方案
2014/08/19 职场文书
如何写早恋检讨书
2014/09/10 职场文书
个人四风问题整改措施
2014/10/24 职场文书
2015年教师工作总结范文
2015/03/31 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
Python语言中的数据类型-序列
2022/02/24 Python