React的顶层API有哪些()
一、简介
React库提供了如下API,可直接调用。
二、创建元素
1、createElement()
- 功能:创建 React 元素。
// 函数原型 React.createElement( type, [props], [...children] )
- 【React的顶层API有哪些()】两种创建元素的方式:
- 使用JSX来创建元素,不需要调用createElement(),预处理器babel会处理
// 使用jsx创建元素和组件 class Hello extends React.Component { render() { return Hello {this.props.toWhat}; } }ReactDOM.render( , document.getElementById('root') );
- 不使用JSX来创建元素,就需要调用createElement()
// 不使用jsx创建元素和组件 class Hello extends React.Component { render() { return React.createElement('div', null, `Hello ${this.props.toWhat}`); } }ReactDOM.render( React.createElement(Hello, { toWhat: 'World' }, null), document.getElementById('root') );
- 使用JSX来创建元素,不需要调用createElement(),预处理器babel会处理
- 功能:复制生成一个新元素。
// 函数原型 React.cloneElement( element, [config], [...children] ) // config :含新的 props,key 或 ref
- 等同于jsx
React.cloneElement() // 几乎等同于下面jsx写法 < element.type {...element.props } {...props }> { children }
true
或 false
。React.isValidElement(object)
四、子元素操作API React.Children功能:可以遍历访问子元素,同时可以访问到属性
this.props.children
,无法访问到的数据。1、React.Children.map
- 功能:遍历子元素,并返回一个数组。函数原型如下:
React.Children.map(children, function)
- 使用实例:遍历并复制子元素
const Child = () => ( child )class App extends React.Component { render() { const template1 = React.Children.map(this.props.children, (child) => { return React.cloneElement(child); }); return template1; } }
- 功能:与React.Children.map一样作用,区别是返回值不是数组。
React.Children.forEach(children, function)
- 功能:返回 children 中的组件总数量,等同于通过 map 或 forEach 调用回调函数的次数。
React.Children.count(children)
- 功能:验证 children 是否只有一个子节点(React元素),如果有则返回它,否则此方法会抛出错误。
React.Children.only(children)
- 注意点:React.Children.only() 不接受 React.Children.map() 的返回值,因为它是一个数组而并不是 React 元素。
- 功能:使用 ES6 classes 方式定义 React 组件的基类:
class Greeting extends React.Component { render() { return Hello, {this.props.name}; } }
- 功能:与React.Component 一样,都可以继承他们来实现组件。
- 区别:React.PureComponent 实现了 shouldComponentUpdate(),而 React.Component 没有。React.PureComponent 只有在 prop 和 state 数据变化时,才进行组件渲染,可用于组件性能优化。
- 两点注意:
- 确定 prop 和 state 数据是否变化时,会进行比较操作,这个比较操作只适合简单数据结构,不适用于复杂数据结构,请确保 prop 和state 对象不是复杂数据结构。
- 确保 子组件 也都继承 React.PureComponent。
- 功能:是一个高阶组件,可以包裹其他组件来提高性能。
- 原理:React.memo 会监控组件的 props 属性的变化,只有变化才重新渲染,否则跳过渲染操作。
const MyComponent = React.memo(function MyComponent(props) { /* 使用 props 渲染 */ });
- 两点注意:
- 如果 React.memo 组件中使用了 useState、useContext,那么state、context 数值改变时,React.memo 组件也会重新渲染。
- React.memo 无法监控复杂数据结构props的变化,需要自定义比较函数来实现对复杂数据结构的监控。
function MyComponent(props) { /* 使用 props 渲染 */ } function areEqual(prevProps, nextProps) { /* 如果把 nextProps 传入 render 方法的返回结果与 将 prevProps 传入 render 方法的返回结果一致则返回 true, 否则返回 false */ } export default React.memo(MyComponent, areEqual);
1、React.lazy
- 功能:延迟加载未用到的组件,依赖
React.Suspense
// 这个组件是动态加载的 const SomeComponent = React.lazy(() => import('./SomeComponent'));
- 注意:使用
React.lazy
的动态引入特性需要 JS 环境支持 Promise。在 IE11 及以下版本的浏览器中需要通过引入 polyfill 来使用该特性。
- 名称:指定加载指示器(loading indicator)
- 功能:配合上
React.lazy
完成延迟加载。
// 该组件是动态加载的 const OtherComponent = React.lazy(() => import('./OtherComponent')); function MyComponent() { return ( // 显示组件直至 OtherComponent 加载完成
); }
- 功能:不额外创建 DOM 元素的情况下,让
render()
返回多个元素。使用详情,看这里
- 功能:创建 ref 对象,指向组件,让其他组件方便访问其内部数据和方法。使用详情,看这里
- 功能:React.forwardRef 会创建一个React组件,新组件可以把传递进来的 ref 对象,转发给子元素。
- 两种使用场景:
转发 refs 到 DOM 组件
、在高阶组件中转发 refs
。详情,看这里
- React的顶层API有哪些?
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量