React.jscheatsheet
React 代码示例
贡献者:lele88lala,BAI, 校对: BAI
组件
JSXimport React from "react";import ReactDOM from "react-dom";
JSXclass Hello extends React.Component { render() { return <div className="message-box">Hello {this.props.name}</div>; }}
JSXconst el = document.body;ReactDOM.render(<Hello name="John" />, el);
可以使用 React.js jsfiddle
JSXimport React, { Component } from "react";import ReactDOM from "react-dom";
JSXclass Hello extends Component { ...}
属性(Property)
HTML<video fullscreen="{true}" autoplay="{false}" />
JSXrender () { this.props.fullscreen const { fullscreen, autoplay } = this.props ···}
使用 this.props 获取传递给组件的属性。
详见: Properties
状态(State)
JSXconstructor(props) { super(props) this.state = { username: undefined }}
JSXthis.setState({ username: "bai" });
JSXrender () { this.state.username const { username } = this.state ···}
使用 State (this.state
) 管理动态的数据。
通过 Babel 您可以使用 proposal-class-fields 并去除构造函数。
JSXclass Hello extends Component { state = { username: undefined }; ...}
详见: States
组合嵌套
JSXclass Info extends Component { render() { const { avatar, username } = this.props; return ( <div> <UserAvatar src={avatar} /> <UserProfile username={username} /> </div> ); }}
从 React v16.2.0 开始,Fragment 可以用于返回多个子组件,而无需向 DOM 添加额外的包装节点。
JSXimport React, { Component, Fragment } from "react";class Info extends Component { render() { const { avatar, username } = this.props; return ( <Fragment> <UserAvatar src={avatar} /> <UserProfile username={username} /> </Fragment> ); }}
嵌套组件以分离关注点。
Children
JSX<AlertBox> <h1>You have pending notifications</h1></AlertBox>
JSXclass AlertBox extends Component { render() { return <div className="alert-box">{this.props.children}</div>; }}
每个组件都可以获取到 this.props.children,它包含组件的开始标签和结束标签之间的内容。
默认值
设置默认 props
JSXHello.defaultProps = { color: "blue",};
详见: defaultProps
设置默认 state
JSXclass Hello extends Component { constructor(props) { super(props); this.state = { visible: true }; }}
在constructor()
中设置默认状态。
在没有构造函数的情况下可以使用 [Babel 和 proposal-class-fields.。
JSXclass Hello extends Component { state = { visible: true };}
其它组件
函数式组件
JSXfunction MyComponent({ name }) { return <div className="message-box">Hello {name}</div>;}
函数组件没有状态。此外,它们的props
是以函数的第一个参数的形式来传递的。
Pure Component
JSXimport React, { PureComponent } from 'react'class MessageBox extends PureComponent { ···}
PureComponent 是 React 组件性能优化的版本,如果 props 或者 state 不变的话不进行渲染。 详见: Pure components
组件 API
..this.forceUpdate();
..this.setState({ ... })this.setState(state => { ... })
JSXthis.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 元素
参考
JSXclass MyComponent extends Component { render() { return ( <div> <input ref={(el) => (this.input = el)} /> </div> ); } componentDidMount() { this.input.focus(); }}
允许访问 DOM 元素
详见: Refs and the DOM
DOM 事件
JSXclass 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" />
JSXclass VideoPlayer extends Component { render() { return <VideoEmbed {...this.props} />; }}
将 src =“ ...” 向下传递到子组件。
顶层 API
..React.createClass({ ... })React.isValidElement(c)
JSXReactDOM.render(<Component />, domnode, [callback]);ReactDOM.unmountComponentAtNode(domnode);
JSXReactDOMServer.renderToString(<Component />);ReactDOMServer.renderToStaticMarkup(<Component />);
还有很多 API,仅列出的几种最常见的。
JSX 模式
Style 简写
JSXconst style = { height: 10 };return <div style={style}></div>;
JSXreturn <div style={{ margin: 0, padding: 0 }}></div>;
详见: Inline styles
Inner HTML
JSXfunction markdownify() { return "<p>...</p>";}<div dangerouslySetInnerHTML={{ __html: markdownify() }} />;
列表
JSXclass 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
JSrender () { // Don't forget the keys! return [ <li key="A">First item</li>, <li key="B">Second item</li> ]}
Fragments
JSrender () { // Fragments don't require keys! return ( <Fragment> <li>First item</li> <li>Second item</li> </Fragment> )}
返回字符串
JSrender() { return 'Look ma, no spans!';}
可以直接返回一个字符串
Errors
JSclass MyComponent extends Component { ··· componentDidCatch (error, info) { this.setState({ error }) }}
通过componentDidCatch
捕获 errors。 (React 16+)
Portals
JSrender () { return React.createPortal( this.props.children, document.getElementById('menu') )}
它可以把this.props.children
渲染到 DOM 中的任何位置
查看: Portals
Hydration
JSconst el = document.getElementById("app");ReactDOM.hydrate(<App />, el);
与 render()
相同,但它用于在 ReactDOMServer
渲染的容器中对 HTML 的内容进行 hydrate 操作
查看: Hydrate
属性验证
PropTypes
JSimport PropTypes from "prop-types";
查看: Typechecking with PropTypes
Key | Description |
---|---|
any |
基础类型
Key | Description |
---|---|
string | |
number | |
func | |
bool | true 或 false |
枚举
Key | Description |
---|---|
oneOf (any) | |
oneOfType (type array) |
数组
Key | Description |
---|---|
array | |
arrayOf (...) |
对象
Key | Description |
---|---|
object | |
objectOf (...) | 指定确定类型的对象 |
instanceOf (...) | 指定一个类的实例 |
shape (...) |
元素
Key | Description |
---|---|
element | React 元素 |
node | DOM 节点 |
是否必需
Key | Description |
---|---|
(···).isRequired | Required |
基本类型
JSXMyComponent.propTypes = { email: PropTypes.string, seats: PropTypes.number, callback: PropTypes.func, isClosed: PropTypes.bool, any: PropTypes.any,};
必填类型
JSXMyCo.propTypes = { name: PropTypes.string.isRequired,};
元素类型
JSXMyCo.propTypes = { element: PropTypes.element, node: PropTypes.node,};
枚举 (oneOf)
JSXMyCo.propTypes = { direction: PropTypes.oneOf(["left", "right"]),};
数组和对象
JSXMyCo.propTypes = { list: PropTypes.array, ages: PropTypes.arrayOf(PropTypes.number), user: PropTypes.object, user: PropTypes.objectOf(PropTypes.number), message: PropTypes.instanceOf(Message),};
JSXMyCo.propTypes = { user: PropTypes.shape({ name: PropTypes.string, age: PropTypes.number, }),};
用 .array[Of]
, .object[Of]
, .instanceOf
, .shape
.
自定义校验
JSXMyCo.propTypes = { customProp: (props, key, componentName) => { if (!/matchme/.test(props[key])) { return new Error("Validation failed!"); } },};
另见
- React website (reactjs.org)
- React cheatsheet (reactcheatsheet.com)
- Awesome React (github.com)
- React v0.14 cheatsheet Legacy version