【前端面试题之Vue篇】(1)父子组件通信方式Props/$emit

2023-11-12


前言

此篇说明了如何利用props和$emit对父子组件通信,父子组件之间的通信还有ref / $refs、provide/ inject等方式,后面继续进行说明。


一、父组件向子组件传值

1.Props定义

单向数据流:所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。

另外,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

2. Props 用法

当我看到面试题的示例,只看到父组件如何写的代码,子组件写的代码,并且尝试了运行起来看看是如何传值的,控制台会出现很多问题。下面我就总结下如何在vue里面使用父子组件通信:

(1)路由里注册父子组件

方式一

// 路由文件——index.js
import Son from '../components/son.vue'
import Father from '../components/father.vue'

const routes = [
{ 
    path: '/father',
    name: 'Father',
    component: Father,
    redirect: '/son',
    children:[
      { path: '/son',name: 'Son',component: Son}
    ]   
  },
]

方式二

{
    path: '/father',
    name: 'father',
    component: resolve => require(['@/components/father.vue'], resolve),
    children: [
      {
        path: '/son',
        name:"son",
        component: resolve => require(['@/components/son.vue'], resolve),
      },  
    ]
  },

刚开始方式一相比于方式二写路由的作用在哪里并不了解,参考了其他博主的文章,作用如下:如果用import引入的话,当项目打包时路由里的所有component都会打包在一个js中,造成进入首页时,需要加载的内容过多,时间相对比较长。
当你用require这种方式引入的时候,会将你的component分别打包成不同的js,加载的时候也是按需加载,只用访问这个路由网址时才会加载这个js。

(2)父组件里引入子组件,并且注册子组件

这里插入一下router-link的概念,因为当我们想在一个父组件中点击了子组件,像a链接一样跳转到指定目标地址,就可以用到router-link。

router-link组件支持用户在具有路由功能的应用中点击导航。通过to属性指定目标地址,默认渲染为带有正确连接的a标签,可以通过配置tag属性生成别的标签。另外,当目标路由成功激活时,链接元素自动设置一个表示激活的css类名

router-link组件的属性有:
to 、replace、 append、 tag、 active-class、 exact 、 event、 exact-active-class

正式说明在父组件里面怎么写:
(1)引入子组件
(2)注册子组件
(3)使用子组件,绑定父组件中的数据,可向子组件进行传值
注意:组件中的数据共有三种形式:data、props、computed。

// 父组件——father.vue
<template>
    <div id="app">
        <!-- 若想要将子组件具有像a链接一样,点击它之后,则跳转到指定目标地址。则可以利用router-link>
        <router-link to="/father/son"> -->
            <Son :fatherData="fatherData"></Son> // 3.使用子组件,并绑定父组件的数据
        <!-- </router-link>	 -->
  	</div>
</template>

<script>
import Son from './son.vue'//1.引入子组件

export default {
  data () {
      return{
           fatherData:[
	        {
	          id:1,
	          title:'德莱文'
	        },
	          {
	          id:2,
	          title:'辛德拉'
	        },
	          {
	          id:3,
	          title:'火男'
	        },
	          {
	          id:4,
	          title:'男刀'
	        },
	          {
	          id:5,
	          title:'女坦'
	        },
	          {
	          id:6,
	          title:'泽丽'
	        }
	      ]
      }
  
  },
  components: {
    Son //2.注册子组件
  },
}
</script>

(3)子组件利用props接受父组件传过来的值

// 子组件
<template>
  <div>
    <p v-for="item in fatherData" :key="item.id">{{item.title}}</p>
  </div>
</template>

<script>
export default {
  name:'Users',
  // 使用props 来接受父组件传过来的数据
  props:['fatherData'],
}
</script>

(4)展示

在这里插入图片描述
可以看到父组件里的fatherData数据传给了子组件的props,并在父组件中渲染出了子组件(p标签就是子组件里面使用的)。

二、子组件向父组件传值

1. $emit 定义

Vue 3 现在提供一个 emits 选项,和现有的 props 选项类似。这个选项可以用来定义一个组件可以向其父组件触发的事件。

2. $emit 用法

(1)路由里注册父子组件

与上述方法类似

(2)子组件利用$emit向父组件传值

//子组件
<template>
  <h1 @click="changeTitle">{{title}}</h1>
</template>

<script>
export default {
  name:'Son',
  data() {
    return {
      title:"我是子组件的标题"
    }
  },
  methods:{
    changeTitle(){
      this.$emit("titleChanged","现在我从子组件传过来了") // 参数1:自定义事件名称;参数2:子组件向父组件传递的值“现在我从子组件传过来了”。
    }
  }
}
</script>

(3)父组件里引入子组件;注册子组件;使用子组件时,需要绑定子组件传递事件。

<template>
    <div id="father">
        <Son v-on:titleChanged="updateTitle"></Son> //3.使用子组件
        <h2>{{title}}</h2>
    </div>
</template>

<script>
import Son from './son.vue'//1.引入子组件
export default {
    name:'father',
    components:{Son},//2.注册子组件
    data(){
        return{
            title:"我是父组件的标题"
        }
    },
    methods:{
        updateTitle(e){
            this.title = e
        }
    }
    
}
</script>

(4)展示

在这里插入图片描述

可以看到刚开始父组件中title的值是“我是父组件的标题”,点击后,变成“现在我从子组件传过来了”。


参考链接
【VUE】父子组件通讯
<router-link>属性详解
vue-router嵌套路由

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【前端面试题之Vue篇】(1)父子组件通信方式Props/$emit 的相关文章

