其实这个错误与Vue关系不大,是由渲染元素的机制导致的,由于html在渲染时按照代码顺序从上到下进行渲染。
<script>
new Vue({
el:'.box',
data:{
}
})//此时会引起报错
Vue.component("weixinuser",{
template:`
<div>{{message}}</div>
`,
data(){
return{
message:""
}
},
beforeMount(){
bus.$on("weixinmessage",data=>
this.message=data
)
}
})
var bus=new Vue();
Vue.component("weixinauthor",{
template:`
<div>
<input v-model="content"/>
<button @click="submit()">发布</button>
</div>
`,
data(){
return {
content:""
}
},
methods:{
submit(){
bus.$emit("weixinmessage",this.content)
}
}
})
</script>
渲染组件标签会有一个从内到外的过程,在实例化外部的Vue对象时,如果还没有定义组件(类比变量使用前需要先定义),就有可能导致找不到这个组件的注册信息。
正确的定义方法:
<script>
Vue.component("weixinuser",{
template:`
<div>{{message}}</div>
`,
data(){
return{
message:""
}
},
beforeMount(){
bus.$on("weixinmessage",data=>
this.message=data
)
}
})
var bus=new Vue();
Vue.component("weixinauthor",{
template:`
<div>
<input v-model="content"/>
<button @click="submit()">发布</button>
</div>
`,
data(){
return {
content:""
}
},
methods:{
submit(){
bus.$emit("weixinmessage",this.content)
}
}
})
new Vue({
el:'.box',
data:{
}
})
</script>
(!–先注册后使用)
(!–先渲染内部再渲染外部)