Vue入门笔记Day7

本文详细讲解了Vue中如何使用is属性处理h5标签规范,子组件data的函数定义,ref的使用与父子组件数据传递,组件参数校验,原生事件绑定,以及非父子组件间通信的总线机制。深入剖析了组件开发中的关键知识点。
摘要由CSDN通过智能技术生成

1.组件使用中的细节点

(1)使用is解决h5标签的bug

h5编码规范tbody里面必须跟tr所以不能直接写成组件,有序列表与无序列表也一样,还有下拉列表等。
is属性解决:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>组件使用中的细节点 1.使用is解决h5标签的bug</title>
		<script src="../vue.js">
			
		</script>
	</head>
	<body>
		<div id="root">
			<table border="" cellspacing="" cellpadding="">
				<tbody>
					<tr is="row"></tr>
					<tr is="row"></tr>
					<tr is="row"></tr>         <!-- h5编码规范tbody里面必须跟tr所以不能直接写成row -->
				</tbody>						<!-- is属性解决 -->
			</table>
			<!-- <ol>
				<li is="row"></li>
			</ol>                                     菜单与列表一样也需要is属性解决
			<select name="">
				<option is="row"></option>
			</select> -->
		</div>
		
		<script type="text/javascript">
			Vue.component('row',{
				template:'<tr><td>this is row</td></tr>'
			})
			var vm = new Vue({
				el:'#root'
			})
		</script>
	</body>
</html>

(2)子组件定义data必须为函数

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>2.子组件定义data必须为函数</title>
		<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="root">
			<table border="" cellspacing="" cellpadding="">
				<tbody>
					<tr is="row"></tr>
					<tr is="row"></tr>
					<tr is="row"></tr>				
				</tbody>
			</table>
		</div>
		<script type="text/javascript">
			Vue.component('row',{ 
				data:function(){        //在子组件定义data必须是一个函数,不能是一个对象
					return{
						conent:'this is row'
					}
					
				},
				template:'<tr><td>{{conent}}</td></tr>'
			})
			var vm = new Vue({
			el:'#root'
		})
		</script>
		
	</body>
</html>

(3)ref使用

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>ref使用</title>
		<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="root">
			<div 
				ref='hello'   <!-- 引用的名字hello -->
				@click="handleClick"
			>
				hello word
			</div>
		</div>
		<script type="text/javascript">
				
			var vm = new Vue({
				el:'#root',
				methods:{
					handleClick:function(){
						console.log(this.$refs.hello.innerHTML)
						            // $refs.ref指的是所有的引用,里面有一个ref引用,在这里叫hello,找到hello这个引用
					}
				}
			})
		</script>
	</body>
</html>

(4)ref完成number实例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>ref使用2</title>
		<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="root">
			<counter ref="one" @change="handleChange()"></counter>
			<counter ref="two" @change="handleChange()"></counter>
			<div >
		      {{total}}
			</div>
		</div>
		<script type="text/javascript">
			Vue.component('counter',{
				template: '<div @click="handleChange">{{number}}</div>',
				data:function(){
					return {
						number:0
					}
				},
				methods:{
					handleChange:function(){
						this.number ++,
						this.$emit('change')
					}
				}
			})
			var vm = new Vue({
				el:'#root',
					
				data:{
					total: 0 
				},
				methods:{
					handleChange:function(){
						this.total = this.$refs.one.number + this.$refs.two.number
						console.log(this.$refs.one.number)
						console.log(this.$refs.two.number)
						
						
					}
				}
			})
		</script>
	</body>
</html>

(5)父组件的数据传递

父组件通过属性向子组件传递数据.

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>父组件的数据传递</title>
		<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="root"> <!-- 父组件通过属性向子组件传递数据 -->
			<counter :count="0"></counter>
			<counter :count="2"></counter>
			
		</div>
		<!-- 父组件传递过来的内容,子组件不要修改,单向数据流 -->
		<script type="text/javascript">
			var counter = {
				props:['count'],
				data:function(){  //data里面定义初始值为count的number,
				                   //因为单向数据流,count不能改变,用number代替
					return{
						number:this.count
					}
				},
				template:'<div @click="handleClick">{{number}}</div>',
				methods:{
					handleClick:function(){
						this.number++
					}
				}
			}
			
			var vm = new Vue({
				el:'#root',
				components:{
					counter:counter
				}
			})
		</script>	
	</body>
