写在前面:传参的几种方式
父子组件怎样进行通信?兄弟组件又怎样通信?
一、自定义事件—子传父
1、声明自定义事件—子组件
- 开发者为自定义组件封装的 自定义事件,必须事先在 emits 节点中声明:
export default {
name: 'index-list',
emits:['select'],
}
2、绑定自定义事件—子组件
- 为子组件绑定点击事件onItemClick,在该事件中绑定(触发)自定义事件
<ul>
<li
v-for="item in group.list"
:key="item.id"
class="item"
@click="onItemClick(item)"
>
<img class="avatar" v-lazy="item.pic" alt="">
<span class="name">{{item.name}}</span>
</li>
</ul>
3、派发自定义事件—子组件
- 在 emits 节点下声明的自定义事件,可以通过this.$emit(‘自定义事件的名称’) 方法进行触发。
- 自定义事件名称为select,传入item参数(singer)
function onItemClick(item){
emit('select',item)
}
4、监听自定义事件—父组件
- 在使用自定义的组件时,可以通过== v-on==的形式 监听自定义事件 。
- 在singer组件中调用index-list,并通过v-on绑定自定义事件select,定义该事件名称为selectSinger
<div class="singer" v-loading="!singers.length">
<index-list
:data="singers"
@select="selectSinger"
>
</index-list>
<router-view :singer="selectedSinger"></router-view>
</div>
5、定义自定义事件—父组件
- 在父组件中为定义名叫selectSinger的自定义select事件
methods: {
selectSinger(singer){
this.selectedSinger =singer
this.$router.push({
path:`/singer/${singer.mid}`
})
}
}
二、props—父传子
1、父组件绑定动态数据
- 为父组件的子组件绑定动态数据:data=“singers”
<div class="singer" v-loading="!singers.length">
<index-list
:data="singers"
@select="selectSinger"
>
</index-list>
</div>
2、父组件传入数据
- 页面初始化时就调用created钩子函数给singers赋值
async created() {
const result = await getSingerList()
this.singers = result.singers
},
3、子组件接收数据
- 子组件通过props接收父组件传来的数据data(里面包含了singers)
props: {
data: {
type: Array,
default() {
return []
}
}
},
4、子组件读取数据
- 子组件通过v-for遍历即可读取数据,v-for=“group in data”
- group 是全部歌手的分类,group.list是每一组歌手数据,item是每一位歌手
<ul ref="groupRef">
<li
v-for="group in data"
:key="group.title"
class="group"
>
<h2 class="title">{{group.title}}</h2>
<ul>
<li
v-for="item in group.list"
:key="item.id"
class="item"
@click="onItemClick(item)"
>
<img class="avatar" v-lazy="item.pic" alt="">
<span class="name">{{item.name}}</span>
</li>
</ul>
</li>
</ul>
|