vue2组件通信

news2024/11/26 18:20:28

父传子

传递静态或动态 Prop

<!-- 传入静态值 -->
<blog-post title="hai hai hai"></blog-post>

<!-- 传入变量值 -->
<blog-post :title="info.title"></blog-post>

传入一个对象的所有 property

数据

post: {
  id: 1,
  title: 'My Journey with Vue'
}
<blog-post v-bind="post"></blog-post>

<!-- 等价于 -->
<blog-post
  v-bind:id="post.id"
  v-bind:title="post.title"
></blog-post>

props接收

  1. 数组形式
props: ['propA', 'propB']
  1. 对象形式
Vue.component('my-component', {
  props: {
    // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
    propA: Number,
    // 多个可能的类型
    propB: [String, Number],
    // 必填的字符串
    propC: {
      type: String,
      required: true
    },
    // 带有默认值的数字
    propD: {
      type: Number,
      default: 100
    },
    // 带有默认值的对象
    propE: {
      type: Object,
      // 对象或数组默认值必须从一个工厂函数获取
      default: function () {
        return { message: 'hello' }
      }
      //箭头函数语法,括号()内为js表达式,即return返回的值
      //default: ()=>({message: 'hello'})
    },
    // 自定义验证函数
    propF: {
      validator: function (value) {
        // 这个值必须匹配下列字符串中的一个
        return ['success', 'warning', 'danger'].includes(value)
      }
    }
  }
})
  • Object,Array,Function类型的默认值default为函数形式

非 Prop 的 Attribute

父组件传递的属性,子组件并没有相应prop去接收
默认这些 attribute 会被添加到这个子组件的根元素上
例如:id、class、style等属性,子组件没有显示的用props接收

父组件传递数据:

<HelloWorld :name="name" :age="age" :test="123"></HelloWorld>

子组件接收数据:
没有props接收test,故test为非Prop的Attribute,默认test添加到子组件的根元素上

<template>
  <div class="outer">
    <div class="box">
      <div>
        <h1>{{ name }}</h1>
        <h1>{{ age }}</h1>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    name: {
      type: String,
      default: 'none'
    },
    age: {
      type: Number,
      default: 0
    },
  }
}
</script>

在这里插入图片描述

指定Attribute绑定的元素

<template>
  <div class="outer">
    <div class="box">
      <div>
      	<!-- 指定Attribute绑定的元素 -->
        <h1 :test="$attrs.test">{{ name }}</h1>
        <h1>{{ age }}</h1>
      </div>
    </div>
  </div>
</template>

<script>
export default {
 //禁用 Attribute继承
  inheritAttrs:false,
  props: {
    name: {
      type: String,
      default: 'none'
    },
    age: {
      type: Number,
      default: 0
    },
  }
}
</script>

在这里插入图片描述

单向数据流

单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。(子组件不能修改prop)

  • 对象和数组是通过引用传入的,在子组件中改变变更这个对象或数组本身将会影响到父组件的状态。

子传父

<template>
  <div>
    <button @click="handleClick(1)">+1</button>
    <button @click="handleClick(2)">+2</button>
    <button @click="handleClick(3)">+3</button>
  </div>
</template>

<script>
export default {
  // 1.自定义事件的声明
  // 方式1 数组
  // emits: ['add'],
  // 方式2 对象(参数验证)
  emits: {
    add: function (payload) {
      // add的值<=1时,抛出事件add
      return payload <= 1 ? true : false
    },
  },
  methods: {
    handleClick(num) {
      // 2.抛出自定义事件add
      this.$emit('add', num)
    },
  },
}
</script>
<template>
  <div>
    <h1>{{ count }}</h1>
    <!-- 1.监听自定义事件add -->
    <hello-world @add="handleAdd"></hello-world>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue';

export default {
  components: { HelloWorld },
  data() {
    return {
      count: 0
    }
  },
  methods: {
   // 2.实现自定义事件add的回调函数
    handleAdd(num) {
      this.count += num
    },
  },
}
</script>

在这里插入图片描述

插槽

Vue插槽

provide与inject

在这里插入图片描述
在这里插入图片描述
变为响应式数据:computed函数
在这里插入图片描述

全局事件总线

使用第三方库mitt,tiny-emitter
mitt

$refs

获取具有ref属性的所有DOM元素和组件实例
App.vue

<template>
  <div>
    <h1 ref="h1Ref">{{ msg }}</h1>
    <A ref="ARef"></A>
  </div>
</template>

