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

React学习之props(父传子,子传父),Context组件之间的传参。

目录

前言

一、什么时候需要使用props?

二、使用

1.父传子

2.子传父

二、什么时候需要使用Context? 

第一步:

第二步使用:

第一种:

 第二种:

演示: 

总结


前言

React学习笔记记录,props在react组件中如何使用。父级组件向下传参,下级组件向上传参。当组件层级较深的,使用props传递数据要经过多层的传递很麻烦,就可以使用到context数据管理。


一、什么时候需要使用props?

当我们把页面的功能拆分为几个组件时,在一个页面中引入了子组件,子组件需要使用到当前页面的数据时,可以使用props来传递;父组件需要使用子组件的某些值来处理父组件的数据时,可以使用props来传递;组件插槽需要使用到props。

二、使用

1.父传子

代码如下(示例):

pageB代码 

import componentA from './demo-classComponents'const PageB= ()=>{return(<div><p>我是页面PageB</p><hr/><componentA toSon="给组件A的值"/></div>)
}

componentA代码

const ComponentA = (props)=>{retrun ({/* 接收从pageB传来的值,在页面显示出来 */}<p>我是ComponentA 组件</p><p>展示从其他页面传来的值:</p><div>{props.toSon}</div>)
}export default ComponentA 

演示结果: 

不仅可以传普通的值,也可以传函数等值 

 pageB代码 

import componentA from './demo-classComponents'const PageB= ()=>{const testfuc = ()=>{console.log("使用testfuc")}return(<div><componentA testfuc={testfuc}  toSon="给组件A的值"/></div>)
}

 componentA代码

const ComponentA = (props)=>{const clickFunc = ()=>{props.testfunc(); //使用从pageB传来的函数方法}retrun ({/* 接收从pageB传来的值,在页面显示出来 */}<p>我是ComponentA 组件</p><p>展示从其他页面传来的值:</p><div>{props.toSon}</div><button onClick={clickFunc}>点击我</button>)
}export default ComponentA 

 

2.子传父

子组件需要向上级组件传递某些值时

 componentA代码

const ComponentA = (props)=>{const clickFunc = ()=>{props.testfunc(); //使用从pageB传来的函数方法}const clickFunc2 = ()=>{props.getsomeData('传给pageB的值');}retrun ({/* 接收从pageB传来的值,在页面显示出来 */}<p>我是ComponentA 组件</p><p>展示从其他页面传来的值:</p><div>{props.toSon}</div><button onClick={clickFunc}>点击我</button><button onClick={clickFunc2}>点击我给pageB传递一些值</button>)
}export default ComponentA 

 pageB代码  

import componentA from './demo-classComponents'const PageB= ()=>{const testfuc = ()=>{console.log("使用testfuc")}const [comAData,setcomAData] = useState('')const getsomeData = (data)=>{// 这里的data就是从component传来的setcomAData(data)}return(<div><p>我是页面PageB</p>{/* 展示接收到的值 */}<p>{comAData}</p><hr/><componentA getsomeData={getsomeData} testfuc={testfuc}  toSon="给组件A的值"/></div>)
}

二、什么时候需要使用Context? 

Context相当于一个公共的存储空间

 可以将多个组件中都需要访问的数据统一存储到一个context中,

  这样就无需通过props逐层传递,即可使组件访问到这些数据

 可以设置默认值 也可以不设置

第一步:

在src下创建一个store文件夹,在此文件夹下就可以创建对应的context文件了

创建一个TestContext.js文件:

import React from "react";const TestContext = React.createContext({ //这个是默认数据,可以设置也可以不设置name:'小美',age:18
})export default TestContext

第二步使用:

用两种使用方式

第一种:

*注意 这里会把TestContext当作一个组件使用 所以命名的时候 首字母需要大写

 * Consumer的标签体需要一个回调函数

   她会将context设置为回调函数的参数,通过参数就可以访问到context

import TestContext from "../../store/TestContext"const A = ()=>{
return (<TestContext.Consumer>{(ctx)=>{return <div>{ctx.name} - {ctx.age}</div>}}</TestContext.Consumer>
)
}export default A

 第二种:

1.导入定义的context

 2.使用useContext()需要一个context作为参数

      它会将context中数据获取并返回值

import { useContext } from "react"
import TestContext from "../../store/TestContext"const B = ()=>{const ctx = useContext(TestContext)console.log("ctxctx",ctx)return (<div style={{fontSize:'24rem'}}>{ctx.name} - {ctx.age}</div>)
}export default B 

pageB页面

 xxxx.Provider  例如:TestContext.Provider

  -表示数据的生成者,可以使用它来指定context中的数据

  -通过value 来指定context中存储的数据

 当我们通过context访问数据时,他会读取离他最近的provider的数据

 如果没有provider,则读取context中的默认数据


import A from "./components/testContext/A";
import B from "./components/testContext/B";
import TestContext from "./store/TestContext";const PageB= ()=>{return (<div><A></A><TestContext.Provider value={{name:'小刚',age:19}}><B></B></TestContext.Provider><p>我是pageB页面</p></div>);
}

演示: 

总结

当组件嵌套的层级不是很深时,结果简单时,使用props进行组件的传参。

当组件嵌套冗余,层级很深的时候,就可以使用context来进行组件传参。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据结构之探索“堆”的奥秘
  • 06.java集合
  • JAVAWeb实战(后端篇)
  • Java零基础之多线程篇:多线程最佳实践
  • 【Android】安卓多媒体之通知、摄像头、相册、播放音乐、视频用法总结
  • 收银系统源码-门店折扣活动应该怎么做
  • 你了解渗透测试吗?渗透测试在网络安全行业属于食物链什么层级?
  • vue-创建自己的CLI脚手架
  • 预测性维护:一种基于因果技术语言处理 (CTLP) 的智能故障诊断方法
  • js、ts、argular、nodejs学习心得
  • 研究人员可以采用什么策略来批判性地评估和综合其领域的不同文献
  • SSL组网的概念,SSL组网方式怎么实现
  • GuLi商城-商品服务-API-平台属性-新增分组与属性关联
  • 透明屏幕的显示原理与特点
  • 吴恩达机器学习-C1W3L2-逻辑回归之S型函数
  • 10个确保微服务与容器安全的最佳实践
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • echarts花样作死的坑
  • JS笔记四:作用域、变量(函数)提升
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • markdown编辑器简评
  • MySQL几个简单SQL的优化
  • nodejs:开发并发布一个nodejs包
  • spark本地环境的搭建到运行第一个spark程序
  • TypeScript实现数据结构(一)栈,队列,链表
  • Webpack 4 学习01(基础配置)
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 大整数乘法-表格法
  • 服务器之间,相同帐号,实现免密钥登录
  • 如何合理的规划jvm性能调优
  • puppet连载22:define用法
  • Semaphore
  • ​Spring Boot 分片上传文件
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #162 (Div. 2)
  • (03)光刻——半导体电路的绘制
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (pojstep1.3.1)1017(构造法模拟)
  • (vue)页面文件上传获取:action地址
  • (纯JS)图片裁剪
  • (独孤九剑)--文件系统
  • (二)windows配置JDK环境
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (九)c52学习之旅-定时器
  • (九)信息融合方式简介
  • (南京观海微电子)——示波器使用介绍