18 vue之组件通信
vue之组件通信
1 组件通信
1 组件通信 1 父子组件传值 (props down, events up) 2 父传子之属性验证props:{name:Number}Number,String,Boolean,Array,Object,Function,null(不限制类型) 3 事件机制a.使用 $on(eventName) 监听事件b.使用 $emit(eventName) 触发事件 4 Ref<input ref="mytext"/> this.$refs.mytext 5 事件总线var bus = new Vue();* mounted生命周期中进行监听
2 父子通信之父传子:通过自定义属性
父组件定义:name:'dzg', age:18 子组件绑定:<global :myname="name" :myage="age">global> 子组件注册:props:['myname','myage'] 子组件使用:<h1>我是父组件传过来的name----->{{myname}}h1> <h1>我是父组件传过来的age----->{{myage}}h1>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>全局组件title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js">script>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js">script>
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
head>
<body>
<div id="box">
<global :myname="name" :myage="age">global>
div>
body>
<script>
// 定义全局组件
Vue.component('global', {
template: `
<div>
<h1>我是全局组件</h1>
<h1>我是父组件传过来的name----->{{myname}}</h1>
<h1>我是父组件传过来的age----->{{myage}}</h1>
<button @click="handleClick">点我--{{name}}</button>
<hr>
<child></child>
</div>
`,
data() {
return {
}
},
methods: {
handleClick() {
alert('666')
}
},
props:['myname','myage']
})
let vm = new Vue({
el: '#box',
data: {
name:'dzg',
age:18
},
})
script>
html>
2.1 属性验证
props是对象,不是列表
props:{
myname:String,
isshow:Boolean,
},
案例:
<html lang="en"> <head> <meta charset="UTF-8"> <title>Titletitle> <script src="js/vue.js">script> head> <body> <div id="box"> <navbar myname="egon" :isshow="false">navbar> <navbar myname="egon" isshow="false">navbar> div> body> <script> Vue.component('navbar', { template: ` <div> <button>返回</button> 父组件传递的内容是:{{myname}} 传入的布尔是{{isshow}} <button>主页</button> <br> </div> `, // props:['myname'], props:{ myname:String, isshow:Boolean, }, }) var vm = new Vue({ el: '#box', data: {}, }) script> html>
3 父子通信之子传父:通过事件
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>父子通信之子传父title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js">script>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js">script>
<script src="https://unpkg.com/axios/dist/axios.min.js">script>
head>
<body>
<div id="box">
<global v-show="isShow" @myevent="handleShow">global>
div>
body>
<script>
// 定义全局组件
Vue.component('global', {
template: `
<div>
<h1>我是子组件</h1>
<button @click="handleClick">点我消失</button>
<hr>
<child></child>
</div>
`,
data() {
return {
show:false
}
},
methods: {
handleClick() {
//触发myevent的执行,把子组件中的变量b,传入到事件对应的方法上
this.$emit('myevent',this.show)
}
},
})
let vm = new Vue({
el: '#box',
data: {
isShow:true
},
methods:{
handleShow(show){
this.isShow=show
}
}
})
script>
html>
课堂案列
1.父传子案列(自定义属性)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="./js/vue.js">script>
head>
<body>
<div class="app">
<input type="text" v-model="myText">---->{{myText}}
<children :mytext="myText" :toast="true" aa="true">children>
div>
body>
<script>
var vm = new Vue({
el: '.app',
data: {
myText: ''
},
components: {
'children': {
template: `
<div>
<h3 style="background: red">{{mytext}}</h3>
<h2>{{toast}}</h2>
<hr>
<button @click="handleClick">点我看美女</button>
</div>
`,
data() {
return {}
},
created() {
console.log("我创建了")
},
methods: {
handleClick() {
alert(this.mytext)
}
},
// props: ['mytext','toast'] // 数组中写自定义属性的名字,在data中不需要再写mytext
props: {
mytext: String, // myText必须是字符串
toast: Boolean, // 必须是布尔
},
}
},
})
script>
html>
2.子传父(自定义事件)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="./js/vue.js">script>
head>
<body>
<div class="app">
<child @han="handleClick">child>
<hr>
{{myText}}
div>
body>
<script>
Vue.component('child', {
template: `
<div>
<button>返回</button>
<span>{{name}}</span>
<button @click="handleC">把name传到父组件</button>
</div>
`,
data() {
return {
name: '我是子组件的name'
}
},
methods: {
handleC() {
// 会触发该组件身上的han事件对应的函数执行,参数依次传入
this.$emit('han', this.name,'lqz')
}
}
})
var vm = new Vue({
el: '.app',
data: {
myText: ''
},
methods: {
handleClick(a,b) {
this.myText = a
console.log(b)
}
}
})
script>
html>
通过子传父控制子组件的隐藏
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="./js/vue.js">script>
head>
<body>
<div class="app">
<h1>通过父组件的变量控制h1>
<button @click="handleShow">我在父组件中,点我,显示隐藏下面的组件button>
<br>
<br>
<child v-show="show">child>
<hr>
<h1>通过子组件的事件控制h1>
<child v-show="show" @show="show1">child>
div>
body>
<script>
Vue.component('child', {
template: `
<div>
<button>返回</button>
<span>{{name}}</span>
<button @click="handleC">点我隐藏</button>
</div>
`,
data() {
return {
name: '我是子组件的name'
}
},
methods:{
handleC(){
this.$emit('show',false) // 第一个参数是自定义事件名字,后面参数是自定义事件对应的函数的参数
}
}
})
var vm = new Vue({
el: '.app',
data: {
show: true
},
methods: {
handleShow() {
this.show = !this.show
},
show1(b){
this.show=b
}
}
})
script>
html>