<script>
import A from '@/components/A.vue'
export default {
  data() {
    return {
      msg: 'hi'
    }
  },
  components: { A },
  mounted() {

    // 获取DOM元素
    console.log(this.$refs.h1Ref);

    // 获取组件
    console.log(this.$refs.ARef);

    // 获取组件的根元素 this.$refs.ARef.$el
    // 多个根元素时,可以通过DOM方法获取到指定根元素
    console.log(this.$refs.ARef.$el.nextSibling);
  },
}
</script>

<style scoped></style>

A.vue

<template>
  <div>
    <h1>{{ msg }}</h1>
  </div>

  <div>123</div>
</template>

<script>
export default {
  data() {
    return {
      msg: 'A'
    }
  }
}
</script>

vuex、pinia

vuex知识点
pinia知识点

路由传值

本地存储

总结

  1. 父传子,父组件传递属性(静态或动态(v-bind绑定)),子组件通过props接收
  2. 子传父,子组件使用$emit抛出自定义事件,父组件v-on监听自定义事件并实现回调函数
  3. 插槽
  4. 父组件provide提供数据,子孙组件inject注入数据
  5. 通过全局事件总线eventBus进行跨组件值传递
  6. 通过$ref $parent$chidren获取实例进而通信
  7. 通过vuex、pinia进行状态管理
  • 路由传值
  • localStorage、sessionStorage

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进程管道:popen函数实例

基础知识 可能最简单的在两个程序之间传递数据的方法就是使用popen和pclose函数了。它们的原型如下所示&#xff1a; #include <stdio.h>FILE *popen(const char *command, const char *type);int pclose(FILE *stream); 1&#xff0e;popen函数 popen函数允许一个程…

因为Json,controller方法单参数 导致脑袋短路

对于单参数方法&#xff0c; 一直喜欢用parameter方式。今天不知道为啥&#xff0c;就想用Json方式&#xff0c;然后无法直接传递。各种自我怀疑&#xff0c;然后尝试。 突然醒悟过来&#xff0c;Json方式是key/value模式&#xff0c;单参数String类型&#xff0c;没有key。必…

TreeMap源码

介绍 如果我们希望Map可以保持key的大小顺序时&#xff0c;就需要利用TreeMap。底层使用了红黑树&#xff0c;左子树总小于root&#xff0c;右子树总大于root&#xff0c;具有很好的平衡性,操作速度达到log(n)。 TreeMap 相比于HashMap多实现了了NavigableMap接口&#xff08…

5. SpringCloudAlibab 集成 gateway

一、什么是 Spring Cloud Gateway 1、网关简介 网关作为流量的入口&#xff0c;常用的功能包括路由转发&#xff0c;权限校验&#xff0c;限流等等。 SpringCloud Gateway是 Spring Cloud 官方推出的第二代网关框架&#xff0c;定位取代 Netflix Zuul。相对Zuul来说&#xf…

【多线程】原子引用ABA问题

