1.父传子
Props Down
parent.vue
<template>
<div>
<h1>Props Down Parent</h1>
<child title="来自父组件的消息"></child>
</div>
</template>
<script>
import child from './Child'
export default {
components: {
child
}
}
</script>
<style>
</style>
child.vue
<template>
<div>
<h1>Props Down Child</h1>
<h2>{{ title }}</h2>
</div>
</template>
<script>
export default {
props: {
title: String
}
}
</script>
<style>
</style>
2.子传父
event up
parent.vue
在使用子组件的时候,使用v-on监听这个自定义事件
<template>
<div>
<h1 :style="{ fontSize: hFontSize + 'em'}">Event Up Parent</h1>
这里的文字不需要变化
<child :fontSize="hFontSize" v-on:enlargeText="enlargeText"></child>
<child :fontSize="hFontSize" v-on:enlargeText="enlargeText"></child>
<!-- $event接受子组件传递过来的参数 -->
<child :fontSize="hFontSize" v-on:enlargeText="hFontSize += $event"></child>
</div>
</template>
<script>
import child from './Child'
export default {
components: {
child
},
data () {
return {
hFontSize: 1
}
},
methods: {
enlargeText (size) {
this.hFontSize += size
}
}
}
</script>
<style>
</style>
child.vue
在子组件中使用$emit发布一个自定义事件
<template>
<div>
<h1 :style="{ fontSize: fontSize + 'em' }">Props Down Child</h1>
<button @click="handler">文字增大</button>
</div>
</template>
<script>
export default {
props: {
fontSize: Number,
enlargeText: Function,
},
methods: {
handler () {
this.$emit('enlargeText', 0.1)
}
}
}
</script>
<style>
</style>
3.非父子组件
Event Bus
- 创建eventbus.js 用来中转
import Vue from 'vue'
export default new Vue()
- 使用$on监听
//没有参数
bus.$on('自定义事件名称',()=>{
//执行操作
})
//有参数
bus.$on('自定义事件名称',data=>{
//执行操作
})
- 使用$emit触发
//没有自定义传参
bus.$emit('自定义事件名称');
//有自定义传参
bus.$emit('自定义事件名称',数据);
sibling01.vue
<template>
<div>
<h1>Event Bus Sibling01</h1>
<div class="number" @click="sub">-</div>
<input type="text" style="width: 30px; text-align: center" :value="value">
<div class="number" @click="add">+</div>
</div>
</template>
<script>
import bus from './eventbus'
export default {
props: {
num: Number
},
created () {
this.value = this.num
},
data () {
return {
value: -1
}
},
methods: {
sub () {
if (this.value > 1) {
this.value--
bus.$emit('numchange', this.value)
}
},
add () {
this.value++
bus.$emit('numchange', this.value)
}
}
}
</script>
<style>
.number {
display: inline-block;
cursor: pointer;
width: 20px;
text-align: center;
}
</style>
sibling02.vue
<template>
<div>
<h1>Event Bus Sibling02</h1>
<div>{{ msg }}</div>
</div>
</template>
<script>
import bus from './eventbus'
export default {
data () {
return {
msg: ''
}
},
created () {
bus.$on('numchange', (value) => {
this.msg = `您选择了${value}件商品`
})
}
}
</script>
<style>
</style>