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 相关文章推荐
javascript css在IE和Firefox中区别分析
Feb 18 Javascript
node.js中的fs.fstat方法使用说明
Dec 15 Javascript
Jquery跨域获得Json的简单实例
May 18 Javascript
超链接怎么正确调用javascript函数
May 23 Javascript
JS button按钮实现submit按钮提交效果
Nov 01 Javascript
jQuery复合事件用法示例
Jun 10 jQuery
Webpack如何引入bootstrap的方法
Jun 17 Javascript
JS实现图片预览的两种方式
Jun 27 Javascript
关于前后端json数据的发送与接收详解
Jul 30 Javascript
小程序实现多列选择器
Feb 15 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
Aug 10 Javascript
vue 动态添加class,三个以上的条件做判断方式
Nov 02 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
杏林同学录(三)
2006/10/09 PHP
给初学者的30条PHP最佳实践(荒野无灯)
2011/08/02 PHP
codeigniter教程之多文件上传使用示例
2014/02/11 PHP
php计算一个文件大小的方法
2015/03/30 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
Yii2.0中使用js异步删除示例
2017/03/10 PHP
TP5框架请求响应参数实例分析
2019/10/17 PHP
用JavaScript显示随机图像或引用
2009/04/21 Javascript
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
python实现计算倒数的方法
2015/07/11 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
python中map的基本用法示例
2018/09/10 Python
Python DataFrame.groupby()聚合函数,分组级运算
2018/09/18 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
php优化查询foreach代码实例讲解
2021/03/24 PHP
酒店led欢迎词
2014/01/09 职场文书
英文商务邀请信
2014/01/22 职场文书
初二生物教学反思
2014/02/03 职场文书
高中军训感言1000字
2014/03/01 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
跳蚤市场口号
2014/06/13 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
具结保证书范本
2015/05/11 职场文书
赞美教师的句子
2019/09/02 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
Nginx速查手册及常见问题
2022/04/07 Servers