</html>


(6)子组件向父组件传值

子组件通过事件触发向父组件传值。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>父组件向子组件的数据传递</title>
		<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="root"> <!-- 父组件通过属性向子组件传递数据 -->
			<counter :count="3" @inc="handleIncrease"></counter>
			<counter :count="2" @inc="handleIncrease"></counter>
			                <!-- 监听 -->
			<div id="">
				{{total}}
			</div>
		</div>
		<!-- 父组件传递过来的内容,子组件不要修改,单向数据流 -->
		<script type="text/javascript">
			var counter = {
				props:['count'],
				data:function(){
					return{
						number:this.count
					}
				},
				template:'<div @click="handleClick">{{number}}</div>',
				methods:{
					handleClick:function(){
						this.number=this.number+2;
						this.$emit('inc',2)
						          //监听事件的名字可以随便写
						//子组件向父组件传值通过事件的方式
					}
				}
			}
			
			var vm = new Vue({
				el:'#root',
				data:{
					total:5
				},
				components:{
					counter:counter
				},
					
				methods:{
					handleIncrease:function(step){
						alert(step);      //接受到的step就是this.$emit('inc',2)后面带的2
						this.total+=step;
					}
				}
			})
		</script>	
	</body>
</html>

2.组件参数校验与非props特性

1.组件参数校验

props特性:
(1)父组件调用子组件传递了count,而子组件在props里面也声明了count。
(2)不会显示在dom属性值

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>组件参数校验与非props特性</title>
		<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="root">
			<child content="Hello word"></child>
		</div>
		
		<script type="text/javascript">
			Vue.component('child',{
				props:{
					content:{
						type:String,//类型校验
						// required:false,  组件接受的这个count属性是必传的或者不必传的,取决于后面跟得值
						// default:'default value'  当content不传的时候,显示默认值的使用
						validator:function(value){  //自定义校验器  ,value表示子组件被传入的内容
							return(value.length > 5)
						}
					},
				},
				template:'<div>{{content}}</div>'
			})
			var vm = new Vue({
				el:"#root",
				
			})
		</script>
	</body>
</html>

2.非props特性

非props特性:
(1)子组件向父组件传递了props属性,但子组件没有声明接受父组件,子组件里面无法使用count。
(2)会显示到dom属性中。

3.组件原生事件绑定

可以直接加.native表示原生事件。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>给组件绑定原生事件</title>
		<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="root">
			<child @click="handleClick"></child>  <!-- 直接绑定的事件是一个自定义的事件,不会直接触发
			<child @click.native="handleClick"></child>
						 .native事件修饰符,监听的就是原生事件了 -->
		</div>
		<script type="text/javascript">
			Vue.component('child',{
				template:'<div @click="handleChildClick">child</div>',
					
				methods:{                                
					handleChildClick:function(){     //点击click---子组件监听到自身div被点击---触发自定义事件
						this.$emit('click')         //父组件监听了click事件---handleClick会执行
					}
				}
			})
			var vm = new Vue({
				el:"#root",
				methods:{
					handleClick:function(){
						alert('click')
					}
				}
			})
		</script>
	</body>
</html>

4.非父子组件间的传值

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>非父子组件间的传值(总线机制)(Bus/总线/发布订阅模式/观察者模式)</title>
		<script src="../vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="root">
			<child content="Dell" ></child>
			<child content="Lee"></child>
			
		</div>
		<script type="text/javascript">
			Vue.prototype.bus = new Vue()
			// Vue的prototype上挂载bus,指向Vue实例,
			// 之后调用new Vue或创建组件的时候,每一个组件上都会有bus属性
			//也就是在Vue这一类上挂载了bus
			Vue.component('child',{
				data:function(){
						
					return{
					selfContent:this.content
					}
				},
				props:{
					content:String
				},
				template:'<div @click="handleClick">{{selfContent}}</div>',
				methods:{
					handleClick:function(){
						alert(this.selfContent)
						this.bus.$emit('change',this.selfContent)
					},
				},
				mounted:function(){
					var this_=this
					this.bus.$on('change',function(msg){
						alert(msg),
						this_.selfContent =msg
					})
				}
			})
			
			var vm = new Vue({
				el:'#root'
			}) 
		</script>
	</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值