局部组件
- 局部组件注册在某个vue对象中,
- 只有注册过该局部组件的vue对象才能使用这个局部组件 局部组件定义:
// template仅一个根元素:ul
var msgComponent = {
// 数据是自身提供的 (hobbies)
template:`<ul><li v-for='hobby in hobbies' v-bind:key='hobby.id'>{{hobby}}</li></ul>`,
data(){
return {
hobbies:['看剧','看动漫','吃好吃的']
}
}
}
注册局部组件:
// 仅由注册过该局部组件的vue对象才能使用,此处为div#vue-app-one
// 注意命名规范,components中对象的key将会被作为标签名,多个单词拼接的命名需使用横杆法
// 可以写成msg-component,此处直接简化了命名为msg,
new Vue({
el:"#vue-app-one",
components:{
"msg": msgComponent
}
})
html文件中使用<msg></msg>:
<div id="vue-app-one">
<p>这里是vue-app-one</p>
<mycomponent></mycomponent>
<mycomponent></mycomponent>
<p>我的爱好:</p>
<msg></msg> <!--使用局部组件-->
</div>
父向子传值/传引用:prop
静态传值
动态传值:v-bind
创建子组件:
var titleComponent = {
props:["title"],
template:`<p>{{title}}</p>`
// 所需要的数据title由父组件提供
}
在父组件的components属性中注册子组件:
new Vue({
el:"#vue-app-one",
components:{
"msg": msgComponent,
"titleComponent":titleComponent
},
})
在父组件上使用子组件:
<!-- div#vue-app-one为父组件 -->
<div id="vue-app-one">
<p>这里是vue-app-one</p>
<mycomponent></mycomponent>
<mycomponent></mycomponent>
<!--使用子组件title-component,并传值"我的爱好:"给子组件-->
<title-component title="我的爱好:"></title-component>
<msg></msg>
</div>
子向父:事件传值$emit
子组件不能通过prop向父组件传递数据,需要使用事件向父组件抛出一个值,告知父组件我需要实现一个功能,由父组件处理这个事件
例子:点击按钮,改变名称chinesename(由于data变量名不支持chinese-name形式,花括号里不支持chineseName形式,所以这里我都用了小写,此处记录一下,日后学到了新知再来填坑)
先在父组件的data中定义chinesename的初始值:
new Vue({
el:"#vue-app-one",
data:{
chinesename:"anzhi" // chinesename初始值
}
})
创建子组件,并注册事件change-name(就像click事件一样,需要让系统能够辨认这是一个事件并监听,当事件被触发时,执行某项约定好的操作):
Vue.component('blog-post', {
props: ['chinesename'],
template: `
<div class="blog-post">
<h3>{{ chinesename }}</h3>
<button v-on:click='$emit("change-name","ruosu")'>
修改名字
</button>
</div>
`
// blog-post组件包含一个h3,显示chinesename,和一个按钮
// 点击这个按钮,触发change-name事件,将"ruosu"作为参数传递给指定的处理函数onChangeName
})
**在父组件中使用子组件,定义change-name的处理函数为onChangeName: **
<div id="vue-app-one">
<p>这里是vue-app-one</p>
<!-- v-bind:通过prop给子组件传递chinesename的初始值 -->
<!-- v-on:子组件通过$emit给父组件传递新的chinesename的值 -->
<div id="blog-posts-events-demo">
<blog-post
v-bind:chinesename='chinesename'
v-on:change-name = "onChangeName"
></blog-post>
</div>
</div>
**在父组件处定义事件处理函数onChangeName: **
new Vue({
el:"#vue-app-one",
data:{
chinesename:"anzhi"
},
methods:{
onChangeName:function(value){
// 将chinesename换成传递过来的数据
this.chinesename=value
}
}
})