单向数据流
Prop 是单向绑定的:当父组件的属性变化时,将传递给子组件,但是反过来不会。这是为了防止子组件无意间修改了父组件的状态,来避免应用的数据流变得难以理解。
另外,每次父组件更新时,子组件的所有 prop 都会更新为最新值。这意味着你不应该在子组件内部改变 prop。如果你这么做了,Vue 会在控制台给出警告。
注意在 JavaScript 中对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组,在子组件内部改变它会影响父组件的状态。 message:{val:""}
<body>
<div id="app">
<father></father>
</div>
<template id="father">
<div>
<input type="text" v-model="msg.value">
<hr>
<son :msg="msg"></son>
</div>
</template>
<template id="son">
<div>
<input type="text" v-model="msg.value">
</div>
</template>
</body>
<script>
Vue.component("father",{
template:"#father",
data(){
return {
msg:{ //父组件可以将msg这个地址引用传递子组件,此时,子组件修改数据,父组件也跟着修改
value:"father"
}
}
},
components:{
son:{
props:["msg"],
template:"#son"
}
}
})
new Vue({
el:"#app"
})
</script>
组件间的数据调用
组件、实例对象上有这样的属性:$parent,$children,$root,
这样的话,就形成了viewmodel链(关系链),
理论上来说,任何两个组件之间的数据都可以互相调用,获取
缺点:如果组件很多的话,写出来的代码会很乱
<body>
<div id="app">
<aaa></aaa>
</div>
<!--创建组件a-->
<template id="aaa">
<div>
<p>这是A组件...</p>
<input type="text" v-model="msg">
<hr>
<bbb :msg="msg"></bbb>
</div>
</template>
<!--创建组件b-->
<template id="bbb">
<div>
<input type="text" v-model="ownMsg">
</div>
</template>
</body>
<script>
Vue.component("aaa",{
template:"#aaa",
data(){
return {
msg:"hello"
}
}
})
Vue.component("bbb",{
template:"#bbb",
props:["msg"],
computed:{
ownMsg:{
get(){
return this.msg
},
set(val){
//希望父组件aaa的msg变成val
// this.msg = val
this.$parent.msg = val
}
}
}
})
var vm = new Vue({
el:"#app"
})
</script>
v-model 可以用在组件通信?
可以的。在组件上面使用v-model指令,相当于绑定了value属性与监听input事件。