组件可以将 UI 切分成一些独立的、可复用的部件,这样你就只需专注于构建每一个单独的部件。
组件从概念上看就像是函数,它可以接收任意的输入值(称之为“props”),并返回一个需要在页面上展示的 React 元素
react 组件的名称,首字母一律大写,并且使用驼峰写法
类定义组件
- state
- props
- lifecircle
如果没有组件私有状态(state)需要去定义,根据 es6 class 的原则,可以省略不写 constructor
1 | import React from "react"; |
组件&纯组件
用户进行操作时数据时,通过生命周期钩子函数 **shouldComponentUpdate **判断新值与旧值是否一致来确定是否更新模版。
这样可以减少页面重绘和回流,提升用户体验、网站性能。
由于大量的判断也很繁琐,我们可以通过PureComponent定义组件,完成上述效果。
1 | import React, { Component, PureComponent } from "react"; |
函数式组件
函数式组件又被称为无状态组件(下文一律称-无状态组件)
该函数是一个有效的 React 组件,它接收一个单一的“props”对象并返回了一个 React 元素
我们之所以称这种类型的组件为函数定义组件,是因为从字面上来看,它就是一个 JavaScript 函数。
定义组件时,render 返回的 jsx 模板如果有多个子节点,那么给组件的根节点元素最好用小括号包起来
特点
- 没有生命周期钩子函数
- 没有 state
- 没有 this
- 必须返回一段 jsx 代码
1 | const ProductList = (props) => { |
es5 创建组件
1 | var ProductList = React.createClass({ |
注意事项
- 无状态组件 prop 不要通过 this.props 来调用
- 无状态组件没有生命周期
- 无状态组件不能定义定义状态(state)
- 无状态组件不能实例化,组件名不能被 new
- 无状态组件只能返回一个根节点元素
- 类组件 render 函数,只能返回一个根节点元素
- 类组件如果显式的声明了 constructor, 必须调用 super
组件属性
- 内部属性-state
this.state.name=”123” ❌ 不可以直接修改如果修改了不会发生页面重绘
需要通过 this.setState() 对号
props
- 动态 props
- 静态 props
PropTypes 类型检查
为什么需要类型检查?
JavaScript 是一门弱类型的语言,允许变量类型做隐式转换。也正是因为这个特性,JavaScript 中有很多错误都是类型错误导致的。为了减少这种错误,我们可以在 React 中引入类型检查模块。
React 中的类型检查:prop-types 包
例子
- 导入包
1 | import PropTypes from "prop-types"; |
- 编写组件
1 | class Greeting extends React.Component { |
- 新增类型检查
1 | Greeting.propTypes = { |
- 检验类型检查
- 把 Greeting 组件的属性 name 设置成 String 类型,也就是说父组件通过该属性传递数据的时候,需要传递 String 类型的数据,否则会显示类型错误的警告。
我们可以尝试传递一个数字类型的属性:
1 | <div> |
可以看到页面中会出现类型错误的警告:
PropTypes 包含一整套验证器,可用于确保接收的数据是有效的。在上面的示例中,我们使用了 PropTypes.string。
出于性能原因,propTypes 只在开发模式下进行检查。
1 | import PropTypes from "prop-types"; |
使用 PropTypes.element 限制单个元素
- 可以通过 PropTypes.element 来确保传递给组件的 children 中只包含一个元素。
1 | import PropTypes from "prop-types"; |
this.props.children 是父组件在 MyComponent 中添加的子节点,当 children 包含多个兄弟节点,而不是只有一个节点时,会打印错误警告。
属性默认值
- 可以通过配置 defaultProps 为 Props 定义默认值:
1 | class Greeting extends React.Component { |
如果正在使用像 transform-class-properties 的 Babel 转换工具,也可以在 React 组件类中声明 defaultProps 作为静态属性。
1 | class Greeting extends React.Component { |
defaultProps 用来确保 this.props.name 在父组件没有特别指定的情况下,有一个初始值。类型检查发生在 defaultProps 赋值之后,所以类型检查也会应用在 defaultProps 上面,我们也需要保证所设置的默认值符合类型检查设定的类型。
函数组件
如果在常规开发中使用函数组件,那可能需要做一些适当的改动,以保证 PropsTypes 应用正常。
假设你有如下组件:
1 | export default function HelloWorldComponent({ name }) { |
如果要添加 PropTypes,你可能需要在导出之前以单独声明的一个函数的形式,声明该组件,具体代码如下:
1 | function HelloWorldComponent({ name }) { |
接着,可以直接在 HelloWorldComponent 上添加 PropTypes:
1 | import PropTypes from "prop-types"; |
- Post link: https://blog.gaocaipeng.com/2020/04/15/izozrg/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.