计算属性与监听器

计算属性

当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新

<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
<script>
var vm = new Vue({
el: '#example',
data: {message: 'Hello'},
computed: {
// 计算属性的 getter
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
})
</script>

计算属性 & 方法

<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Reversed message: "{{ reversedMessage() }}"</p>
</div>
<script>
var vm = new Vue({
el: '#example',
data: {message: 'Hello'},
methods: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
})
</script>
  1. 计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。1. 计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。
  2. 相比之下,每当触发重新渲染时,调用方法将总会再次执行函数。

计算属性 & 监听属性

<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
<script>
var vm = new Vue({
el: '#example',
data: {message: 'Hello',reversedMessage: 'olleH',},
watch: {
// 计算属性的 getter
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
})
</script>
  1. 简单逻辑的运算通常更好的做法是使用计算属性而不是命令式的 watch 回调。
  2. 使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。

计算属性的setter

<div id="demo">
<input v-model="fullName"/>
<p>{{firstName}} -- {{lastName}}</p>
</div>
<script>
var vm = new Vue({
el: '#demo',
data: {firstName: 'Foo',lastName: 'Bar'},
computed: {
fullName: {
get:function () {return this.firstName + ' ' + this.lastName},
set:function (newValue) {
let arr = newValue.split(' ');
[this.firstName,this.lastName]=arr
}
}
}
})
</script>

监听器

虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

<script src="https://cdn.jsdelivr.net/npm/axios@0.12.0/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.13.1/lodash.min.js"></script>
<div id="watch-example">
<p>Ask a yes/no question:<input v-model="question"></p>
<p>{{ answer }}</p>
</div>
<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, oldQuestion) {
this.answer = 'Waiting for you to stop typing...'
this.debouncedGetAnswer()
}
},
created: function () {
// `_.debounce` 是一个通过 Lodash 限制操作频率的函数。防抖动
this.debouncedGetAnswer = _.debounce(this.getAnswer, 500)
},
methods: {
getAnswer: function () {
if (this.question.indexOf('?') === -1) {
this.answer = 'Questions usually contain a question mark. ;-)';
return;
}
this.answer = 'Thinking...' //中间状态
var vm = this
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
})
}
}
})
</script>

最新文章

  1. Unity实现滑页嵌套(解决ScrollRect嵌套冲突问题)
  2. 十一个行为模式之模板方法模式(Template Method Pattern)
  3. JDBC连接数据库(数据源的方式)
  4. webGL
  5. django 快速实现注册
  6. 【CodeForces 624D】Array GCD
  7. JS一个根据时区输出时区时间的函数
  8. EXEL表格读取 按键精灵
  9. int、bigint、smallint 和 tinyint
  10. 【BZOJ1875】【矩阵乘法】[SDOI2009]HH去散步
  11. 转载&gt;&gt;&gt;Jpgraph图表
  12. 【Unity Shaders】Mobile Shader Adjustment—— 什么是高效的Shader
  13. Unity 关于AssetBundle读取场景
  14. python 练习4
  15. commons-lang3工具类学习(二)
  16. 创建本地SVN版本库以及将SVN导入GIT
  17. asp.net 重写URL方法和封装好的DLL
  18. 第二十九天- socketserver模块 ftp上传
  19. LINUX下IDEA等工具调试项目时提示:Unable to open debugger port
  20. html to pdf小工具,支持evernote导出的html和firefox插件scrapbook

热门文章

  1. ES6的总结的一些数组、字符串方法
  2. java 注解基础
  3. pip设置镜像
  4. 计算机视觉——SSD和YOLO简介
  5. 常见报错——Uncaught TypeError: document.getElementsByClassName(...).addEventListener is not a function
  6. firefox 利用 Selenium IDE 对 DBackup 进行自动化测试
  7. ThreadMBean
  8. Java包机制 与Javados 命令
  9. 解决Google翻译不能用的问题
  10. Vue 双向绑定