vue3 基础知识 (组件之间的通信 and vuex) 02

news2024/12/23 15:30:10

侬好哇 !😍

文章目录

  • 一、组件的通信 (父传子)
  • 二、非 Prop 的Attribute (属性)
  • 三、组件的通信 (子传父)
  • 四、非父子组件的相互通信(Provide/Inject)
  • 五、非父子组件的相互通信(vuex)


一、组件的通信 (父传子)

        在开发过程中,我们会经常遇到需要组件之间相互进行通信,比如App可能使用了多个Header,每个地方的Header展示的内容不同,那么我们就需要使用者传递给Header一些数据,让其进行展示;又比如我们在Main中一次性请求了Banner数据和ProductList数据,那么就需要传递给他们来进行展示;也可能是子组件中发生了事件,需要有父组件来完成某些操作,那就需要子组件向父组件传递事件;总之,在一个Vue项目中,组件之间的通信是非常重要的环节

父组件传递给子组件:

  1. Props是你可以在组件上注册一些自定义的 attribute (属性)
  2. 父组件给这些 attribute 赋值 ,子组件通过 attribute 的名称获取到对应的值
父组件

<template>
  <div>
    <show-message title="哈哈哈" content="我是哈哈哈"></show-message>
    <show-message title="呵呵呵" content="我是呵呵呵"></show-message>
  </div>
</template>

<script>
  import ShowMessage from './ShowMessage.vue';
  export default {
    components: {
      ShowMessage
    }
  }
</script>

<template>
  <div>
    <h2>组件展示的title:{{title}}</h2>
    <p>组件展示的content: {{content}}</p>
  </div>
</template>




//子组件接收一个props 为一个数组
<script>
  export default {
    props: ["title", "content"]
  }
</script>




//子组件接收一个props 为一个对象,做一些限制
<script>
  export default {
    props: {
  		// 指定类型
 		title: String,   
        // 指定类型,同时指定是否必选、默认值    
        content: {    
               type: String,      
               require: true,       
               default: "哈哈哈"   
       	   } 
		}
  }
</script>
               

type的类型都可以是哪些呢?

  • String ,Number ,Boolean ,Array ,Object ,Date,Function ,Symbol

对象或数组默认值必须从一个工厂函数获取

  • 因为复杂类型数据值是互相引用的,所以这时需要从工厂函数获取

二、非 Prop 的Attribute (属性)

  • 当我们传递给一个组件某个属性,但是该属性并没有定义对应的props或者emits时,就称之为 非Prop的Attribute;
  • 常见的包括class、style、id属性等

当组件有单个根节点时,非Prop的Attribute将自动添加到根节点的Attribute中:

请添加图片描述

禁用Attribute继承:

  1. 如果我们不希望组件的根元素继承attribute,可以在组件中设置 inheritAttrs: false:

  2. 禁用attribute继承的常见情况是需要将attribute应用于根元素之外的其他元素;

  3. 我们可以通过 $attrs来访问所有的 非props的attribute;

请添加图片描述

多个根节点的attribute:

  • 多个根节点的attribute如果没有显示的绑定,那么会报警告,我们必须手动的指定要绑定到哪一个属性上
  • 具体指定在哪里就好啦!

三、组件的通信 (子传父)

  1. 首先,我们需要在子组件中定义好在某些情况下触发的事件名称;
  2. 其次,在父组件中以v-on的方式传入要监听的事件名称,并且绑定到对应的方法中;
  3. 最后,在子组件中发生某个事件的时候,根据事件名称触发对应的事件;
子组件

<template>  
  <div>  
        <button @click="increment">+1</button>    
        <button @click="decrement">-1</button>  
        <button @click="incrementn">+n</button>  
  </div>
</template>
<script>
export default {
  emits: ["addOne", "subOne","andn"],  // 监听两个事件

 // 对象写法一般是用来做参数验证
 // emits: {
 //	addOne:null,
 //	subOne:null,
 //	andn:n=>{
 //	console.log(n)
 //	}
 // } 

  methods: {
    increment() {
      this.$emit("addOne");   // this.$emit的方式发出去事件
    },
    decrement() {
      this.$emit("subOne");
    }incrementn(n) {
      this.$emit("addn",n);   //接收参数
    },
  }
};
</script>
父组件

<template>  
  <div>    
    <h2>当前计数: {{counter}}</h2>    
    <counter-operation @addOne="add" @subOne="sub" @incrementn="addn(5)"></counter-operation>  
  </div>
</template>
<script>
import CounterOperation from "./CounterOperation.vue";
export default {
  components: { CounterOperation },
  data() {
    return { 
    	counter: 0 ,
    	n:0
    };
  },
  methods: {
    add() {
      this.counter++;
    },
    sub() {
      this.counter--;
    },
    addn(n) {
      this.counter += n    //传递参数
    }
  }
};
</script>

