React API

1. React.createElement():创建并返回指定类型的新React元素

React.createElement(
  type,
  [props],
  [...children]
)

2. React.cloneElement():以 element 元素为样板克隆并返回新的 React 元素

React.cloneElement(
  element,
  [props],
  [...children]
)

返回元素的 props 是将新的 props 与原始元素的 props 浅层合并后的结果。新的子元素将取代现有的子元素,而来自原始元素的 key 和 ref 将被保留。cloneElement()几乎等同于

<element.type {...element.props} {...props}>
  {children}
</element.type>

3. React.createContext():创建一个 Context 对象

interface Context<T> {
      Provider: Provider<T>;
      Consumer: Consumer<T>;
      displayName?: string;
}

 function createContext<T>(
     defaultValue: T,
): Context<T>;

MyContext.Provider允许消费订阅context变化
MyContext.Consumer/React.useContext/this.context使用订阅context变更
context使用介绍

4. React.isValidElement():验证对象是否为 React 元素,返回值为 true 或 false

function isValidElement<P>(
object: {} | null | undefined
): object is ReactElement<P>;

5. React.Children:提供了用于处理 this.props.children 不透明数据结构的实用方法

是一个对象,包括map/forEach/count/only/toArray几个属性

   interface ReactChildren {
        map<T, C>(children: C | C[], fn: (child: C, index: number) => T):
            C extends null | undefined ? C : Array<Exclude<T, boolean | null | undefined>>;
        forEach<C>(children: C | C[], fn: (child: C, index: number) => void): void;
        count(children: any): number;
        only<C>(children: C): C extends any[] ? never : C;
        toArray(children: ReactNode | ReactNode[]): Array<Exclude<ReactNode, boolean | null | undefined>>;
    }
const Children: ReactChildren;
  • React.Children.map(children,function(child,index))
    在 children 里的每个直接子节点上调用一个函数,并将 this 设置为 thisArg。如果 children 是一个数组,它将被遍历并为数组中的每个子节点调用该函数。如果子节点为 null 或是 undefined,则此方法将返回 null 或是 undefined,而不会返回数组
  • React.Children.forEach(children,function(child,index))
    与React.Children.map()类似,但不会返回一个数组
  • React.Children.count(children)
    返回 children 中的组件总数量,等同于通过 mapforEach 调用回调函数的次数。
  • React.Children.only(children)
    验证 children 是否只有一个子节点(一个 React 元素),如果有则返回它,否则此方法会抛出错误
  try {
        React.Children.only(children);
    } catch (err) {
        React.Children.forEach(children, child => {
          console.log(20, child);
        });
    }
  • React.Chidlren.toArray(children)
    将 children 这个复杂的数据结构以数组的方式扁平展开并返回,并为每个子节点分配一个 key。当你想要在渲染函数中操作子节点的集合时,它会非常实用,特别是当你想要在向下传递 this.props.children 之前对内容重新排序或获取子集时

6. React.Fragment:能够在不额外创建 DOM 元素的情况下,让 render() 方法中返回多个元素

可以简写为:<></>

7. React.createRef()/React.forwardRef()

React.createRef(): 类组件中创建Refs
React.forwardRef():是一个高阶组件,接受一个函数组件,返回一个新组件,新的组件中第二个参数为ref
详细内容

8.React.lazy/React.Suspense

React.lazy() :定义一个动态加载的组件
在React.Suspense 组件中渲染 lazy 组件

// 该组件是动态加载的
const OtherComponent = React.lazy(() => import('./OtherComponent'));

function MyComponent() {
  return (
    // 显示 <Spinner> 组件直至 OtherComponent 加载完成
    <React.Suspense fallback={<Spinner />}>
      <div>
        <OtherComponent />
      </div>
    </React.Suspense>
  );
}

fallback 属性接受任何在组件加载过程中想展示的 React 元素

9. React.Component/React.PureComponent/React.memo()

  • React.Component: 定义 React 类组件的基类
  • React.PureComponent:React.Component相似。区别在于React.Component并未实现 shouldComponentUpdate(),React.PureComponent中以浅层对比 prop 和 state 的方式来实现了该函数。
  • React.memo:是一个高阶组件,通过记忆组件渲染结果的方式(浅对比props)来提高组件的性能表现。
    React.memo仅检查 props 变更。如果函数组件被 React.memo 包裹,且其实现中拥有 useState,useReducer或 useContext的 Hook,当 context 发生变化时,它仍会重新渲染。支持第二个参数,传入自定义的比较函数。

10. 各种Hook

useState / useEffect / useContext / useReducer / useCallback / useMemo / useRef / useImperativeHandle / useLayoutEffect / useDebugValue

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容