随机推荐

  • Python二级--三国演义分词

    三国演义分词 1 题目一 概述 三国演义 是中国古典四大名著之一 曹操是其中主要人物 考生文件夹下文件data txt给出 三 国演义 简介 问题1 请编写程序 用Python语言中文分词第三方库jieba对文件data txt进行分词 并
  • Flutter SingleChildScrollView要点

    知识要点 SingleChildScrollView类似Android中的ScrollView 只接收一个子组件 SingleChildScrollView this scrollDirection Axis vertical 滚动方向 默
  • Springboot中如何打印sql信息和sql参数信息呢?

    转自 Springboot中如何打印sql信息和sql参数信息呢 下文笔者讲述SpringBoot中设置配置文件 使其可打印出sql信息及参数信息的方法分享 实现思路 springboot打印sql信息及参数 我们可采用修改applicat
  • python:openpyxl基础操作(一):创建.xlsx文件

    目录 前言 安装openpyxl 创建 xlsx文件 添加单元格内容 单个添加 多个添加 增删单元格 遍历表格中的值 合并拆分单元格 前言 本文仅供个人学习记录 复习所用 探索过程中难免出现差错和纰漏 如文中有错误 以及可以改进的地方 还请
  • python中的utils模块_python常用方法utils

    always 目录里主要封装了一些自己常用的方法 1 doc2txt 本函数主要目的是方便在写爬虫的时候遇到word附件 下载后直接提取出文本文件 注意 需要安装antiword mac下 brew install antiword 2 f
  • vue3组件通信方式一

    目录 props 父组件给子组件传递数据 子组件获取父组件传递数据 方式1 子组件获取父组件传递数据 方式2 案例 自定义事件 原生DOM事件 自定义事件 案例 全局事件总线 v model useAttrs 不管是vue2还是vue3 组
  • yolov3测试自己的数据

    yolov3测试自己的数据 前言 上一篇我已经介绍了利用yolov3预训练权重文件 只包含卷积层 并训练 只需要进行如下编译 darknet detector train cfg voc data cfg yolov3 cfg darkne
  • macOS 虚拟桌面黑屏(转)

    转自 macOS重置虚拟桌面 macOS 虚拟桌面黑屏 有几次出现如图的情况 以为是iTerm的问题 但是在关闭软件 重启之后 依旧无效 后面经过网友告知 才知道是虚拟桌面的问题 为了清理这个问题 有以下两种方法 法一 在终端输入以下命令
  • VC++闪退的两种解决方式(1然后选择“开始执行(不调试)“,也就是ctrl+F5;2system(“pause“);)

    这几天将开发集成环境换成了vs2010 刚开始用 有些地方不是很懂 通过查阅相关文档 现得以解决 就拿VS2010 调试窗口一闪而过解决方法如下 cpp view plain copy include
  • DAY2:leetcode977有序数组的平方 209 长度最小的子数组 59螺旋矩阵

    一 双指针法 O n 时间复杂度 有序数组的平方 一维数组初始化 vector
  • RTP时间戳概念

    RTP协议不依赖于底层协议 由于UDP包的快速 时实性高的特点 它通常和UDP结合在一起 作为UDP的上层载体数据的形式传播 typedef struct rtp header t uint32 t v 2 protocol version
  • Python基础(3)——PyCharm介绍

    Python基础 3 PyCharm介绍 文章目录 Python基础 3 PyCharm介绍 课程目标 一 PyCharm的作用 二 下载和安装 2 1 下载 2 2 安装 三 PyCharm基本使用 3 1 新建项目 3 2 新建文件并书
  • Qt::UserRole的作用

    Qt UserRole相当于一个索引的作用 对于一些Qt的组件有一个参数位置就需要Qt UserRole void QComboBox setItemData int index const QVariant value int role
  • 设计模式笔记1--单例模式

    设计模式笔记1 单例模式 1 单例模式介绍 Head First设计模式中解释 用来创建独一无二的 只能有一个实例的对象的入场券 即 该类只能有一个示例 其实现逻辑一般是 构造函数声明为private或protect防止被外部函数实例化 内
  • 数据学习(十四)-方差分析与试验设计

    1 方差分析引论 2 单因素方差分析 3 方差分析中的多重比较 4 双因素方差分析 5 试验设计初步 1 方差分析引论 方差分析是比较多个总体的均值是否相等 但本质上它所研究的是变量之间的关系 1 1 方差分析及其有关术语 检验多个总体均值
  • 离线图书推荐,使用sparkMLlib ALS协同过滤算法

    图书推荐 使用sparkMLlib ALS协同过滤算法 bookcrossing数据集 Scala语言 虚拟机ieda平台 代码参照HADOOP大数据实战权威指南第十一章 只能说算是能运行出结果了吧 package com csu impo
  • openGauss学习笔记-53 openGauss 高级特性-Ustore

    文章目录 openGauss学习笔记 53 openGauss 高级特性 Ustore 53 1 设计原理 53 2 核心优势 53 3 使用指导 openGauss学习笔记 53 openGauss 高级特性 Ustore Ustore
  • 2021-01-26Taming Transformers for High-Resolution Image Synthesis(arXiv2020)(有代码)

    转自 https blog csdn net amusi1994 article details 112301258 代码链接 https github com CompVis taming transformers 项目主页 https
  • C++中一个类成员函数调用另一个类成员的方法

    在继承之外 在C 中一个类成员函数调用另一个类成员的方法主要有 类的组合 友元类 类的前向声明 单例模式等 下面主要讲讲这4种方法的实现 方法1 利用类的组合 组合通俗来讲就是类B有类A的属性 如声明一个Person类 再声明一个Teach
  • 【前端面试题之Vue篇】(1)父子组件通信方式Props/$emit

    文章目录 前言 一 父组件向子组件传值 1 Props定义 2 Props 用法 1 路由里注册父子组件 2 父组件里引入子组件 并且注册子组件 3 子组件利用props接受父组件传过来的值 4 展示 二 子组件向父组件传值 1 emit