API
ReactDOM
render
将虚拟 DOM 渲染为真实的 DOM
ReactDOM.render();组件
函数组件
function Home() { return <div></div>;}function Home(props) { return <div></div>;}
// 函数状态组件为 useState类组件
export class Home extends React.Component { render() { return <div>hello word</div>; }}export class Home extends React.Component { constructor() { this.state = {}; }
render() { return <div>hello word</div>; }}代码分割和异步组件
由打包工具自动完成代码分割,例如 webpack,rollup,对于 babel,则需要额外使用插件,例如 babel-plugin-syntax-dynamic-import
React.lazy 和 Suspense
React.lazy 只支持默认导出
const c = React.lazy(() => import(xxx));
// 然后使用 Suspense 包裹<Suspense fallback={<div>loading</div>}> <Home name="keven" /></Suspense>;Context
对于需要逐层传递的值,例如语言、颜色、主题等等,React 提供类似组件共享的方式
// 对于类组件export const ThemeContext = React.createContext("dark");ThemeContext.displayName = "xx"; // react dev tools 使用该 name 来确定 context 显示内容
<ThemeContext.Provider value="light"> <Home /></ThemeContext.Provider>;
export default class Home extends React.Component { static contextType = ThemeContext; // 后续的方法内可以通过 this.context 来访问}// 函数组件
export default function Home() { return <ThemeContext.Consumer>{(value) => value}</ThemeContext.Consumer>;}错误边界
捕获错误,无法捕获如下错误
- 事件处理的错误
- 异步代码
- 服务端渲染
- 它自身的报错,而非子组件的报错
class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; }
static getDerivedStateFromError(error) { // 更新 state 使下一次渲染能够显示降级后的 UI return { hasError: true }; }
componentDidCatch(error, errorInfo) { // 你同样可以将错误日志上报给服务器 logErrorToMyService(error, errorInfo); }
render() { if (this.state.hasError) { // 你可以自定义降级后的 UI 并渲染 return <h1>Something went wrong.</h1>; } return this.props.children; }}Ref
可以访问本组件、其他组件的元素,直接操作 DOM
// 父组件const ref = React.createRef(); // 在子组件赋值后,可以父组件内通过 ref.current 操作DOM
<Child ref={ref}></Child>;
// 子组件const Child = React.forwardRef((props, ref) => { return <div ref={ref}>点击我</div>; // 此时 ref的current为div,可以直接操作DOM});Fragments 和 <></>
节点不会渲染,类似于 vue 的 template
JSX
function Home(props) {}- 对于 react jsx 标签,不能在运行时选择类型,但是可以预先赋值
<home[attr]> // 这是要报错的</home[attr]>
const Attr = home[attr];
<attr> // 这是可以的</attr>- props 可以对象解构
- props 未指定值时,传值为 true
- props.children 为传递的子元素
<div> {props.children} </div>- false, null, undefined, and true 是合法的子元素。但它们并不会被渲染
Props
可分为函数组件 props 和 class 组件 props
PropTypes
使用 PropTypes 对 props 检查
Greeting.propTypes = { name: PropTypes.string,};Portals
提供了将子组件渲染至父组件之外的地方,譬如悬浮框,对话卡等等
export const Home = () => { return ReactDOM.createPortal( Frame(), // 接收React Component document.getElementById('root2') )}
export function Frame() { return ( <div id="frame"> hello frame </div> )}`