Vue计算属性的学习笔记
本文为大家分享了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选项允许我们执行异步操作,限制我们执行该操作的频率,并在得到最终结果前,设置中间状态,这是计算属性无法做到的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 奇怪的气球膨胀 分治(说白了还是dp?)