<div id = "example"> {{ message.split('').reverse().join('')}} </div>在这个地方,模板不再是简单的声明式逻辑。开发人员必须看一段时间才能意识到,这里是想显示变量 message 的翻转字符串。当开发人员在模板中的多处包含此翻转字符串时,就会更加难以处理。
<div id="app"> <p>基本属性 message: {{ message }}</p> <p>计算属性 reversedMessage: {{ reversedMessage }}</p> </div> <script type="text/javascript"> const vm = new Vue({ el: '#app', data: { message: 'Hello' }, computed: { //计算属性的getter reversedMessage: function() { // 'this' 指向 vm 实例 return this.message.split('').reverse().join(''); } } }); </script>在上面的代码中声明了一个计算属性 reversedMessage,并且定义了一个函数,将这个计算属性赋给这个函数,相当于 vm.reversedMessage 计算属性的 getter() 函数。可以直接通过这个函数获取计算属性 reversedMessage 的值。
console.log(vm.reversedMessage); // => 'olleH' vm.message = 'Goodbye'; console.log(vm.reversedMessage); // => 'eybdooG'开发人员可以打开浏览器的控制台,自行修改例子中的 vm。vm.reversedMessage 的值始终取决于 vm.message 的值,如果单独修改 vm.reversedMessage 的值,控制台会提示计算属性不能设置值,因为没有 setter() 方法。需要说明一下,计算属性默认只有 getter() 方法,而没有 setter() 方法,所以这样直接改变计算属性的值会抛出异常,但是计算属性是可以添加 setter() 方法的。
<div id="app"> firstName: <input type="text" v-model="firstName"><br/> lastName: <input type="text" v-model="lastName"><br/> fullName: <input type="text" v-model="fullName"><br/> </div> <script type="text/javascript"> const vm = new Vue({ el: '#app', data: { firstName: '', lastName: '' }, computed: { fullName: { get: function() { return this.firstName + ' ' + this.lastName; }, set: function(newValue) { let names = newValue.split(' '); this.firstName = names[0]; this.lastName = names[1]; } } } }); </script>这样就可以在控制台直接给 fullName 计算属性赋予新的值了,如 vm.fullName='zhao liu'。
<div id="app"> <div> <p>计算属性:<br/> {{ computedNow }}<br/> </p> <p>方法:<br/> {{ methodNow() }}<br/> </p> </div> </div> <script type="text/javascript"> const vm = new Vue({ el: '#app', methods: { methodNow: function() { console.log("调用了 methodNow 方法"); return Date.now(); } }, computed: { computedNow: function() { console.log("执行了 computedNow 计算属性"); return Date.now(); } } }); </script>但是如果在 View 中同时绑定多次计算属性和方法,则虽然它们的显示效果一样,但是查看控制台时会发现计算属性函数中的打印语句只执行了一次,而函数中的打印语句执行了多次(每绑定一次就执行一次),代码如下:
<div id="app"> <div> <p>计算属性:<br/> {{ computedNow }}<br/> {{ computedNow }}<br/> {{ computedNow }}<br/> </p> <p>方法:<br/> {{ methodNow() }}<br/> {{ methodNow() }}<br/> {{ methodNow() }}<br/> </p> </div> </div> <script type="text/javascript"> const vm = new Vue({ el: '#app', methods: { methodNow: function() { console.log("调用了 methodNow 方法"); return Date.now(); } }, computed: { computedNow: function() { console.log("执行了 computedNow 计算属性"); return Date.now(); } } }); </script>其原因是 computed 属性是基于它们的响应式依赖进行缓存的。也就是说,计算属性会将它们计算的值保存在缓存,只有当它们依赖的响应式数据发生改变后,计算属性才会重新计算,否则就直接从缓存中获取值进行渲染,而方法不一样,每次调用都执行一次。
本文链接:http://task.lmcjl.com/news/17198.html