vue 通过下拉框组件学习vue中的父子通讯


Posted in Javascript onDecember 19, 2017

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

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

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

vue 通过下拉框组件学习vue中的父子通讯 

组件开发分析:

既然是组件:

  • 首先组件内部数据内容肯定是可变的(如上图中的"按时间排序"之类的),这必须由父组件传入(即父组件如何将数据传个父组件);
  • 在选择了内容之后,如何将数据传出来(即子组件如何将数据传给父组件)

先写结构:

父组件

<!--下拉框父组件-->
<template>
 <div id="app">
  <oSelect @changeOption="onChangeOption" :selectData="selectData"></oSelect>
  <!--
  selectData: 传入父组件需要传入的数据;格式:childDataName="parentDataName";
  onChangeOption: 子组件触发的事件名,通过触发一个事件从而来接收子组件的传过来的数据
  格式:@childEventName="parentEventName"
  注:可写多个
  -->
 </div>
</template>
<script>
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,
  //注册组件
 }
}
</script>

子组件

<template>
<!-- 下拉框组件html结构(子组件) -->
<div class="select-box" @click="changeStatus">
<!-- changeStatus事件: 点击实现下拉框的显示和隐藏 -->
<h3 class="select-title"
 :name="selectData.selectOptions[selectData.defaultIndex].name"
 :class="{'select-title-active': selectData.selectStatus}"> 
 <!--属性name class的动态绑定-->
 {{ selectData.selectOptions[selectData.defaultIndex].context }} 
 <!--这里主要绑定选择的数据-->
</h3>
<transition name="slide-down">
<!--transition 实现下拉列表显示隐藏时的动画-->
<ul class="select-options" v-show="selectData.selectStatus">
 <li class="select-option-item" 
  v-for="(item,index) in selectData.selectOptions"
  @click="EmitchangeOption(index)"
  :class="{'select-option-active':selectData.defaultIndex===index}">
  <!--
   v-for:循环数据渲染下拉列表
   EmitchangeOption:点击下拉列表事件
   class:动态绑定被选中的数据
  -->
  {{ selectData.selectOptions[index].context }}
  
 </li>
 <div class="arrow-top"></div>
</ul> 
</transition> 
</div> 
</template>
<script>
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
  }
 }
}
</script>

总结

  • 从以上的示例可以看出来,父组件传入数据,需要在父组件中线绑定一个属性,挂载需要传入的数据;
  • 子组件接收父组件的数据通过 props 方法来接收;
  • 子组件传递数据需要使用 emit 方法来绑定父组件中事先设定好的方法,从而动态传递操作后需要的数据

最终效果如下:

vue 通过下拉框组件学习vue中的父子通讯 

附上组件中的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;
}
<!--箭头css-->
.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 通过下拉框组件学习vue中的父子通讯,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript设置首页和收藏页面的小例子
Nov 11 Javascript
jquery实现上下左右滑动的方法
Feb 09 Javascript
JS 对象(Object)和字符串(String)互转方法
May 20 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
May 31 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
Jul 04 Javascript
分分钟玩转Vue.js组件
Oct 25 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
Jun 23 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
Aug 15 Javascript
layui表格分页 记录勾选的实例
Sep 02 Javascript
Layui给switch添加响应事件的例子
Sep 03 Javascript
Vue+abp微信扫码登录的实现代码示例
Jan 06 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
Sep 04 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
Dec 19 #Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
Dec 19 #Javascript
jQuery实现弹窗下底部页面禁止滑动效果
Dec 19 #jQuery
基于node.js实现微信支付退款功能
Dec 19 #Javascript
React Native之prop-types进行属性确认详解
Dec 19 #Javascript
响应式框架Bootstrap栅格系统的实例
Dec 19 #Javascript
vue.js element-ui validate中代码不执行问题解决方法
Dec 18 #Javascript
You might like
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
Yii框架函数简单用法分析
2019/09/09 PHP
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
老生常谈JavaScript 正则表达式语法
2016/08/20 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
JS中Map和ForEach的区别
2018/02/05 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
2019/02/28 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
基于vuex实现购物车功能
2021/01/10 Vue.js
python3简单实现微信爬虫
2015/04/09 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
怎样自定义一个异常类
2016/09/27 面试题
英语专业毕业生自荐信
2013/10/28 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
护林防火标语
2014/06/27 职场文书
2014年科研工作总结
2014/12/03 职场文书
国王的演讲观后感
2015/06/03 职场文书
茶花女读书笔记
2015/06/29 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
html实现弹窗的实例
2021/06/09 HTML / CSS