父组件代码:
<template>
<div class="hello">
<button @click="ifShow=!ifShow">点击显示</button>
<show-alert v-model="ifShow"></show-alert>
</div>
</template>
<script>
import showAlert from ‘./showAlert.vue‘
export default {
name: ‘HelloWorld‘,
components:{
showAlert,
},
data () {
return {
ifShow:false,
}
}
}
</script>
子组件代码:
<template>
<div id="showAlert" :value="value" v-if="ifValue">
<div>showAlert 内容</div>
<button class="close" @click="ifValue=false">关闭</button>
</div>
</template>
<script>
export default{
props:{
value:{
type:Boolean,
default:false,
}
},
data:function(){
return{
ifValue:false,
}
},
watch:{
value(bool){
this.ifValue=bool;
console.log(‘bool=‘+ bool);
},
ifValue(val){
/*使用了v-model的组件会自动监听 input 事件,
* 并把这个input事件所携带的值 传递给v-model所绑定的属性,
* 这样组件内部的值就给到了父组件了
*/
this.$emit(‘input‘,val);//传值给父组件, 让父组件监听到这个变化
}
},
}
</script>
<style scoped>
.close{
background:red;
color:white;
}
</style>
实现效果:
点击显示按钮以后:
前提: this.$emit(‘input‘,data);
点击子组件关闭按钮后:
如果未加this.$emit(‘input‘,data);
点击子组件关闭按钮后:
如果未通过$emit把值传到父组件, 则父组件监听不到子组件的变化.