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>