ctrlcv-dev.comgithub

React.jscheatsheet

React 代码示例

贡献者:lele88lala,BAI, 校对: BAI

组件

JSX
import React from "react";
import ReactDOM from "react-dom";
JSX
class Hello extends React.Component {
render() {
return <div className="message-box">Hello {this.props.name}</div>;
}
}
JSX
const el = document.body;
ReactDOM.render(<Hello name="John" />, el);

可以使用 React.js jsfiddle

JSX
import React, { Component } from "react";
import ReactDOM from "react-dom";
JSX
class Hello extends Component {
...
}

属性(Property)

HTML
<video fullscreen="{true}" autoplay="{false}" />
JSX
render () {
this.props.fullscreen
const { fullscreen, autoplay } = this.props
···
}

使用 this.props 获取传递给组件的属性。

详见: Properties

状态(State)

JSX
constructor(props) {
super(props)
this.state = { username: undefined }
}
JSX
this.setState({ username: "bai" });
JSX
render () {
this.state.username
const { username } = this.state
···
}

使用 State (this.state) 管理动态的数据。

通过 Babel 您可以使用 proposal-class-fields 并去除构造函数。

JSX
class Hello extends Component {
state = { username: undefined };
...
}

详见: States

组合嵌套

JSX
class Info extends Component {
render() {
const { avatar, username } = this.props;
return (
<div>
<UserAvatar src={avatar} />
<UserProfile username={username} />
</div>
);
}
}

从 React v16.2.0 开始,Fragment 可以用于返回多个子组件,而无需向 DOM 添加额外的包装节点。

JSX
import React, { Component, Fragment } from "react";
class Info extends Component {
render() {
const { avatar, username } = this.props;
return (
<Fragment>
<UserAvatar src={avatar} />
<UserProfile username={username} />
</Fragment>
);
}
}

嵌套组件以分离关注点。

查看: Composing Components

Children

JSX
<AlertBox>
<h1>You have pending notifications</h1>
</AlertBox>
JSX
class AlertBox extends Component {
render() {
return <div className="alert-box">{this.props.children}</div>;
}
}

每个组件都可以获取到 this.props.children,它包含组件的开始标签和结束标签之间的内容。

默认值

设置默认 props

JSX
Hello.defaultProps = {
color: "blue",
};

详见: defaultProps

设置默认 state

JSX
class Hello extends Component {
constructor(props) {
super(props);
this.state = { visible: true };
}
}

constructor()中设置默认状态。

