React笔记_组件之间进行数据传递

目录

      • 父子组件传值- props
        • 父传子
        • 子传父
      • 嵌套组件传值-Context API
        • 概念
        • React.createContext API
        • Provider组件
          • 正确示例
          • 错误示例
        • 消费 Context
          • React.Consumer组件
          • useContext Hook
          • 区别
        • 使用场景
          • 举例说明-用户信息
      • 状态管理-Redux

父子组件传值- props

在React中父子组件传值是单向数据流 => 数据必须是由父级传到子级或者子级传递给父级层层传递!

父传子

父组件通过在子组件的JSX标签上添加属性的方式来传递数据,子组件通过 props 对象接收。

传递的数据类型是不受限制的 = > 可以是字符串、数字、数组、对象、函数、甚至JSX元素。

  • 父组件

      <son  子组件接收的属姓名=父组件的属性值></son>
    
    import  {useState} from 'react'
    import Funcom from '../component/Funcom'
    import Clcom from '../component/Clcom'export default function Page1(){const [num, setNum] = useState(1)return (<div>{/* 函数子组件 */}<Funcom num={num}/>{/* 类子组件 */}<Clcom num ={num}/><button onClick={()=>{setNum(preNum=>preNum+1)}}>editNum</button></div>)
    }
    
  • 子组件:

    • 函数子组件组件:在调用函数时将props作为参数传入;
      function FunSon(props){
      // props直接使用
      }
      
      export default function Fun(props){console.log('渲染了') // 无论有没有接收参数只要父组件更新都会重新渲染子组件return (<div><h4>函数子组件=={props.num}</h4></div>)
      }
      
    • 类子组件:通过this获取props
      class ClaSon extends React.Component{// this.props使用
      }
      
      import React from 'react'export default  class Clcom extends React.Component {render() {console.log('render')  // 无论有没有接收参数只要父组件更新都会重新渲染子组件return (<><h4>类组件=={this.props.num}</h4></>)}
      }
      
子传父

子组件不能直接修改父组件的状态(数据单向流动),果需要,父组件必须传递一个函数给子组件作为 prop,子组件在需要时调用这个函数,将数据作为参数传回给父组件。

  • 父组件
    <Son 子组件调用的方法名={父组件的方法}></Son>
    
  • 子组件
    // 当子组件想要修改父组件的数据时
    // val是要修改的值props.方法名(val) // 函数组件this. props.方法名(val) // 类组件
    
  • 举例说明
    父组件
    import  {useState} from 'react'
    import Funcom from '../component/Funcom'
    import Clcom from '../component/Clcom'export default function Page1(){const [num, setNum] = useState(1)function editNum(val){setNum(val)}return (<div>{/* 函数子组件 */}<Funcom num={num} editNum={editNum}/>{/* 类子组件 */}<Clcom num ={num}  editNum={editNum}/></div>)
    }
    函数子组件
    export default function Fun(props){return (<div><h4>函数子组件=={props.num}</h4><button onClick={()=>{props.editNum(props.num+2)}}>函数组件editNum</button></div>)
    }
    
    类子组件
    import React from 'react'export default  class Clcom extends React.Component {render() {console.log('render')return (<><h4>类组件=={this.props.num}</h4><button onClick={()=>{this.props.editNum(this.props.num+1)}}>类组件editNum</button></>)}
    }
    

嵌套组件传值-Context API

概念

Context API 是 React 提供的一种组件间通信机制,允许数据在组件树中直接传递,无需通过 props 逐层传递。

React.createContext API

React.createContext 是一个函数,用于创建一个Context对象 => 该对象是管理 “全局”或“跨组件”数据的容器和通信机制。

React.createContext(defaultValue)
  • 参数:defaultValue;

    当一个组件在树中找不到匹配的 Provider 时,React.Consumer/useContext就会返回这个 defaultValue;

    这个默认值对于测试组件或在没有提供 Provider 的情况下非常有用

  • 返回值:一个Context对象

    {$$typeof: Symbol(react.context), // React 内部用于识别类型的符号_currentValue: 'light',          // 内部保存的当前值Provider: { ... },               // Provider 组件Consumer: { ... },               // Consumer 组件 (已较少使用)displayName: undefined,          // 用于 React DevTools 显示的名称
    }
    
Provider组件

Provider组件是React.createContext函数返回对象的属性,允许消费组件订阅 Context 的变化。

<MyContext.Provider value={...}><!-- 子组件树-->
</MyContext.Provider>

value就是要传递给所有下层组件的数据,只要 value发生变化,所有订阅该 Context 的后代组件都会强制重新渲染,即使它们使用了 React.memo 或 shouldComponentUpdate。

正确示例
  const ThemContext = createContext({theme:'right', color: 'red'})const [theme, setTheme] = useState({theme:'right', color: 'red'})return (<div><ThemContext.Provider value={theme}>{/* 其中所有的子组件以及其子组件都可以获取到value */}<Funcom /><Clcom /></ThemContext.Provider></div>)
错误示例
<div><ThemContext.Provider value={{theme:'right', color: 'red'}}>{/* 其中所有的子组件以及其子组件都可以获取到value */}<Funcom /><Clcom /></ThemContext.Provider>    
</div>

每次渲染时,value={ theme:‘right’, color: ‘red’ }都会创建一个全新的对象,导致所有消费者不必要的重渲染。

消费 Context

kan su me

React.Consumer组件

React.Consumer是类组件中订阅 Context 变更的方式,函数组件已经逐渐使用useContext这个hook来替代了。

子元素是一个函数,函数的参数就是 ThemeContext 的当前值,返回值就是需要渲染的vodm;

 <ThemeContext.Consumer>{value=>{vdom}}</ThemeContext.Consumer>

举例说明

  • 将context提取为一个单独的文件themeContext

    import  {createContext} from 'react'
    export default createContext({theme:'right', color: 'red'})
    
  • 在顶级组件引入

    import  {useState} from 'react'
    import Funcom from '../component/Funcom'
    import Clcom from '../component/Clcom'
    import ThemContext from '../utils/themeContext'
    export default function Page1(){const [theme, setTheme] = useState({theme:'right', color: 'red'})function editTheme(){setTheme(prevalue => ({...prevalue, theme: prevalue.theme=='right' ? 'dack' : 'right',}))}return (<div><ThemContext.Provider value={theme}>{/* 其中所有的子组件以及其子组件都可以获取到value */}<Funcom /><Clcom /><button onClick={editTheme}>edittheme</button></ThemContext.Provider></div>)
    }
    
  • 子组件中若是不需要使用则完全不需要改变

  • 在想要使用的组件去消费,比如此处在孙组件使用

     import React from 'react'import  ThemeContext  from '../utils/themeContext'class SonFun2 extends React.Component{render(){console.log('孙组件')return(<ThemeContext.Consumer>{value=>(<><h4>今天的主题是:{value.theme}</h4><div>今天的颜色是:{value.color}</div></>)}</ThemeContext.Consumer>)}}
    

    当在顶级组件点击按钮修改value值时会重新渲染所有组件,包括子组件(因为通过setState去修改数据本身就会渲染所有子组件)

useContext Hook

useContext是函数组件中订阅 Context 变更的方式

const value = useContext(ThemeContext)

value就是要传递给所有下层组件的数据,只要 value发生变化,所有订阅该 Context 的后代组件都会强制重新渲染

举例说明

function SonFun(){const value = useContext(ThemeContext)return (<div><h4>function</h4><h4>今天的主题是:{value.theme}</h4><div>今天的颜色是:{value.color}</div></div>)
}
区别
函数组件类组件
方式useContext APIContext.consumer组件
语法只需要在函数顶部调用hook ,简单明了需要在组件jsx语法中嵌套一个函数,语法稍显冗长
易读性可以并行调用多个context,简单易懂若是存在多个context,容易造成回调地狱
性能基本相同基本相同
使用场景

推荐在值不经常改变的地方使用context,如主题切换用户信息认证管理一些全局的、许多组件都需要的数据

对于频繁更新的数据, 如表单输入、实时坐标等,Context 可能不是最优解,因为只要 Context 的 value 变化,所有消费该 Context 的组件都会重新渲染,即使它们只使用了 value 的一部分。

举例说明-用户信息

状态管理-Redux

redux

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

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

相关文章

Elixir通过Onvif协议控制IP摄像机,扩展ExOnvif的摄像头停止移动 Stop 功能

ExOnvif官方文档 在使用 Elixir 进行 IPdome 控制时&#xff0c;可以使用 ExOnvif 库。 ExOnvif官方文档中未给停止移动调用命令&#xff0c;自己按照onvif协议 Onvif协议 扩展的此项功能&#xff1b; 停止移动 Stop 在Onvif协议中&#xff0c;用于停止云台移动的操作为Stop…

spring boot autoconfigure 自动配置的类,和手工 @configuration + @bean 本质区别

它们在本质功能上都是为了向 Spring 容器注册 Bean&#xff0c;但在触发方式、加载时机、可控性和适用场景上有明显区别。可以这样理解&#xff1a;1️⃣ 核心区别对比维度Configuration Bean&#xff08;手工配置&#xff09;Spring Boot EnableAutoConfiguration / 自动配置…

论文解读 | Franka 机器人沉浸式远程操作:高斯溅射 VR 赋能的遥操框架研发与应用

研究背景 在工业制造、危险环境作业等领域&#xff0c;机器人远程操作技术是突破人类作业边界的关键手段。传统远程操作依赖2D 相机反馈与操纵杆控制&#xff0c;存在空间感知差、操作精度低、沉浸感弱等问题&#xff0c;难以满足复杂移动操作任务需求。 例如在核设施退役、灾后…

【Unity Shader学习笔记】(四)Shader编程

一、OpenGL与DirectX 这是计算机图形学中两个最核心的应用程序接口(API),它们充当了应用程序与显卡硬件之间的桥梁,让开发者能够调用GPU进行图形渲染和通用计算。 特性维度 OpenGL DirectX 主导公司 Khronos Group (原SGI) Microsoft

程序员之电工基础-初尝线扫相机

一、背景 兴趣爱好来了&#xff0c;决定研发一个产品。涉及到电工和机械等知识&#xff0c;所以记录一下相关的基础知识。本期主题是初尝线扫相机&#xff0c;虽然又回到了编程&#xff0c;但是对于我来说&#xff0c;硬件集成的经验不足&#xff0c;缺乏相机、镜头的专业知识。…

qt QWebSocket详解

1、概述 QWebSocket是Qt网络模块中的一个类&#xff0c;用于实现WebSocket协议的通信。WebSocket是一种全双工的通信协议&#xff0c;允许在客户端和服务器之间建立实时的双向通信。QWebSocket提供了对WebSocket协议的支持&#xff0c;使得开发者能够在Qt应用中方便地实现实时…

Java基础IO流全解析:常用知识点与面试高频考点汇总

Java基础IO流全解析&#xff1a;常用知识点与面试高频考点汇总 前言 IO&#xff08;Input/Output&#xff09;流是Java中处理数据传输的核心机制&#xff0c;无论是文件操作、网络通信还是数据持久化&#xff0c;都离不开IO流的身影。对于Java初学者而言&#xff0c;IO流的分类…

PDF.AI-与你的PDF文档对话

本文转载自&#xff1a;PDF.AI-与你的PDF文档对话 - Hello123工具导航 ** 一、&#x1f916; PDF.AI&#xff1a;秒懂 PDF 的智能对话助手 PDF.AI 是一款超实用的AI 文档分析工具&#xff0c;专门帮你快速搞定各种 PDF 文件。不管多长的合同、报告或论文&#xff0c;你只需上…

微软出品!这个免费开源工具集获得了GitHub 123k程序员点赞

大家晚上好&#xff0c;我是顾北&#xff0c;是一名AI应用探索者&#xff0c;当然也是GitHub开源项目收集爱好者。最近我在整理Windows效率工具时&#xff0c;发现了一个让我一晚上没睡着觉的开源项目——微软官方出品的 PowerToys&#xff0c;可谓是彻夜难眠啊。经过我两个月多…

【开题答辩全过程】以 小众商户小程序为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

Vue 3.5 重磅新特性:useTemplateRef 让模板引用更优雅、更高效!

Vue 3.5 重磅新特性:useTemplateRef 让模板引用更优雅、更高效! 目录 前言 什么是 useTemplateRef 传统 ref 的问题 useTemplateRef 的优势 基础用法 进阶用法 最佳实践 迁移指南 性能对比 注意事项 总结 前言 Vue 3.5 带来了一个激动人心的新特性 useTemplateRef,它彻底革…

uni app 的app端 写入运行日志到指定文件夹。

uni app 的app 端 写入指定目录文件夹。并自动生成当前日期的日志文件。删除十日前的日志文件其中 writefile.js 代码如下const {default: logger } require("./logger")var name var url var params var method var resfunction setlog(name, url, params, method)…

桌面应用开发语言与框架选择指南

桌面应用开发的语言和框架选择非常丰富&#xff0c;从原生性能到跨平台解决方案应有尽有。下面我将它们分为几大类进行详细介绍&#xff0c;并附上各自的优缺点和适用场景。 一、 原生开发 (Native Development) 原生开发能提供最佳的性能和与操作系统最完美的集成体验。 1. …

C++知识

文章目录1.Cmap为什么线程不安全?2.map大量插入会有性能问题&#xff0c;为什么3.set的应用场景4.map set mutiset mutimap unordered_map unordered_set的底层实现、使用场景、优缺点1.Cmap为什么线程不安全? 其实STL中的容器都是线程不安全的&#xff0c;如果想要线程安全…

自学嵌入式第三十四天:网络编程-TCP

一、UDP用户数据报收发次数要对应&#xff1b;数据与数据之间有边界&#xff0c;多次调用收发时都是不同的数据报&#xff1b;接收方的数据大小>发送方的数据大小&#xff0c;如果接受方数据小了则会丢弃未读的部分&#xff0c;再次调用只会读下一包数据&#xff1b;二、服务…

Apache IoTDB:国产时序数据库的崛起与工业物联网的未来

&#x1f4d1;前言 在工业物联网的浪潮中&#xff0c;数据不再是副产品&#xff0c;而是驱动决策的核心资产。"随着物联网、工业互联网和智能监控的迅猛发展&#xff0c;时序数据正以前所未有的速度爆发。据预测&#xff0c;到2025年全球物联网设备将达750亿台&#xff0c…

一键核验,安全无忧!手机号三要素详情版API,为您的业务筑牢身份认证防线

一、什么是手机号三要素核验API&#xff1f; 手机号三要素核验API 是一种通过编程接口&#xff0c;实时验证一条个人身份信息是否与该国运营商登记的实名信息一致的在线服务。 这里的“三要素”特指&#xff1a; 姓名 身份证号码 手机号码 核验过程&#xff1a;用户提交上述三个…

轻松上手 qData 数据中台开源版:Docker Compose 助你10分钟跑起来

说在前面 谁适合看这份指南&#xff1f; 初次接触 qData&#xff0c;希望快速体验功能的小伙伴不想折腾复杂环境配置和前端打包的人想用“一键启动”省事体验完整平台的用户 我们已经为你准备好“开箱即用”的完整部署包&#xff0c;包括&#xff1a; ✅ 前端静态资源&…

Qt读写Excel--QXlsx基本使用

1、概述 Document 类是一个用于操作 XLSX 文件的类&#xff0c;继承自 QObject。它提供了对 Excel 文件的读写操作&#xff0c;包括单元格的读写、图片和图表的插入、单元格合并、列和行的格式化、数据验证和条件格式化等功能。此外&#xff0c;它还支持对工作簿和工作表的操作…

P13929 [蓝桥杯 2022 省 Java B] 山 题解

缩减一下题目的意思&#xff0c;问区间 [2022,2022222022] 有多少个数是回文数并且先单调不减&#xff0c;后单调不增。 因为有这两条条件&#xff0c;我们可以得知在判断时只用判断前半段的每个数是不是和对面相应的位置相等&#xff0c;以及是否单调不减。 为什么不用看后半段…