VueJS 3:Bare-bones $emit 与 v-if 不工作
VueJS 3: Bare-bones $emit with v-if not working
我有两个 VueJS 组件,一个 parent 和一个 child。我在这里试图实现的是一个 bare-bones emit 示例,以作为以后的文档和参考。按下一个按钮,我希望显示一条隐藏消息 (v-if)。目前,该按钮没有任何作用。
过去一个半小时我一直在寻找这个问题的答案。我查看了官方文档,在 YouTube 上以及在搜索引擎查询后似乎相关的所有地方。我的问题的答案必须非常简单,但不知何故我似乎找不到它。
Parent
<template>
<div class="home">
<img alt="Vue logo" src="../assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
<div @myEmit="handleEmit" v-if="show">
show or not
</div>
<!-- <div>abcdef</div> -->
<!-- <input type="text" @handleEmit="myEmit"> -->
</template>
<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'
export default {
name: 'HomeView',
components: {
HelloWorld
},
data () {
return {
show: false
}
},
methods: {
handleEmit () {
this.show = true;
console.log(this.show);
}
}
}
</script>
<style scoped>
.home {
background: lime !important;
}
</style>
Child
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<button @click="handleClick">Click me</button>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
emits: ['myEmit', "test"],
props: {
msg: String
},
methods: {
handleClick() {
this.$emit('myEmit');
this.$emit('test');
console.log("emit event detected");
// console.log(this.$emit);
}
}
}
</script>
<style scoped>
.hello {
background: pink;
}
</style>
@myEmit
错误地应用于您要有条件显示的 <div>
。 div
不会发出 myEmit
事件,因此永远不会调用您的事件处理程序。
解决方案是将 @myEmit
移动到 <HelloWorld>
, 会发出事件:
<HelloWorld msg="Welcome to Your Vue.js App"/>
❌ div has no myEmit event
<div @myEmit="handleEmit" v-if="show">
show or not
</div>
✅
<HelloWorld @myEmit="handleEmit" msg="Welcome to Your Vue.js App"/>
<div v-if="show">
show or not
</div>
我有两个 VueJS 组件,一个 parent 和一个 child。我在这里试图实现的是一个 bare-bones emit 示例,以作为以后的文档和参考。按下一个按钮,我希望显示一条隐藏消息 (v-if)。目前,该按钮没有任何作用。
过去一个半小时我一直在寻找这个问题的答案。我查看了官方文档,在 YouTube 上以及在搜索引擎查询后似乎相关的所有地方。我的问题的答案必须非常简单,但不知何故我似乎找不到它。
Parent
<template>
<div class="home">
<img alt="Vue logo" src="../assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
<div @myEmit="handleEmit" v-if="show">
show or not
</div>
<!-- <div>abcdef</div> -->
<!-- <input type="text" @handleEmit="myEmit"> -->
</template>
<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'
export default {
name: 'HomeView',
components: {
HelloWorld
},
data () {
return {
show: false
}
},
methods: {
handleEmit () {
this.show = true;
console.log(this.show);
}
}
}
</script>
<style scoped>
.home {
background: lime !important;
}
</style>
Child
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<button @click="handleClick">Click me</button>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
emits: ['myEmit', "test"],
props: {
msg: String
},
methods: {
handleClick() {
this.$emit('myEmit');
this.$emit('test');
console.log("emit event detected");
// console.log(this.$emit);
}
}
}
</script>
<style scoped>
.hello {
background: pink;
}
</style>
@myEmit
错误地应用于您要有条件显示的 <div>
。 div
不会发出 myEmit
事件,因此永远不会调用您的事件处理程序。
解决方案是将 @myEmit
移动到 <HelloWorld>
, 会发出事件:
<HelloWorld msg="Welcome to Your Vue.js App"/>
❌ div has no myEmit event
<div @myEmit="handleEmit" v-if="show">
show or not
</div>
✅
<HelloWorld @myEmit="handleEmit" msg="Welcome to Your Vue.js App"/>
<div v-if="show">
show or not
</div>