首页 > 其他分享 >Vue 2x 系列之(八)计算属性

Vue 2x 系列之(八)计算属性

时间:2024-02-28 12:57:49浏览次数:22  
标签:Vue firstName lastName 2x 计算 data 属性

计算属性【computed】

1. 姓名案例

1.1 {{}}插值语法版本

<body>
	<div id="root">
		姓:<input type="text" v-model="firstName"/>
		名:<input type="text" v-model="lastName"/> 
		<hr />
		全名:{{firstName.slice(0,3)}}-{{lastName}}
	</div>
	<script type="text/javascript">
		//阻止 vue 在启动时生成生产提示。
		Vue.config.productionTip = false	
		
		const vm = new Vue({
			el: "#root",
			data(){
				return{
					firstName:'',
					lastName:''
				}
			}
		})
	</script>
</body>

注:firstName.slice(0,3)截取指定区间的字符串

​ 这种方式的缺点是如果业务逻辑比较复杂【这里的firstName.slice(0,3)仅仅是简单的业务逻辑】,表达式将变得难读,违背了Vue的“模板中简单的表达式”这个原则。

参考:https://v2.cn.vuejs.org/v2/style-guide/#模板中简单的表达式强烈推荐

1.2 methods版本

基于插值语法版本的缺点,对案例进行改进,使用methods进行封装实现

methods中定义的方法既可以作为事件的回调函数使用,也可以作为方法被调用

作为事件的回调函数使用时,如果不进行传参,那么小括号写不写都可以,比如@click="showInfo"

但用在插值语法中作为方法被调用时,即时不进行传参,也必须写小括号,比如{{showInfo()}}

一旦data中的数据发生改变,Vue会重新解析模板,解析过程中如果遇到插值语法中调用了方法的情况,被调用的方法就会重新执行

<body>
	<div id="root">
		姓:<input type="text" v-model="firstName"/>
		名:<input type="text" v-model="lastName"/> 
		<hr />
		全名:{{fullName()}}
		<!-- Vue不会去解析getMsg方法内部是否引用了data中的属性,只要data属性发生了变化,该方法就会被重新调用 -->
		测试:{{getMsg()}}
	</div>
	<script type="text/javascript">
		//阻止 vue 在启动时生成生产提示。
		Vue.config.productionTip = false	
		
		const vm = new Vue({
			el: "#root",
			data(){
				return{
					firstName:'',
					lastName:''
				}
			},
			methods: {
				fullName(){
					//这里的this是Vue实例,通过访问Vue实例的属性就可以访问到data中对应的属性【数据代理】
					return this.firstName + '-' + this.lastName
				},
				getMsg(){
					console.log('getMsg执行了')
					return 'hhh'
				}
			}
		})
	</script>
</body>

​ 这种方式将业务逻辑封装到method中,面对复杂的逻辑也变得易读,但会存在效率的问题

1.3 计算属性版本

Vue实例的各个配置项之间(如:el、data、methods...)是不会冲突的

Vue认为data中写的东西都是属性

计算属性:拿着data中已有的属性进行加工计算生成一个全新的属性,生成的这个新属性就是计算属性

Vue中,属性和计算属性是分开存放的,属性放在data配置项中,计算属性放在computed配置项中

Vue实例的_data中是没有计算属性的

计算属性是通过计算data中的属性得到值之后直接加到Vue实例身上的,只要是Vue实例身上的,模板中就可以直接读到,就是说,使用计算属性直接读就可以了

计算属性是没有具体值的,因为它的值是现算的

计算属性:
		1.定义:要用的属性不存在,要通过已有属性计算得来。
		2.原理:底层借助了Objcet.defineproperty方法提供的getter和setter。
		3.get函数什么时候执行?
					(1).初次读取时会执行一次。
					(2).当依赖的数据发生改变时会被再次调用。
		4.set函数什么时候执行? 当fullName【计算属性】被修改时。
		5.优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。
		6.备注:
				1.计算属性最终会出现在vm上,直接读取使用即可。
				2.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据【get方法中依赖的属性】发生改变。
<body>
	<div id="root">
		姓:<input type="text" v-model="firstName"/>
		名:<input type="text" v-model="lastName"/> 
		<hr />
		全名:{{fullName}}
	</div>
	<script type="text/javascript">
		//阻止 vue 在启动时生成生产提示。
		Vue.config.productionTip = false	
		
		const vm = new Vue({
			el: "#root",
			data:{
				firstName:'',
				lastName:''
			},
			computed:{
				fullName:{
					get(){
						console.log('get excute')
						return this.firstName + '-' + this.lastName
					},
					set(value){
						const arr = value.split('-')
						this.firstName = arr[0]
						this.lastName = arr[1]
					}
				}
			}
		})
	</script>
