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 相关文章推荐
写了10年的Javascript也未必全了解的连续赋值运算
Mar 25 Javascript
javascript 通用loading动画效果实例代码
Jan 14 Javascript
详解JavaScript的流程控制语句
Nov 30 Javascript
node.js使用cluster实现多进程
Mar 17 Javascript
ECMAScript6快速入手攻略
Jul 18 Javascript
概述jQuery的元素筛选
Nov 23 Javascript
javascript中的面向对象
Mar 30 Javascript
详解Angular 4.x NgTemplateOutlet
May 24 Javascript
vue的diff算法知识点总结
Mar 29 Javascript
详解Vue源码学习之双向绑定
Apr 10 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
Apr 25 Javascript
vue实现折线图 可按时间查询
Aug 21 Javascript
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
php 购物车完整实现代码
2014/06/05 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
动态Axios的配置步骤详解
2018/01/12 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
Vue动态创建注册component的实例代码
2019/06/14 Javascript
JavaScript中0、空字符串、'0'是true还是false的知识点分享
2019/09/16 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
2020/11/17 Vue.js
js面向对象方式实现拖拽效果
2021/03/03 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
Python爬取三国演义的实现方法
2016/09/12 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
TensorFlow损失函数专题详解
2018/04/26 Python
python使用phoenixdb操作hbase的方法示例
2019/02/28 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
工厂厂长岗位职责
2013/11/08 职场文书
预备党员转正考核材料
2014/06/03 职场文书
生产车间标语
2014/06/11 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
行政介绍信范文
2015/05/04 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL