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 相关文章推荐
js验证表单大全
Nov 25 Javascript
用CSS+JS实现的进度条效果效果
Jun 05 Javascript
Jquery公告滚动+AJAX后台得到数据
Apr 14 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
Mar 27 Javascript
node.js中的fs.open方法使用说明
Dec 17 Javascript
深入理解jQuery事件绑定
Jun 02 Javascript
Javascript 对cookie操作详解及实例
Dec 29 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
Aug 25 Javascript
微信小程序Page中data数据操作和函数调用方法
May 08 Javascript
Vue代码整洁之去重方法整理
Aug 06 Javascript
jsonp格式前端发送和后台接受写法的代码详解
Nov 07 Javascript
vue父子组件间引用之$parent、$children
May 20 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伪静态之APACHE篇
2014/06/02 PHP
php数组随机排序实现方法
2015/06/13 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
PHP Include文件实例讲解
2019/02/15 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
一个JS的日期格式化算法示例
2013/07/31 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
微信小程序 textarea 层级过高问题简单解决方案
2019/10/14 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
Python中使用SAX解析xml实例
2014/11/21 Python
python的mysqldb安装步骤详解
2017/08/14 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
TensorFlow如何实现反向传播
2018/02/06 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
python自动化测试之异常及日志操作实例分析
2019/11/09 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
完美的中文自荐信
2014/05/24 职场文书
党支部活动策划方案
2014/08/18 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
驳回起诉裁定书
2015/05/19 职场文书
生日寿星公答谢词
2015/09/29 职场文书
2016寒假假期总结
2015/10/10 职场文书
Windows11性能真的上涨35%? 桌面酷睿i9实测结果公开
2021/11/21 数码科技
使用Redis做预定库存缓存功能
2022/04/02 Redis