在没有构造函数的情况下可以使用 [Babel 和 proposal-class-fields.。

JSX
class Hello extends Component {
state = { visible: true };
}

详见: Setting the default state

其它组件

函数式组件

JSX
function MyComponent({ name }) {
return <div className="message-box">Hello {name}</div>;
}

函数组件没有状态。此外,它们的props是以函数的第一个参数的形式来传递的。

详见: Function and Class Components

Pure Component

JSX
import React, { PureComponent } from 'react'
class MessageBox extends PureComponent {
···
}

PureComponent 是 React 组件性能优化的版本,如果 props 或者 state 不变的话不进行渲染。 详见: Pure components

组件 API

..
this.forceUpdate();
..
this.setState({ ... })
this.setState(state => { ... })
JSX
this.state;
this.props;

这些方法和属性可以用于组件实例。 详见: Component API

生命周期

组件加载

方法说明
constructor (props)在渲染之前 #
render()渲染 【#
componentDidMount()在渲染之后(DOM 可用的状态) #
componentWillUnmount()在 DOM 移除之前 #
componentDidCatch()Catch errors (16+) #

constructor() 中设置初始状态。

componentDidMount()上添加 DOM 事件处理程序,计时器(等),然后在componentWillUnmou()上删除它们。

组件更新

方法说明
componentDidUpdate (prevProps, prevState, snapshot)可以在这里使用 setState() 方法,记得比较 props 的值
shouldComponentUpdate (newProps, newState)当返回 fasle 的时候会跳过 render 渲染
render()Render
componentDidUpdate (prevProps, prevState)Operate on the DOM here

当父级组件属性更改和调用.setState()时。在初始渲染的时候不会被调用。

详见: Component specs

DOM 元素

参考

JSX
class MyComponent extends Component {
render() {
return (
<div>
<input ref={(el) => (this.input = el)} />
</div>
);
}
componentDidMount() {
this.input.focus();
}
}

允许访问 DOM 元素

详见: Refs and the DOM

DOM 事件

JSX
class MyComponent extends Component {
render() {
<input
type="text"
value={this.state.value}
onChange={(event) => this.onChange(event)}
/>;
}
onChange(event) {
this.setState({ value: event.target.value });
}
}

传递函数至属性中,例如上述 onChange

详见: Events

其他特性

传递 props

HTML
<VideoPlayer src="video.mp4" />
JSX
class VideoPlayer extends Component {
render() {
return <VideoEmbed {...this.props} />;
}
}

将 src =“ ...” 向下传递到子组件。

详见: Transferring props

顶层 API

..
React.createClass({ ... })
React.isValidElement(c)
JSX
ReactDOM.render(<Component />, domnode, [callback]);
ReactDOM.unmountComponentAtNode(domnode);
JSX
ReactDOMServer.renderToString(<Component />);
ReactDOMServer.renderToStaticMarkup(<Component />);

还有很多 API,仅列出的几种最常见的。

详见: React top-level API

JSX 模式

Style 简写

JSX
const style = { height: 10 };
return <div style={style}></div>;
JSX
return <div style={{ margin: 0, padding: 0 }}></div>;

详见: Inline styles

Inner HTML

JSX
function markdownify() {
return "<p>...</p>";
}
<div dangerouslySetInnerHTML={{ __html: markdownify() }} />;

详见: Dangerously set innerHTML

列表

JSX
class TodoList extends Component {
render() {
const { items } = this.props;
return (
<ul>
{items.map((item) => (
<TodoItem item={item} key={item.key} />
))}
</ul>
);
}
}

列表项需要包含一个 key 属性

条件渲染

JSX
<Fragment>{showMyComponent ? <MyComponent /> : <OtherComponent />}</Fragment>

短路求值(Short-circuit evaluation)

JSX
<Fragment>
{showPopup && <Popup />}
...
</Fragment>

新特性

返回多个元素

您可以将多个元素作为 arrays 或 fragments 返回。

Arrays

JS
render () {
// Don't forget the keys!
return [
<li key="A">First item</li>,
<li key="B">Second item</li>
]
}

Fragments

JS
render () {
// Fragments don't require keys!
return (
<Fragment>
<li>First item</li>
<li>Second item</li>
</Fragment>
)
}

详见: Fragments and strings

返回字符串

JS
render() {
return 'Look ma, no spans!';
}

可以直接返回一个字符串

See: Fragments and strings

Errors

JS
class MyComponent extends Component {
···
componentDidCatch (error, info) {
this.setState({ error })
}
}

通过componentDidCatch捕获 errors。 (React 16+)

详见: Error handling in React 16

Portals

JS
render () {
return React.createPortal(
this.props.children,
document.getElementById('menu')
)
}

它可以把this.props.children渲染到 DOM 中的任何位置

查看: Portals

Hydration

JS
const el = document.getElementById("app");
ReactDOM.hydrate(<App />, el);

render() 相同,但它用于在 ReactDOMServer 渲染的容器中对 HTML 的内容进行 hydrate 操作

查看: Hydrate

属性验证

PropTypes

JS
import PropTypes from "prop-types";

查看: Typechecking with PropTypes

KeyDescription
any

基础类型

KeyDescription
string
number
func
booltrue 或 false

枚举

KeyDescription
oneOf(any)
oneOfType(type array)

数组

KeyDescription
array
arrayOf(...)

对象

KeyDescription
object
objectOf(...)指定确定类型的对象
instanceOf(...)指定一个类的实例
shape(...)

元素

KeyDescription
elementReact 元素
nodeDOM 节点

是否必需

KeyDescription
(···).isRequiredRequired

基本类型

JSX
MyComponent.propTypes = {
email: PropTypes.string,
seats: PropTypes.number,
callback: PropTypes.func,
isClosed: PropTypes.bool,
any: PropTypes.any,
};

必填类型

JSX
MyCo.propTypes = {
name: PropTypes.string.isRequired,
};

元素类型

JSX
MyCo.propTypes = {
element: PropTypes.element,
node: PropTypes.node,
};

枚举 (oneOf)

JSX
MyCo.propTypes = {
direction: PropTypes.oneOf(["left", "right"]),
};

数组和对象

JSX
MyCo.propTypes = {
list: PropTypes.array,
ages: PropTypes.arrayOf(PropTypes.number),
user: PropTypes.object,
user: PropTypes.objectOf(PropTypes.number),
message: PropTypes.instanceOf(Message),
};
JSX
MyCo.propTypes = {
user: PropTypes.shape({
name: PropTypes.string,
age: PropTypes.number,
}),
};

.array[Of], .object[Of], .instanceOf, .shape.

自定义校验

JSX
MyCo.propTypes = {
customProp: (props, key, componentName) => {
if (!/matchme/.test(props[key])) {
return new Error("Validation failed!");
}
},
};

另见