html中的父子通信代码,在vue中详细解读父子通讯

本文详细介绍了在Vue中如何进行父子组件间的通讯,通过props将数据从父组件传到子组件,再通过$emit将子组件的事件及数据反馈给父组件。示例代码包括了父组件和子组件的实现,展示了如何利用这两个关键机制实现下拉框选择功能,以及相应的CSS样式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章主要介绍了vue 通过下拉框组件学习vue中的父子通讯的相关知识,文中涉及到了父组件,子组件的实现代码,需要的朋友可以参考下

如果说vue组件化开发中第一步应该了解的是什么的话,那无疑是父子组件之间是如何实现通讯的(说白了就是父子组件中数据是如何传递的),只有理解了这一步,才能更好的开发组件

这里先提出两个关键词: props 与 emit :

写这个组件之前,先看看效果图:

21b53e2556670093590bb6121eb7408e.png

组件开发分析:

既然是组件:首先组件内部数据内容肯定是可变的(如上图中的"按时间排序"之类的),这必须由父组件传入(即父组件如何将数据传个父组件);

在选择了内容之后,如何将数据传出来(即子组件如何将数据传给父组件)

先写结构:

父组件

import oSelect from "@/components/select.vue"; //引入组件

export default{

name: 'App',

data(){

return {

selectData: {

defaultIndex: 0, //默认选中的是第几个

selectStatus: false, // 通过selectStatus来控制下拉框的显示/隐藏

selectOptions: [ // 下拉框中的数据 name这样的参数,看项目是否有需求,可自行修改

{

name: 'time',

context: '按时间排序'

},

{

name: 'view',

context: '按浏览量排序'

},

{

name: 'like',

context: '按点赞数排序'

},

{

name: 'reply',

context: '按回复数排序'

},

{

name: 'reward',

context: '按打赏数排序'

}

]

}

}

},

methods:{

onChangeOption(index){

//子组件通过一个事件来触发onChangeOption方法,从而传递一系列参数,这里的index就是传过来的

this.selectData.defaultIndex = index;

//触发过后,动态改变了需要值

}

},

components: {

oSelect,

//注册组件

}

}

子组件

:name="selectData.selectOptions[selectData.defaultIndex].name"

:class="{'select-title-active': selectData.selectStatus}">

{{ selectData.selectOptions[selectData.defaultIndex].context }}

  • v-for="(item,index) in selectData.selectOptions"

    @click="EmitchangeOption(index)"

    :class="{'select-option-active':selectData.defaultIndex===index}">

    {{ selectData.selectOptions[index].context }}

export default{

name: 'oSelect', //建议大家都写上这个,有利于我们知道这个组件叫什么名字

//通过props来接收父组件传过来的数据

props:{

selectData: {

type: Object //规定传过来的数据为对象,否则就会报错(其实这样写就是规避错误和良好的习惯)

}

},

methods:{

EmitchangeOption(index){

this.$emit('changeOption',index);

// 通过点击事件触发EmitchangeOption函数,传入当前点击下拉列表中的索引值index

// 下拉框通过emit方法触发父组件中changeOption函数,动态传给父组件需要的数据,这里为索引值

},

changeStatus(){

// 通过changeStatus事件动态改变selectStatus的值,从而控制下拉框的显示隐藏

this.selectData.selectStatus = !this.selectData.selectStatus

}

}

}

总结从以上的示例可以看出来,父组件传入数据,需要在父组件中线绑定一个属性,挂载需要传入的数据;

子组件接收父组件的数据通过 props 方法来接收;

子组件传递数据需要使用 emit 方法来绑定父组件中事先设定好的方法,从而动态传递操作后需要的数据

最终效果如下:

7bbe6c522b2b9ad8b7b5537d5eade690.gif

附上组件中的css,仅供参考:.select-box{

position: relative;

max-width: 250px;

line-height: 35px;

margin: 50px auto;

}

.select-title{

position: relative;

padding: 0 30px 0 10px;

border: 1px solid #d8dce5;

border-radius: 5px;

transition-duration: 300ms;

cursor: pointer;

}

.select-title:after{

content: '';

position: absolute;

height: 0;

width: 0;

border-top: 6px solid #d8dce5;

border-left: 6px solid transparent;

border-right: 6px solid transparent;

right: 9px;

top: 0;

bottom: 0;

margin: auto;

transition-duration: 300ms;

transition-timing-function: ease-in-out;

}

.select-title-active{

border-color: #409eff;

}

.select-title-active:after{

transform: rotate(-180deg);

border-top-color: #409eff;

}

.select-options{

position: absolute;

padding:10px 0;

top: 45px;

border:1px solid #d8dce5;

width: 100%;

border-radius: 5px;

}

.select-option-item{

padding:0 10px;

cursor: pointer;

transition-duration: 300ms;

}

.select-option-item:hover,.select-option-active{

background: #f1f1f1;

color: #409eff;

}

.arrow-top{

position: absolute;

height: 0;

width: 0;

top: -7px;

border-bottom: 7px solid #d8dce5;

border-left: 7px solid transparent;

border-right: 7px solid transparent;

left: 0;

right: 0;

margin: auto;

z-index: 99;

}

.arrow-top:after{

content: '';

position: absolute;

display: block;

height: 0;

width: 0;

border-bottom: 6px solid #fff;

border-left: 6px solid transparent;

border-right: 6px solid transparent;

left: -6px;

top: 1px;

z-index: 99;

}

.slide-down-enter-active,.slide-down-leave{

transition: all .3s ease-in-out;

transform-origin:0 top;

transform: scaleY(1);

}

.slide-down-enter{

transform: scaleY(0);

}

.slide-down-leave-active{

transition: all .3s ease-in-out;

transform-origin:0 top;

transform: scaleY(0);

}

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值