热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

React组件基础三

一.props用法组件是封闭的,要接收外部数据应该通过props来实现props的作用:接收传递给组件的数据传递数据:给组件标签添加属性接收数据:函数组件通过参数props接收数据

一.props用法



  • 组件是封闭的,要接收外部数据应该通过props来实现



  • props的作用:接收传递给组件的数据



  • 传递数据:给组件标签添加属性



  • 接收数据:函数组件通过参数props接收数据,类组件通过this.props接收数据




函数组件props用法:

//子组件
function Hello(props) {
console.log(props)
return (

接收到数据:{props.name}

)
}
//父组件

类组件props用法:

//子组件
class Hello extends React.Component {
render() {
return (

接收到的数据:{this.props.age}

)
}
}
//父组件

props的特点:



  • 可以给组件传递任意类型的数据



  • props是只读的,不允许修改props的数据,单向数据流



  • 注意:在类组件中使用的时候,需要把props传递给super(),否则构造函数无法获取到props



class Hello extends React.Component {
constructor(props) {
// 推荐将props传递给父类构造函数
super(props)
}
render() {
return

接收到的数据:{this.props.age}

}
}

props组件深入:


1.children属性:

描述:表示该组件的子节点,只要组件有子节点,props就有该属性。

注意:children 属性与普通的props一样,值可以是任意值(文本、React元素、组件,甚至是函数)

function Hello(props) {
return (


该组件的子节点:{props.children}

)
}
我是子节点 

2.props校验



  • 目的:校验接收的props的数据类型,增加组件的健壮性

  • 对于组件来说,props是外来的,无法保证组件使用者传入什么格式的数据

  • 如果传入的数据格式不对,可能会导致组件内部报错。组件的使用者不能很明确的知道错误的原因。

  • props校验允许在创建组件的时候,就约定props的格式、类型等

使用步骤:



  1. 安装包 prop-types (yarn add prop-types / npm i props-types)



  2. 导入 prop-types 包



  3. 使用组件名.propTypes = {} 来给组件的props添加校验规则



  4. 校验规则通过 PropTypes 对象来指定



import PropTypes from 'prop-types'
function App(props) {
return (
Hi, {props.colors}
)
}
App.propTypes = {
// 约定colors属性为array类型
// 如果类型不对,则报出明确错误,便于分析错误原因
colors: PropTypes.array
}

约束规则:



  1. 常见类型:array、bool、func、number、object、string



  2. React元素类型:element



  3. 必填项:isRequired



  4. 特定结构的对象:shape({ })




3.props默认值

给 props 设置默认值,在未传入 props 时生效

function App(props) {
return (


此处展示props的默认值:{props.pageSize}

)
}
// 设置默认值
App.defaultProps = {
pageSize: 10
}
// 不传入pageSize属性

二.组件通讯

组件是独立且封闭的单元,默认情况下,只能使用组件自己的数据。在组件化过程中,我们将一个完整的功能 拆分成多个组件,以更好的完成整个应用的功能。而在这个过程中,多个组件之间不可避免的要共享某些数据为了实现这些功能,就需要打破组件的独立封闭性,让其与外界沟通。这个过程就是组件通讯


2.1组件通讯三种方式



  • 父传子



  • 子传父



  • 非父子




2.2.1 父传子



  1. 父组件提供要传递的state数据



  2. 给子组件标签添加属性,值为 state 中的数据



  3. 子组件中通过 props 接收父组件中传递的数据



//父组件提供数据并且传递给子组件
class Parent extends React.Component {
state = { lastName: '王' }
render() {
return (


传递数据给子组件:

)
}
}
//子组件接收数据
function Child(props) {
return
子组件接收到数据:{props.name}

}

2.2.2 子传父



  1. 父组件提供一个回调函数(用于接收数据)



  2. 将该函数作为属性的值,传递给子组件



  3. 子组件通过 props 调用回调函数



  4. 将子组件的数据作为参数传递给回调函数\



// 父组件提供函数并且传递给子组件
class Parent extends React.Component {
getChildMsg = (msg) => {
console.log('接收到子组件数据', msg)
}
render() {
return (


子组件:

)
}
}
//子组件接收函数并且调用
class Child extends React.Component {
state = { childMsg: 'React' }
handleClick = () => {
this.props.getMsg(this.state.childMsg)
}
return (

)
}

2.2.3 非父子



  • 将共享状态提升到最近的公共父组件中,由公共父组件管理这个状态



  • 思想:状态提升



  • 公共父组件职责:



    • 提供共享状态



    • 提供操作共享状态的方法





  • 要通讯的子组件只需通过 props 接收状态或操作状态的方法 




2.2 跨组件通讯-context


实现步骤:

1.调用 React. createContext() 创建 Provider(提供数据) 和 Consumer(消费数据) 两个组件。

const { Provider, Consumer } = React.createContext()

2.使用 Provider 组件作为父节点。





3.设置 value 属性,表示要传递的数据。

4.调用 Consumer 组件接收数据。


{data => data参数表示接收到的数据 -- {data}}

总结:



  1. 如果两个组件是远方亲戚(比如,嵌套多层)可以使用Context实现组件通讯



  2. Context提供了两个组件:Provider 和 Consumer



  3. Provider组件:用来提供数据



  4. Consumer组件:用来消费数据



 



推荐阅读
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
author-avatar
手机用户2602880745
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有