vue computed计算属性
在实际的项目开发过程中,前端需要展示的数据往往需要经过一些处理。为了避免在模板中加入许多的业务逻辑,保证模板的解构清晰和可维护性,Vue.js提供了计算属性这个方法。
1 实例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
<title>Document</title>
</head>
<body>
<div id="app">
<p>{{firstName}}</p>
<p>{{lastName}}</p>
<p>{{fullName}}</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
firstName: 'zhang',
lastName: 'zf'
},
computed: {
fullName: function() {
// this指向vm实例
return this.firstName + '' + this.lastName
}
},
})
</script>
</body>
</html>
此时对vm.firstName
和vm.lastName
进行修改,始终会影响vm.fullName
。
Setter
计算属性的Setter方法,可以在更新属性时候带来便利。
例题:在实际项目中,在处理商品价格时候,后端往往会把价格定义为以分为单位在处理的整型,以避免在处理浮点类型数据时产生的问题。而前端则需要将把价格转换成元为单位来显示,而且如果需要对价钱进行修改的话,则又要把输入的价格再恢复到分传给后台。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
<title>Document</title>
</head>
<body>
<div id="app">
<p>{{price}}</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
cets: 100
},
computed: {
price: {
set: function(newValue) {
this.cets = newValue * 100
},
get: function() {
return (this.cets / 100).toFixed(2)
}
}
},
})
</script>
</body>
</html>
在使用Vue.js的计算属性后,可以将vm.cents设置为后端所存的数据,计算属性price为前端展示和更新的数据。
此时更改vm.price = 2,vm.cents会被更新为200,在传递给后端时无需再手动转化一遍数据。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
<title>Document</title>
</head>
<body>
<div id="app">
<p>{{price}}</p>
<input type="text" v-model='price'>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
cets: 200
},
computed: {
price: {
set: function (newValue) {
console.log('set',newValue * 100)
this.cets = newValue * 100
},
get: function () {
console.log('get',(this.cets / 100).toFixed(2))
return (this.cets / 100).toFixed(2)
}
}
},
mounted() {
// console.log(this.price)
// console.log(this.cets)
},
})
</script>
</body>
</html>