当前位置: 首页 > news >正文

【Vue】父子组件通信

[Vue]父子组件通信

    • 前言
    • 父组件向子组件传值
      • 法一: props
      • 法二: $parent
    • 子组件向父组件传值
      • $emit
      • $emit + .sync
      • $refs
      • v-model

前言

🚩🚩🚩
💎个人主页: 阿选不出来
💨💨💨
💎个人简介: 一名大二在校生, 不定时更新自己学习道路上的一些笔记.
💨💨💨
💎目前开发的专栏: JS 🍭Vue🍭JS进阶
💨💨💨
💎接上一篇 Vuex 五个核心

组件是 vue.js 强大的功能,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。
根据组件传递数据的方向不同,分为父组件向子组件传值,子组件向父组件传值。

为了深入理解, 我们通过一个案例来更好的理解,首先我们需要两个组件 dropdown.vue(子组件) 和 register.vue(父组件)

实战背景:

子组件是我自己写的一个下拉菜单的样式, 用于父组件中用户完成信息登记.

在这里插入图片描述
需要完成的功能有:

父组件向子组件传值(下拉菜单的内容, id值, 当前选项索引值)

子组件向父组件反映选中的内容

附上动图
在这里插入图片描述

父组件向子组件传值

法一: props

父组件

<dropdownVue :selectData="gradeList" id="grade" :current="currentgrade"></dropdownVue>
export default {
	data(){
		return {
			gradeList: [2021,2020,2019,2018],
			currentgrade: null
		}
	},
}

:selectData="gradeList" : 使用 v-bind 绑定要传给子组件的值 gradeList , 值可以是字符串, 数字, 对象, 数组…等

子组件

props声明接收的三种方式

功能: 让组件接收外部传过来的数据.

  1. 简单的声明接收

    export default {
       	...
       	props: ['selectData','current'] 
    }
    
    
  2. 接收的同时, 对数据进行类型限制

    export default {
        props: {
            selectData: Array,
            current: Number
        }
    }
    
  3. 接收的同时对数据进行类型限制,默认值的指定, 必要性的限制

    export default {
    	props: {
    		selectData:{
    			type: Array,
    			required: true  //是否是必要的
                default: ...  //默认值为多少...
    		},
            current: {
                type: Number,
                required: true,
                default: null
            }
    	}
    }
    

注意: props为单向数据流, 即父级prop的更新会向下流动到子组件, 但是反过来则不行.我们不能在子组件中修改props数据.

法二: $parent

this.$parent.grade即可获取 grade 值.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ksm7HXIO-1664793834323)(C:\Users\Lenovo\Desktop\笔记\JS\img\image-20221003165353978.png)]

子组件向父组件传值

每当下拉菜单选中的值更新时, 就在子组件中调用绑定的自定义事件,并把当前值作为参数传给父组件.

$emit

vm.$emit(eventName, [...args])

作用: 触发eventName事件, 附加参数会传给监听器回调.

父组件

<dropdownVue :selectData="gradeList" @changeData="changeGradeData"></dropdownVue>
export default {
    methods: {
        // 获取到当前所选项
		changeGradeData(value){
			this.currentGrade = value
		}
	}
}

@changeData="changeGradeData" : 给子组件绑定一个自定义事件 changeData 是事件名, changeGradeData指这个事件的具体方法.

子组件

<div class="dropdown">
  <span>{{ selectData[current] }}</span>
<div>
  <div class="my-drop-view">
  	<div class="drop-item" v-for="(item, index) in selectData" :key="index">
      <input class="drop-radio"  type="radio" :id="getSelectNum(index)" @click="setChangeData(index)" 				:checked="current==index" hidden >
      <label class="drop-label" :for="getSelectNum(index)">{{item}}</label>
    </div>
  </div>
export default {
    //在需要的地方调用父组件定义的事件
	methods: {
        changeData(value){
            this.$emit('changeData', value)
        }
    }
}

每当选项被切换时changeData事件就会被调用.

$emit + .sync

父组件

<dropdownVue :selectData="gradeList" :changeDate.sync=currentgrade></dropdownVue>

就相当于

<dropdownVue :selectData="gradeList" :current="currentgrade" @update:changeDate="value => currentgrade = value"></dropdownVue>

所以子组件内部就只需要$emit触发父组件的update:myPropName事件并且传入要改变的值val即可

子组件

 setChangeData(value){
    this.$emit('update:changeDate', Number(value))
 }

$refs

refs
通过 ref 这个 attribute 为子组件赋予一个 ID 引用
子组件

父组件通过this.$refs.gradeInput获取到 DOM 元素和子组件实例

v-model

父组件

<dropdownVue :selectData="gradeList" v-model="current"></dropdownVue>

相当于

<dropdownVue :selectData="gradeList" v-bind:current="currentgrade" @input=" value => currentgrade = value"></dropdownVue>

默认传递一个名字叫value的props数据

@input=" value => currentgrade = value" 默认监听组件内部的 input 事件, 修改绑定的数据.

子组件

props: [...,'value']
method: {
    ...
    this.$emit('input', Number(value))
}

相关文章:

  • API接口开发其实特简单,Python Flask Web 框架教程来了
  • SpringMVC03之拦截器和JSR303
  • 索引失效案例
  • 机器学习笔记 - Albumentations库实现的图像增强功能一览
  • 软考-存储系统
  • 大学生网页设计制作作业实例代码 (全网最全,建议收藏) HTML+CSS+JS
  • GAN Step By Step -- Step4 CGAN
  • HackerRank 算法刷题笔记(一),基于Go语言
  • 【Linux篇】第十三篇——信号(概念+信号的产生+阻塞信号+捕捉信号)
  • Android Jetpack系列之MVI架构
  • 十分钟之内实现stack和queue?容器适配器是什么?priority_queue不是队列?
  • 基于Keras实战项目-猫狗熊猫分类大战
  • 基于 Echarts + Python Flask 动态实时大屏( 附代码)
  • 并查集原理及模拟实现
  • 【Redis】大key的处理
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【刷算法】从上往下打印二叉树
  • centos安装java运行环境jdk+tomcat
  • ES6 学习笔记(一)let,const和解构赋值
  • Java 内存分配及垃圾回收机制初探
  • js学习笔记
  • mac修复ab及siege安装
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue全家桶实现一个Web App
  • 技术:超级实用的电脑小技巧
  • 开源SQL-on-Hadoop系统一览
  • 那些被忽略的 JavaScript 数组方法细节
  • 配置 PM2 实现代码自动发布
  • 如何设计一个比特币钱包服务
  • 实现菜单下拉伸展折叠效果demo
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • postgresql行列转换函数
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • #include
  • (003)SlickEdit Unity的补全
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (正则)提取页面里的img标签
  • (转)ObjectiveC 深浅拷贝学习
  • (转)程序员技术练级攻略
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .form文件_SSM框架文件上传篇
  • .net core开源商城系统源码,支持可视化布局小程序
  • .Net Memory Profiler的使用举例
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布