方法一 使用.sync修飾符
element就是使用的這種方式,實現方式如下:
父組件:
-
<template>
-
<div id="demo">
-
<test-model :show.sync="showFlag"></test-model>
-
-
</div>
-
</template>
-
<script>
-
import testModel from 'src/components/testModel'
-
export default {
-
data(){
-
return{
-
showFlag: false
-
}
-
},
-
components: {
-
testModel,
-
}
-
}
-
</script>
-
-
<style lang="scss" scoped>
-
</style>
子組件:
-
<template>
-
<div v-if="show">
-
<button @click="closeShow"></button>
-
</div>
-
</template>
-
<script>
-
-
export default {
-
data(){
-
return{
-
}
-
},
-
props: ["show"],
-
methods: {
-
closeShow() {
-
this.$emit("update:show",false);
-
}
-
},
-
}
-
</script>
-
<style lang="scss" scoped>
-
</style>
子組件通過this.$emit("update:show",false); 可以直接將父組件傳過來的show值改變,從而達到顯示隱藏的目的。
方法二 使用v-model
父組件
-
<template>
-
<div id="demo">
-
<test-model v-model="show"></test-model>
-
-
</div>
-
</template>
-
<script>
-
import testModel from 'src/components/testModel'
-
export default {
-
data(){
-
return{
-
show: false
-
}
-
},
-
components: {
-
testModel,
-
}
-
}
-
</script>
-
-
<style lang="scss" scoped>
-
</style>
子組件
-
<template>
-
<div v-if="value">
-
<button @click="closeShow"></button>
-
</div>
-
</template>
-
<script>
-
-
export default {
-
data(){
-
return{
-
}
-
},
-
props: ["value"],
-
model: {
-
prop: 'value',
-
event: 'balabala'
-
},
-
methods: {
-
changeShow() {
-
this.$emit("balabala",false);
-
}
-
},
-
}
-
</script>
-
<style lang="scss" scoped>
-
</style>
官方文檔里有寫,一個組件上的 v-model
默認會利用名為 value
的 prop 和名為 input
的事件,但是像單選框、復選框等類型的輸入控件可能會將 value
特性用於不同的目的。model
選項可以用來避免這樣的沖突,所以上面的子組件里,我們用balabala來替換掉了原本的input事件,所以在$emit的時候,里面的事件名應為balabala,否則默認為input.