v-model在自定义组件上的使用
通常我们看到v-model都会想到input输入框啥的,其实不仅仅是在input上可以双向数据绑定,同时可以作用在父子组件通信上。
vue
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<link rel="stylesheet" type="text/css" href="./fontFace.css">
<script crossorigin="anonymous" integrity="sha384-+jvb+jCJ37FkNjPyYLI3KJzQeD8pPFXUra3B/QJFqQ3txYrUPIP1eOfxK4h3cKZP"
src="https://lib.baomitu.com/vue/2.6.11/vue.js"></script>
</head>
<body>
<div id="app">
<div class="details">
<my-component v-model='show' style="border:1px solid #ccc;"></my-component>
<button @click="changeValue">切换状态</button>
{{show}}
</div>
</div>
</body>
<script>
Vue.component('my-component', {
template: `<div v-if="value">
<p>默认初始值是{{value}},所以是显示的</p>
<button @click.stop="closeDiv">关闭</button>
</div>`,
props: ['value'], //这个接收值必须是value,固定的
/*props: {
value: {
type: Boolean,
default: false
},
},*/
methods: {
closeDiv() {
//触发 input 事件,并传入新值,注意,这个input是搭配v-model的固定写法
this.$emit('input', false);
}
}
})
new Vue({
el: "#app",
data() {
return {
show: true,
}
},
methods: {
changeValue() {
this.show = !this.show
}
}
})
</script>
</html>
如何改变固定属性value
上面案例中所说的子组件中接收值必须是value,其实vue.js也没有那么笨拙,修改也是可以的,只是代码就没那么清爽了,当然,value作为一个常用关键词,能规避还是规避下比较好,将上面script部分改为下面内容即可!
vue
<script>
Vue.component('my-component', {
template: `<div v-if="zdy">
<p>默认初始值是{{zdy}},所以是显示的</p>
<button @click.stop="closeDiv">关闭</button>
</div>`,
model: {
// props:设置收到父组件v-model绑定的属性名,默认就是value
prop: "zdy",
// event:设置this.$emit的事件名,默认是'input''
event: "zidingyi"
},
// props: ['value'], //这个接收值默认是value
props: {
zdy: {
type: Boolean,
default: false
},
},
methods: {
closeDiv() {
//触发 input 事件,并传入新值,注意,通过v-model方式事件名默认是'input',可以通过model去修改
// this.$emit('input', false);
this.$emit('zidingyi', false);
}
}
})
new Vue({
el: "#app",
data() {
return {
show: true,
}
},
methods: {
changeValue() {
this.show = !this.show
}
}
})
</script>
通过v-model方式特别简洁清爽,比async修饰符显得更简单
当然也可以直接在子组件内,修改v-model的值,不用this.$emit