• Vue15 计算属性VS监视属性(侦听属性)


    计算属性VS监视属性(侦听属性)

    computed和watch之间的区别:
    1.computed能完成的功能,watch都可以完成。
    2.watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作
    两个重要的小原则:
    1.所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。
    2.所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象。

    监视属性实现

    DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8" />
    		<title>姓名案例_watch实现title>
    		
    		<script type="text/javascript" src="../js/vue.js">script>
    	head>
    	<body>
    		
    		
    		<div id="root">
    			姓:<input type="text" v-model="firstName"> <br/><br/>
    			名:<input type="text" v-model="lastName"> <br/><br/>
    			全名:<span>{{fullName}}span> <br/><br/>
    		div>
    	body>
    
    	<script type="text/javascript">
    		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    
    		const vm = new Vue({
    			el:'#root',
    			data:{
    				firstName:'张',
    				lastName:'三',
    				fullName:'张-三'
    			},
    			watch:{
    				firstName(val){
    					setTimeout(()=>{
    						console.log(this)
    						this.fullName = val + '-' + this.lastName
    					},1000);
    				},
    				lastName(val){
    					this.fullName = this.firstName + '-' + val
    				}
    			}
    		})
    	script>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    计算属性实现

    DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8" />
    		<title>姓名案例_计算属性实现title>
    		
    		<script type="text/javascript" src="../js/vue.js">script>
    	head>
    	<body>
    		
    		<div id="root">
    			姓:<input type="text" v-model="firstName"> <br/><br/>
    			名:<input type="text" v-model="lastName"> <br/><br/>
    			全名:<span>{{fullName}}span> <br/><br/>
    		div>
    	body>
    
    	<script type="text/javascript">
    		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    
    		const vm = new Vue({
    			el:'#root',
    			data:{
    				firstName:'张',
    				lastName:'三',
    			},
    			computed:{
    				//完整写法
    				/* fullName:{
    					get(){
    						console.log('get被调用了')
    						return this.firstName + '-' + this.lastName
    					},
    					set(value){
    						console.log('set',value)
    						const arr = value.split('-')
    						this.firstName = arr[0]
    						this.lastName = arr[1]
    					}
    				} */
    				//简写
    				fullName(){
    					console.log('get被调用了')
    					return this.firstName + '-' + this.lastName
    				}
    			}
    		})
    	script>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    区别

    用计算属性实现上述功能,比较简单。但是如果想要实现当姓改变时,延迟一秒在改变姓名的值,则必须使用监视属性的写法。
    如果用计算属性,以下写法是错误的

    DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8" />
    		<title>姓名案例_计算属性实现title>
    		
    		<script type="text/javascript" src="../js/vue.js">script>
    	head>
    	<body>
    		
    		<div id="root">
    			姓:<input type="text" v-model="firstName"> <br/><br/>
    			名:<input type="text" v-model="lastName"> <br/><br/>
    			全名:<span>{{fullName}}span> <br/><br/>
    		div>
    	body>
    
    	<script type="text/javascript">
    		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    
    		const vm = new Vue({
    			el:'#root',
    			data:{
    				firstName:'张',
    				lastName:'三',
    			},
    			computed:{
    				//完整写法
    				/* fullName:{
    					get(){
    						console.log('get被调用了')
    						return this.firstName + '-' + this.lastName
    					},
    					set(value){
    						console.log('set',value)
    						const arr = value.split('-')
    						this.firstName = arr[0]
    						this.lastName = arr[1]
    					}
    				} */
    				//简写
    				fullName(){
    					//错误写法 注意 注意 注意,因为fullName没有return了
    					console.log('get被调用了')
    					setTimeout(()=>{
    						return this.firstName + '-' + this.lastName
    					},1000);					
    				}
    			}
    		})
    	script>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
  • 相关阅读:
    若依微服务项目部署流程+日志链路
    Elasticsearch、Kibana以及Java操作ES 的快速使用
    【C++】string类的模拟实现
    计算机组成原理(九)
    上手阿里低代码引擎lowcode-engine
    文件管理:目录管理
    idea启动报错javac <options> <source files>
    【数据集】Maple-IDS——网络安全恶意流量检测数据集
    不使用oh-my-zsh配置轻量级zsh环境
    MindFusion.Diagramming 6.8.4 Crack
  • 原文地址:https://blog.csdn.net/Rockandrollman/article/details/133827068