目录 一、代码示例二、执行结果截图三、说明四、AtomicStampedReference使用4.1 代码示例4.2 截图 一、代码示例 package com.learning.atomic;import lombok.extern.slf4j.Slf4j; import java.util.concurrent.atomic.AtomicReference; /*** Author wangyouhui* Description …

2023年软考-高级信息系统项目管理工程师考试大纲

高级信息系统项目管理工程师考试大纲 2023年软考高级信息系统项目管理工程师考试大纲已于2023年5月出版。您可以在 中国计算机技术职业资格网 上找到更多关于考试的信息 。 信息系统项目管理师是对从事信息系统项目管理工作的专业技术人员基本理论和实践能力的综合考核,该专业…

新手如何挑选一款合适的功率放大器?

ATA系列功率放大器是&#xff08;AB&#xff09;类功放&#xff0c;相比于甲类功率放大器&#xff0c;它小信号输入时效率更高&#xff0c;随着输出功率的增大&#xff0c;效率也增高&#xff0c;它的效率比以及保真度而言&#xff0c;都优于A类和B类功放。 因为具有这些优势&a…

助你更好的理解 Python 字典

助你更好的理解 Python 字典 字典是Python中的常用数据类型之一&#xff0c;可将数据存储在键/值对中&#xff0c;同 Java 中的 Map 相似。 1、什么是字典理解&#xff1f; 字典理解是创建字典的一种优雅简洁的方法。 字典理解优化 使用字典理解优化函数。 示例&#xff…

使用 FFmpeg 开发的那些事

勇敢就是&#xff0c;在你还没开始的时候就知道自己注定会输&#xff0c;但依然义无反顾地去做&#xff0c;并且不管发生什么都坚持到底。一个人很少能赢&#xff0c;但也总会有赢的时候。《杀死一只知更鸟》 欢迎大家加入广州城市社区&#xff1a;https://devpress.csdn.net/g…

java面经

String, StringBuffer, StringBuilder区别 第一点是可变性。String不可变&#xff0c;String Buffer和StringBuider可变。这是因为String被final修饰&#xff0c;每次操作都生成新的对象。StringBuffer和StringBuilder的父类AbstractStringBuilder没有被final修饰。 第二点是…

MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解

这里写目录标题 一、非线性方程数值求解1. 单变量非线性方程求解2. 非线性方程组的求解 二、最优化问题求解1. 无约束最优化问题求解2. 有约束最优化问题求解3. 线性规划问题求解 三、常微分方程初值问题的数值求解1. 龙格—库塔法简介2. 龙格—库塔法的实现 一、非线性方程数值…

Day975.如何使用JWT结构化令牌 -OAuth 2.0

如何使用JWT结构化令牌 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何使用JWT结构化令牌的内容。 OAuth 2.0 规范并没有约束访问令牌内容的生成规则&#xff0c;只要符合唯一性、不连续性、不可猜性就够了。这就意味着&#xff0c;可以灵活选择令牌的形式&…

将递归函数转成非递归函数的通用方法

看到过一道非常不错的面试题&#xff1a;不支持递归的程序语言如何实现递归程序&#xff1f; 之所以说这道题好&#xff0c;是因为&#xff1a; 首先&#xff0c;它不是纯粹考概念和死记硬背&#xff0c;求职者在回答问题之前需要进行一定的思考&#xff1b; 其次&#xff0c…

vim粘贴出现多余的#

vim粘贴yaml格式时&#xff0c;出现多余的#&#xff0c;格式错误 解决&#xff1a;设置paste :set paste 然后再粘贴即可

final不可变性

一、什么是不可变性&#xff08;Immutable&#xff09; 如果对象在被创建后&#xff0c;状态就不能被修改&#xff0c;那么它就是不可变的这个对象不能被修改指&#xff1a; 对象指向(引用)不可变字段不可变成员变量不可变 案列演示&#xff1a; person对象&#xff0c;age和…

我的C++学习笔记

声明&#xff1a; 写本篇博客的目的是为了整理自己在找工作时学习的C相关知识点&#xff0c;博客整体内容会分为两种风格&#xff0c;第一章基础部分是以常见C面试问题解答的形式呈现&#xff1b;其余部分是知识点层层递进的方式展现&#xff0c;比较系统。其中&#xff0c;在第…

Avalon 学习系列(三)—— 数据和指令同步

Avalon 有很多个指令&#xff0c;通过这些指令可以对 DOM 进行一些事件操作、或者样式修改。 ms-duplex Avalon 实现数据与视图的同步的方式是用 ms-duplex 将元素跟数据绑定在一起&#xff0c;如果有其中一个的值改变另一个值也将改变。 ms-duplex 是 avalon 的双向绑定属性…

OpenCV(C++)创建图片绘制图形(矩形、圆、文字、线段等等)

一、OpenCV介绍 OpenCV 是基于开源许可证的跨平台计算机视觉库,提供了一组丰富、广泛的图像处理和计算机视觉算法。OpenCV 支持多种编程语言,包括 C++、Python、Java 等,可以运行在 Linux、Windows、Mac OS 等平台上。 OpenCV 能够在图像上绘制各种几何形状、文本和曲线,…

学习ESP32笔记

学习ESP32笔记 1.platform IO插件的下载&#xff08;提前安装好python&#xff0c;不然在中间的一部分会一直报错&#xff09; VS Code下载platform IO时&#xff0c;开加速器&#xff08;VPN&#xff09;&#xff0c;并且关闭防火墙 这一步比较慢&#xff0c;大概等十来分钟…

Kendo UI for jQuery---02.开始---01.使用 Kendo UI for jQuery 的第一步

使用 Kendo UI for jQuery 的第一步 欢迎来到 Kendo UI for jQuery 入门的第一步指南&#xff01; 本指南演示如何通过添加所需资源和初始化 Kendo UI 网格来开始使用套件。 该过程借鉴了以下里程碑&#xff1a; 1.下载控件 2.添加所需的 JavaScript 和 CSS 文件 3.将网格绑…