</body>

2. 计算属性的简写形式

如果一个计算属性只考虑读取,不考虑修改,也就是说只会用到该计算属性的getter,就可以使用简写形式

//完整写法
computed:{
	fullName:{
		get(){
			console.log('get excute')
			return this.firstName + '-' + this.lastName
		},
		set(value){
			const arr = value.split('-')
			this.firstName = arr[0]
			this.lastName = arr[1]
		}
	}
},
//简写形式
computed:{
	fullName:function(){
		console.log('get excute');
		return this.firstName + '-' + this.lastName;
	}
},
//最终简写形式
computed:{
	fullName(){
		console.log('get excute');
		return this.firstName + '-' + this.lastName;
	}
}

标签:Vue,firstName,lastName,2x,计算,data,属性
From: https://www.cnblogs.com/wzzzj/p/18039946

相关文章

  • Vue 2x 系列之(七)事件处理
    事件处理1.事件的基本使用模板只能用到对应Vue实例中的数据和方法,像这里的showInfo,模板中是调不到的所有被Vue管理的函数【methods对象中的函数】不能写成箭头函数,只能写成普通函数,否则,函数中的this就不再是Vue实例,而是Window对象只有配置在data中的内容才会做数据代理和数......
  • Vue 2x 系列之(六)数据代理
    数据代理1.Object.defineProperty【ES6中的知识点】用于给一个对象添加/定义属性,可以对追加的属性进行很多高级的限制【比如控制属性是否可以枚举、修改、删除】Object.defineProperty方法在Vue中的应用数据劫持数据代理计算属性Object.defineProperty方法的几个参数:给......
  • Vue 2x 系列之(五)理解MVVM
    理解MVVMMVVM模型 1.M:模型(Model):data中的数据 2.V:视图(View):模板代码 3.VM:视图模型(ViewModel):Vue实例观察发现: 1.data中所有的属性,最后都出现在了vm身上。 2.vm身上所有的属性及Vue原型上所有属性,在Vue模板中都可以直接使用。把开发人员从繁琐的DOM......
  • Vue 2x 系列之(四)数据绑定
    数据绑定Vue中有2种数据绑定的方式: 1.单向绑定(v-bind):数据只能从data流向页面。 2.双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data。【通俗:数据变,页面变;页面变,数据变】 备注: 1.双向绑定一般都应用在表单类【输入类,有value属性的标签才可以用,因为v-mode......
  • Vue 2x 系列之(三)模板语法
    模板语法容器里的代码被称为【Vue模板】,模板语法就是指模板的代码中可以写哪些Vue语法【类似:{{name}}】插值语法:把指定的值放在指定的位置。插值语法往往用于指定标签体内容。指令语法:Vue指令所在的属性值会作为JavaScript表达式执行v-bind:用于给标签中的任意一个属性动态的......
  • Vue 2x 系列之(一)简介
    Vue简介1.Vue是什么?一套用于构建用户界面的渐进式JavaScript框架。​ 构建用户界面:将拿到的数据通过某种办法变成用户可以看到的界面。​ 渐进式:从一个轻量而又小巧的核心库逐渐递进到使用各式各样的Vue插件库【Vue可以自底向上逐层的应用】2.谁开发的?React、Angular3.......
  • Python面向对象,类属性,实例属性,类方法,实例方法,静态方法的区别及用法详解
    一.前言在Python的面向对象编程中,类属性和实例属性是两个不同的概念,它们在作用域和使用方式上有所区别。在Python中的面向对象编程中有三种方法:实例方法、类方法和静态方法,它们之间的差异主要体现在参数传递和调用方式上。二.面向对象-类属性和实例属性1.区别在Pyth......
  • SpringBoot 2x 系列之(七)web场景
    web场景1.SpringMVC自动配置概览SpringBootprovidesauto-configurationforSpringMVCthatworkswellwithmostapplications.(大多场景我们都无需自定义配置)Theauto-configurationaddsthefollowingfeaturesontopofSpring’sdefaults:InclusionofCont......
  • SpringBoot 2x 系列之(五)开发技巧
    开发技巧1.Lombok1.应用场景简化JavaBean的开发帮我们在编译时生成get、set、toString方法2.安装及使用引入依赖【SpringBoot已经做了版本仲裁】<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></depende......
  • SpringBoot 2x 系列之(四)自动配置
    自动配置1.引导加载自动配置类见SpringBoot1.md一、SpringBoot入门4.2主程序类,主入口类【自动配置原理】1.1@SpringBootConfiguration见SpringBoot1.md一、SpringBoot入门4.2主程序类,主入口类【自动配置原理】[email protected]@AutoConfi......