vue 通过下拉框组件了解Vue中父子组件通讯_vue 下拉框向子组件_深谷逸风的博客-程序员宝宝

技术标签: vue动画  vue  父子组件通信  emit  

最近很忙,一直没有时间写文章,接下来的时间,主要通过写一些vue组件的小例子,然后认识到vue中的一些知识,让大家都学会vue框架的使用

了解父子组件的通信,使vue组件化开发的第一步,所以这点很重要,希望这篇文章能后帮助你了解到父子组件中是如何通信的

<!--父组件-->
<template>
<oSelect @changeOption="onChangeOption" :selectData="selectData"></oSelect>
<!--
*父组件向组件传递参数首先要在父组件中绑定特定的参数,如:selectData;他等于数据selectData
*这个数据便是我们要传给子组件的数据
-->
</template>
<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>
<!--子组件-->
<template>
<div class="select-box" @click="changeStatus">
    <h3 class="select-title"
        :name="selectData.selectOptions[selectData.defaultIndex].name"
        <!--
            这一步主要是传递选择的值
        -->
        :class="{'select-title-active': selectData.selectStatus}"> 
        <!--
            selectData.selectStatus根据此值的改变来联动是否含有class:select-title-active
        -->
        {
   { selctData.selectOptions[selectData.defaultIndex].context }} 
    </h3>
    <transition name="slide-down">
    <!--
        这里做一个下拉上拉的动画,主要是为了体验更好
    -->
    <ul class="select-options" v-show="selectData.selectStatus">
        <!--
            根据selectData.selectStatus的值来改变下拉框的显示隐藏
        -->
        <li class="select-option-item" 
            v-for="(item,index) in selectData.selectOptions"
            @click="EmitchangeOption(index)"
            <!--
                点击时讲当前的索引值(index)传出去
            -->
            :class="{'select-option-active':selectData.defaultIndex===index}">
            <!--
                判断selectData.defaultIndex是否等于当前index,来增加被选中元素的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); 
            //changeOption为父组件中绑定的属性名字,一定要一致
            //改变选择的索引之后,传递个父组件
            //记住,子组件传数据给父组件使用 $emit
        },
        changeStatus(){
            this.selectData.selectStatus = !this.selectData.selectStatus
            //取反,来改变当前this.selectData的值
        }
    }
}
</script>

最后效果如下

这里写图片描述


项目中的css,仅供参考吧

<!--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;
}

<!--下拉动画的css-->
.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的存在,一切都是数据的交互,好了,今天的文章就讲到这里了

想要了解更多的前端知识,请扫描下面二维码或者搜索微信公众号【大前端js】添加公众号;

这里写图片描述

手打不易,原创不易,转载时请注明转载出处,谢谢

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_22557797/article/details/78723082

智能推荐

xmos固件u8_XMOS USB数字界面 模块 XU208 U8升级版CPL_weixin_39991935的博客-程序员宝宝

数字界面 模块 xCORE-200 全新XMOS界面 U8升级版,采用第二代XMOS芯片 XU208 开发的高端USB界面,也是支持固件升级的界面。原理图和固件(包括XMOS和CPLD)都是我们自主开发的,不是公版的。目前C-1有货全新升级,默认出货均为飞秒级晶振。 飞秒级是指晶振的短期稳定性,通常用相位噪声或者抖动值表示。一般的晶振抖动参数都采用ps表示,但是当抖动值低于1PS的时候,就采用飞...

README.md编写教程(基本语法)_子钦加油的博客-程序员宝宝

一、标题写法:第一种方法:1、在文本下面加上 等于号 = ,那么上方的文本就变成了大标题。等于号的个数无限制,但一定要大于0个哦。。2、在文本下面加上 下划线 - ,那么上方的文本就变成了中标题,同样的 下划线个数无限制。3、要想输入=号,上面有文本而不让其转化为大标题,则需要在两者之间加一个空行。另一种方法:(推荐这种方法;注意️中间需要有一个空格)关于标题还有等级表示...

[JZOJ6023]【GDOI2019模拟2019.2.16】烤仓鼠【贪心】【Trie】_6023. 【gdoi2019模拟2019.2.16】烤仓鼠_BAJim_H的博客-程序员宝宝

