核心提示:vue通过下拉框组件了解Vue中父子组件通讯,本文主要通过写一些vue组件的小例子,然后认识到vue中的一些知识,让大家都学会vue框架的使用。 了解父子组件的通信,使vue组件化开发的第一步,所以这...
vue通过下拉框组件了解Vue中父子组件通讯,本文主要通过写一些vue组件的小例子,然后认识到vue中的一些知识,让大家都学会vue框架的使用。
了解父子组件的通信,使vue组件化开发的第一步,所以这点很重要,希望这篇文章能后帮助你了解到父子组件中是如何通信的
<script> import oSelect from "@/components/select.vue"; export default{ name: 'App', data(){ return { selectData: { defaultIndex: 0,//默认显示索引值 selectStatus: false,//下拉框是否出现 selectOptions: [ //下拉框中的数据 { name: 'time', context: '按时间排序' }, { name: 'view', context: '按浏览量排序' }, { name: 'like', context: '按点赞数排序' }, { name: 'reply', context: '按回复数排序' }, { name: 'reward', context: '按打赏数排序' } ] } } }, methods:{ onChangeOption(index){ /**此处的形参,就是子组件传过来的参数**/ this.selectData.defaultIndex = index; //通过默认索引的改变,来改变选择的数据 } }, components: { oSelect } } </script>
:class="{'select-title-active': selectData.selectStatus}"> {{ selctData.selectOptions[selectData.defaultIndex].context }}
<script>> export default{ name: 'oSelect', props:{ // 子组件接收父组件传过来的值,使用props selectData: { type: Object //传过来的必须是对象 } }, methods:{ EmitchangeOption(index){ this.$emit('changeOption',index); //changeOption为父组件中绑定的属性名字,一定要一致 //改变选择的索引之后,传递个父组件 //记住,子组件传数据给父组件使用 $emit }, changeStatus(){ this.selectData.selectStatus = !this.selectData.selectStatus //取反,来改变当前this.selectData的值 } } } </script>
最后效果如下
项目中的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); }
其实使用vue这类mvvm框架主要的思想,就是忘记DOM的存在,一切都是数据的交互。