Vue计算属性的学习笔记


Posted in Javascript onMarch 22, 2017

本文为大家分享了Vue计算属性的学习笔记,供大家参考,具体内容如下

①模板内的表达式实际上只用于简单的运算,对于复杂逻辑,使用计算机属性。

②基础例子:

<div id = "example"> 
 <p>Original message:"{{message}}"</p> 
 <p>Computed reversed message:"{{reversedMessage}}"</p> 
</div>
var vm = new Vue({ 
 el:"#example", 
 data:{ 
 message:"Hello" 
 }, 
 computed:{ 
 //a computed getter 
 reversedMessage:function(){ 
  //'this' points to the vm instance 
  return this.message.split('').reverse().join('') 
 } 
 } 
})

这里我们声明了一个计算机属性reversedMessage,我们提供的函数将用作属性vm.reversedMessage的getter。

③计算机缓存 vs Methods

可以通过调用表达式中的method来达到同样的效果:

<p>Reversed message:"{{reversedMessage}}"</p>
//in component 
methods:{ 
 reversedMessage:function(){ 
 return this.message.split('').reverse()/join('') 
 } 
}

可以将同一个函数定义为一个method而不是一个计算机属性。对于最终的结果,两种方式确实是相同的。然而不同的计算机属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会重新求值,这就意味着只要message还没有改变,多次访问reversedMessage计算属性会立即返回之前的计算结果,而不必再次执行函数。
下面的计算属性将不再更新,因为Date.now()不是响应式依赖:

computed:{ 
 now:function(){ 
 return Date.now() 
 } 
}

只要发生重新渲染,method调用总会执行该函数。

④computed属性 vs watch属性

<div id= "demo">{{fullName}}</div>

watch:

var vm = new Vue({ 
 el:"#demo", 
 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 
 } 
 } 
})

computed:

var vm = new Vue({ 
 el:'#demo', 
 data:{ 
 firstName:'Foo', 
 lastName:'Bar' 
 }, 
 computed:{ 
 fullName:function(){ 
  return this.firstName + ' ' + this.lastName 
 } 
 } 
})

⑤计算setter:

计算属性默认只有getter,不过在需要是可以提供一个setter:

// ... 
computed: { 
 fullName: { 
 // getter 
 get: function () { 
  return this.firstName + ' ' + this.lastName 
 }, 
 // setter 
 set: function (newValue) { 
  var names = newValue.split(' ') 
  this.firstName = names[0] 
  this.lastName = names[names.length - 1] 
 } 
 } 
} 
// ...

在运行vm.fullName = 'John Doe'时,setter会被调用,vm.firstName和vm.lastName  也相应的会被更新。

⑥观察watchers

    当想要在数据变化相应时,执行异步操作或开销较大的操作,这是很有用的。

<div id="watch-example"> 
 <p> 
 Ask a yes/no question: 
 <input v-model="question"> 
 </p> 
 <p>{{ answer }}</p> 
</div>
<script src="https://unpkg.com/axios@0.12.0/dist/axios.min.js"></script> 
<script src="https://unpkg.com/lodash@4.13.1/lodash.min.js"></script> 
<script> 
var watchExampleVM = new Vue({ 
 el: '#watch-example', 
 data: { 
 question: '', 
 answer: 'I cannot give you an answer until you ask a question!' 
 }, 
 watch: { 
 // 如果 question 发生改变,这个函数就会运行 
 question: function (newQuestion) { 
  this.answer = 'Waiting for you to stop typing...' 
  this.getAnswer() 
 } 
 }, 
 methods: { 
 // _.debounce 是一个通过 lodash 限制操作频率的函数。 
 // 在这个例子中,我们希望限制访问yesno.wtf/api的频率 
 // ajax请求直到用户输入完毕才会发出 
 // 学习更多关于 _.debounce function (and its cousin 
 // _.throttle), 参考: https://lodash.com/docs#debounce 
 getAnswer: _.debounce( 
  function () { 
  var vm = this 
  if (this.question.indexOf('?') === -1) { 
   vm.answer = 'Questions usually contain a question mark. ;-)' 
   return 
  } 
  vm.answer = 'Thinking...' 
  axios.get('https://yesno.wtf/api') 
   .then(function (response) { 
   vm.answer = _.capitalize(response.data.answer) 
   }) 
   .catch(function (error) { 
   vm.answer = 'Error! Could not reach the API. ' + error 
   }) 
  }, 
  // 这是我们为用户停止输入等待的毫秒数 
  500 
 ) 
 } 
}) 
</script>

 在这个示例中,使用watch选项允许我们执行异步操作,限制我们执行该操作的频率,并在得到最终结果前,设置中间状态,这是计算属性无法做到的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery实现弹出窗口中切换登录与注册表单
Jun 05 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
Aug 31 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
Jan 21 Javascript
精通JavaScript的this关键字
May 28 Javascript
详解Sea.js中Module.exports和exports的区别
Feb 12 Javascript
基于easyui checkbox 的一些操作处理方法
Jul 10 Javascript
深入理解 webpack 文件打包机制(小结)
Jan 08 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
May 14 Javascript
浅析vue-router中params和query的区别
Dec 24 Javascript
使用vue实现一个电子签名组件的示例代码
Jan 06 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
Mar 31 Javascript
Vue router安装及使用方法解析
Dec 02 Vue.js
Angular2实现自定义双向绑定属性
Mar 22 #Javascript
Bootstrap如何激活导航状态
Mar 22 #Javascript
Bootstrap超大屏幕的实现代码
Mar 22 #Javascript
Bootstrap缩略图的创建方法
Mar 22 #Javascript
JS+DIV实现的卷帘效果示例
Mar 22 #Javascript
Bootstrap页面标题Page Header的实现方法
Mar 22 #Javascript
javascript实现滑动解锁功能
Mar 22 #Javascript
You might like
使用Apache的rewrite技术
2006/06/22 PHP
PHP中的超全局变量
2006/10/09 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
使用phpstorm和xdebug实现远程调试的方法
2015/12/29 PHP
JS 自动安装exe程序
2008/11/30 Javascript
JavaScript 继承详解(四)
2009/07/13 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
Express.JS使用详解
2014/07/17 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
jquery实现炫酷的叠加层自动切换特效
2015/02/01 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
简单谈谈Python流程控制语句
2016/12/04 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
python实现键盘输入的实操方法
2019/07/16 Python
Python常用外部指令执行代码实例
2020/11/05 Python
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
优秀本科生求职推荐信
2014/02/24 职场文书
2015年元旦活动总结
2014/05/09 职场文书
食品安全演讲稿
2014/09/01 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
关于JavaScript回调函数的深入理解
2021/06/27 Javascript
Redis实现分布式锁的五种方法详解
2022/06/14 Redis