DescriptionSolution考虑如何求出那个最小值显然我们可以求出全部数中二进制最高的不同位,答案的那一位肯定是1,那一位相同的数相邻可以随便放。这样可以将全部数分成0的集合和1的集合,把一个集合中的数扔进Trie,再用另外一个集合的数去跑,就可以求出答案了。接下来我们考虑贪心构造方案此时我们相当于有两个完全图,然后这两个完全图之间有一些边,我们要找一条字典序最小的哈密尔...

PostgreSQL 日志跟踪_pgsql 日志_xcagy的博客-程序员宝宝

当 log_statement=all 和 log_min_duration_statement 同时设置时,将跟踪所有语句,忽略log_min_duration_statement 设置。log_min_duration_statement = 5000 #milliseconds,记录执行5秒及以上的语句。log_rotation_size = 10240 #kb,文件多大后创建新的文件记录日志。log_statement = all #需设置跟踪所有语句,否则只能跟踪出错信息。

android 学习基础篇---开发环境的搭建 Eclipse SDK jdk ADT_测试sdk是否安装成功_RuizeMa的博客-程序员宝宝

<br /><br />转自:http://hi.baidu.com/caijian5219999/blog/item/6c741ce483b2583ab8382077.html<br />1.环境安装准备 知识扫盲<br />1》jak 1.5 或者jdk 1.6   java开发的编译环境<br />2》eclipse   3.4     java开发的IDE<br />3》Android sdk 3.0  android的编译器 (Software Development Kit, 即软件开发工具包

随便推点

python2.7安装scrapy_2016 python 2.7 win7 安装 scrapy 及遇到的大坑_夏末的回忆的博客-程序员宝宝

Windows 平台:我的系统是 Win7,首先,你要有Python,我用的是2.7.11版本,Python3相仿,只是一些源文件不同。1.安装Python安装过程我就不多说啦,我的电脑中已经安装了 Python 2.7.11 版本啦,安装完之后记得配置环境变量,比如我的安装在D盘,D:\python2.7.11,就把以下两个路径添加到Path变量中1D:\python27;D:\python27...

经典SQL语句集锦_sql数据集锦_yangxn的博客-程序员宝宝

 经典SQL语句集锦下列语句部分是MsSql语句,不可以在access中使用。SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)首先,简要介绍基础语句:1、说明:创建数据库CREATE DATABAS

Win7 python2.7 Scrapy的安装_贾瑞德的博客-程序员宝宝

Win7 python2.7 Scrapy的安装参考网络上Scrapy的安装教程,现总结Win7系统和python2.7环境下scrapy的安装过程。1 安装python2.7从python2.7.11官方下载,它集成了常见的模块,如numpy、pip。安装完成之后,将C:\python27\Scripts;C:\python27;添加到环境变量里。2 安装pywin32在这里下载pywin32,需

Linux之Shell脚本中 [eq] [ne] [gt] [lt] [ge] [le]_꧁刘向洋꧂的博客-程序员宝宝

-eq //等于-ne //不等于-gt //大于-lt //小于ge //大于等于le //小于等于

webpack用plugin打包html文件时报错npm ERR! Failed at the [email protected] build script. npm ERR!...._阿卤ⁿ的博客-程序员宝宝

webpack用plugin打包html文件时报错npm ERR! Failed at the [email protected] build script. npm ERR!..上图:下载完html-webpack-plugin后进行相应配置,结果突然报错原因是因为下载了最新的版本太高的问题,千万package.json中查询所下载的html-webpack-plugin的版本,将其改成3.2.0的版本,然后在终端重新npm install 一下就好了...

ANDROID音频系统散记之一:A2dpAudioInterface_如果 查看 android a2dp codec_eilianlau的博客-程序员宝宝

写在之前本来有打算写写Android音频系统的,但是仔细研究了如下链接的三篇文章,果断中断了我的想法。毫不夸张来说,这是我看过的最好的阐述Android音频系统的文章了,简练精辟,将音频系统各个方面的重要的脉络都描述出来了。有这三篇文章,理解Android音频系统何止加快了10倍。Android Audio System 之一:AudioTrack如何与AudioFlinger交换音频数据

推荐文章

热门文章

相关标签