前端vue学习曲线(6)计算属性

本文深入探讨了Vue.js中计算属性(computed)与方法(methods)的使用场景及区别。计算属性基于其依赖进行缓存,只有当依赖发生变化时才会重新计算,而方法则每次调用都会执行。通过实例对比,展示了计算属性在提高应用性能方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算属性

由来:模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。

例如:

<div id="example">
    1{{ message.split('').reverse().join('') }}
    2{{ message.split('').reverse().join('') }}
</div>

计算属性表示

<div id="example">
    <p>原始消息message:"{{message}}"</p>
    <p>计算反向原始消息message:"{{reversed}}"</p>
    <p>计算反向原始消息message:"{{reversed}}"</p>
</div>
var vm = new Vue({
		el: "#example",
		data: {
			message: "Hello",
			mag1: "计算属性缓存computed",
			mag2: "方法methods"
		},
		computed: {
			//计算属性的getter
			reversed: function() {
				// `this` 指向 vm 实例
				console.log(this.mag1);
				return this.message.split('').reverse().join('');
			}
		}
	})

计算属性缓存computed VS 方法methods

计算属性缓存computed :是基于它们的响应式依赖进行缓存的。只要相关依赖改变时才会重新求值。 这就意味着只要message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。

 方法methods:不管 message 有没有发生改变,多次访问 reversedMessage 都必须执行函数。

var vm = new Vue({
		el: "#example",
		data: {
			message: "Hello",
			mag1: "计算属性缓存computed",
			mag2: "方法methods"
		},
		computed: {
			//计算属性的getter
			reversed: function() {
				// `this` 指向 vm 实例
				console.log(this.mag1);
				return this.message.split('').reverse().join('');
			}
		},
		methods: {
			reversedMessage: function() {
				// `this` 指向 vm 实例
				console.log(this.mag2);
				return this.message.split('').reverse().join('');
			}
		}
	})

例子:

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>

	<body>
		<div id="example">
			<h4>计算属性</h4>
			<p>原始消息message:"{{message}}"</p>
			<p>计算反向原始消息message:"{{reversed}}"</p>
			<h4>计算属性缓存vs方法</h4>
			<p>反向消息 message: "{{ reversedMessage() }}"</p>
			<p>
				计算属性缓存computed VS 方法methods<br /> 计算属性缓存computed :是基于它们的响应式依赖进行缓存的。只要相关依赖改变时才会重新求值。 这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。
				<br /> 方法methods:不管 message 有没有发生改变,多次访问 reversedMessage 都必须执行函数。
			</p>
		</div>

		<div id="app1">
			{{ fullName }}

		</div>
		<div id="demo">{{ fullName }}</div>
	</body>

</html>
<script>
	var vm = new Vue({
		el: "#example",
		data: {
			message: "Hello",
			mag1: "计算属性缓存computed",
			mag2: "方法methods"
		},
		computed: {
			//计算属性的getter
			reversed: function() {
				// `this` 指向 vm 实例
				console.log(this.mag1);
				return this.message.split('').reverse().join('');
			}
		},
		methods: {
			reversedMessage: function() {
				// `this` 指向 vm 实例
				console.log(this.mag2);
				return this.message.split('').reverse().join('');
			}
		}
	})

	var app1 = new Vue({
		el: "#app1",
		data: {
			firstName: 'Foo',
			lastName: 'Bar',
			fullName: 'Foo Bar'
		},
		watch: {
			firstName(val) {
				this.fullName = val + " " + this.lastName;
				console.log("firstName");
			},
			lastName: function(val) {
				this.fullName = this.firstName + " " + val;
				console.log("lastName");
			}
		}
	})

	var demo = new Vue({
		el: '#demo',
		data: {
			firstName: 'Foo',
			lastName: 'Bar'
		},
		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]
				}
			}
		}
	})
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值