四、非父子组件的相互通信(Provide/Inject)

  • Provide/Inject 用于非父子组件之间共享数据

比如有一些深度嵌套的组件,子组件想要获取父组件的部分内容,在这种情况下,如果我们仍然将 props 沿着组件链逐级传递下去,就会非常的麻烦,对于这种情况下,我们可以使用 Provide 和 Inject : 无论层级结构有多深,父组件都可以作为其所有子组件的依赖提供者

  1. 父组件有一个 provide 选项来提供数据;
  2. 子组件有一个 inject 选项来开始使用这些数据;

基本使用:


在这里插入图片描述

// 父组件data属性同级 写provide属性,下发数据
 provide:{
    name:'ha',
    age:3
  },
//下级组件 直接使用
<h1>{{name}}</h1>

// 下级组件 data属性同级 ,写inject,接收
 inject:['name','age'],

补充:


//在真实开发中,我们的数据肯定来自于服务器,当我们传递的数据是data里的数据时
//发现报错,是因为这时的this指向script函数,vue的this指向undifined
  provide:{
    name:this.name
  },

//改为函数形式,应该是vue 内部帮助我们修改了this指向
  provide() {
    return { 
       name:this.name
    };
  },
// 当父组件值发生改变时,下级组件可以通过监听的方式进行改变
 provide() {
    return { 
       name:computed(()=>{
         this.name
       })
 };

五、非父子组件的相互通信(vuex)

待补充

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

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

相关文章

FPGA使用MIG调用SODIMM内存条接口教程,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、SODIMM内存条简介3、设计思路框架视频输入视频缓存MIG配置调用SODIMM内存条VGA时序视频输出 4、vivado工程详解5、上板调试验证6、福利&#xff1a;工程代码的获取 1、前言 FPGA应用中&#xff0c;数据缓存是一大重点&#xff0c;不管是图像处理还是A…

蓝牙防丢器(附HS6621芯片选型)

在繁忙的生活中&#xff0c;我们往往会因为疏忽而丢失贵重物品&#xff0c;如钱包、钥匙、手机等&#xff0c;给生活带来不小的麻烦。然而&#xff0c;现代科技正为我们提供一种聪明的解决方案——蓝牙防丢器。这款小巧智能的装置不仅保护您的财物&#xff0c;还为您的生活带来…

无涯教程-PHP - sql_regcase()函数

sql_regcase() - 语法 string sql_regcase (string string) 可以将sql_regcase()函数视为实用程序函数&#xff0c;它将输入参数字符串中的每个字符转换为包含两个字符的带括号的表达式。 sql_regcase() - 返回值 返回带括号的表达式字符串以及转换后的字符。 sql_regcase…

隧道vs免费爬虫ip:为何要选择隧道爬虫ip?

在网络爬虫的世界中&#xff0c;爬虫ip是一项关键技术&#xff0c;它可以帮助我们隐藏身份、突破限制、提高抓取效率。但是&#xff0c;在选择爬虫ip时&#xff0c;我们常常会面对隧道爬虫ip和免费爬虫ip之间的抉择。在本文中&#xff0c;我们将探讨隧道爬虫ip相对于免费爬虫ip…

再谈一下DDD中的聚合设计

何为聚合 在领域模型中&#xff0c;一些实体或者值对象具有强而有力的业务关联关系&#xff0c;于是这些对象就组成了一个聚合&#xff0c;聚合内部的业务实体之间必须保证状态一致性。从技术角度来看&#xff0c;聚合是数据修改与持久化的基本单元&#xff0c;聚合内数据修改…

docker实践作业

1.安装docker服务&#xff0c;配置镜像加速器 2.下载系统镜像&#xff08;Ubuntu、 centos&#xff09; 3.基于下载的镜像创建两个容器 &#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母&#xff09; 4.容器的启动、 停止及重启操作 5.怎么查看正在运行的容器…

SpeedBI数据可视化工具:浏览器上做分析

SpeedBI数据分析云是一种在浏览器上进行数据可视化分析的工具&#xff0c;它能够将数据以可视化的形式呈现出来&#xff0c;并支持多种数据源和图表类型。 所有操作&#xff0c;均在浏览器上进行 在浏览器中打开SpeedBI数据分析云官网&#xff0c;点击【免费使用】进入&#…

Faster RCNN网络数据流总结

前言 在学习Faster RCNN时&#xff0c;看了许多别人写的博客。看了以后&#xff0c;对Faster RCNN整理有了一个大概的了解&#xff0c;但是对训练时网络内部的数据流还不是很清楚&#xff0c;所以在结合这个版本的faster rcnn代码情况下&#xff0c;对网络数据流进行总结。以便…

生成式AI将催生出大量新的就业机会,倒逼14亿员工学习掌握新技能

尽管IBM的研报指出生成式AI的普及将为未来三年内的14亿劳动力带来必须学习和掌握新技能的挑战&#xff0c;但它也强调这股浪潮不会引发失业潮&#xff0c;相反&#xff0c;它将催生出大量新的就业机会。生成式AI被认为将在各种商业模式中发挥重要作用&#xff0c;为企业提供了利…

STM32CubeMx配置HAL库PWM

PWM简介 PWM(Pulse Width Modulation)是脉冲宽度调制的缩写&#xff0c;是一种利用微处理器的数字输出来对模拟电路进行控制的技术。PWM的原理是 通过调节占空比来调节脉冲宽度&#xff0c;从而改变输出电压的大小。波形图如下 PWM的两个重要参数为频率和占空比。频率是周期…

【最新附安装包】UG NX2023安装教程(CAD/CAM)

软件下载 软件&#xff1a;UG NX版本&#xff1a;2023语言&#xff1a;简体中文大小&#xff1a;10.78G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU3.0GHz 内存8G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu.c…

(动态规划) 剑指 Offer 10- II. 青蛙跳台阶问题 ——【Leetcode每日一题】

❓剑指 Offer 10- II. 青蛙跳台阶问题 难度&#xff1a;简单 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为&#xff1a;1…

2023企业数智化转型的正确打开方式是什么?他这样说(三)

哈喽~又见面了大家&#xff01;上两期我们说到了数据在数智化转型中的重要性以及监控在数智化转型中的角色&#xff0c;戳这里↓↓↓&#xff0c;一键回放精彩内容 2023企业数智化转型的正确打开方式是什么&#xff1f;他这样说&#xff08;一&#xff09;https://mp.csdn.net…

MacBook 上的 Asahi Linux 将基于 Fedora Linux

MacBook 上的 Asahi Linux 将基于 Fedora Linux Asahi Linux 旨在将 Linux 移植到使用 M1、M2 等苹果硅芯片的 Mac 电脑上。它最初是基于 Arch Linux 的软件包构建的&#xff0c;采用 Arch Linux ARM&#xff0c;添加了自己的覆盖包资源库&#xff0c;并将所有的集成工作打包到…

支持4KHz回报的电竞鼠标,游戏操作更精准,雷柏VT950Pro上手

雷柏这两年推出的V系列外设很受还原&#xff0c;配合新近推出的4K电竞游戏技术&#xff0c;非常适合在高分辨率的显示器上玩游戏。目前很多雷柏经典的鼠标型号&#xff0c;也都出了新版本&#xff0c;设计更加炫酷&#xff0c;还可以支持4K了&#xff0c;配上一只4K接收器就可以…

elastic-job源码- job自动装配

版本&#xff1a;3.1.0-SNAPSHOT git地址&#xff1a;GitHub - apache/shardingsphere-elasticjob: Distributed scheduled job framework Maven 坐标 1 2 3 4 5 <dependency> <groupId>org.apache.shardingsphere.elasticjob</groupId> <artif…

vite+vue3使用@路径,报错处理

报错原因&#xff1a;未配置 符号为指定路径别名&#xff0c;直接使用导致 处理方法&#xff1a; 安装path模块&#xff1a; npm install --save-dev types/node修改vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from…

Hope.money:新兴DeFi项目如何重新定义稳定币生态的未来?

联储加息导致金融市场紧缩&#xff0c;Terra、3AC、FTX等知名中心化机构未能妥善应对而暴雷&#xff0c;并重创了整个加密货币市场&#xff0c;导致参与者损失惨重。这些事件揭示了中心化机构的局限&#xff0c;投资者对其资产掌控权的担忧愈发强烈。 自2018年首个DeFi协议Com…

Java算法:对角线遍历

Java算法&#xff1a;对角线遍历 学习目标&#xff1a;对角线遍历算法算法要求算法思路算法实现 学习目标&#xff1a;对角线遍历算法 每日初级算法&#xff1a;对角线遍历 算法要求 给你一个大小为 m x n 的矩阵 mat &#xff0c;请以对角线遍历的顺序&#xff0c;用一个数组…

使用 Feature Flags 与可观测工具实现数据库灰度迁移

场景描述 很多企业会遇到数据库升级、或数据库迁移的情况&#xff0c;尤其是在自建数据库服务向云数据库服务、自建机房向云机房、旧数据库向新数据库迁移等场景。 然而&#xff0c;我们需要在整个移植过程中保证其稳定性、避免数据遗失、服务宕机等情况&#xff0c;最常见的移…