React 其他笔记

React 其他笔记

一月 24, 2021

高阶组件

  1. 什么是高阶组件?
    • 高阶组件(HOC)是 React 中用于 【复用组件逻辑】 的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。
    • HOC 是 High Order Component 的简写
    • 白话解释: 比如有 100 个组件,这 100 个组件中有些逻辑是相似的,所以我们把这个相似的可以封装在高阶组件中,以便复用
  2. 高阶组件的特点
    • 高阶组件(.tsx)是一个函数
      • 参数 是 一个 组件
      • 返回值也是 一个 组件

制作 HOC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// HOC.tsx
//todo 封装一个高阶组件

//! 高阶组件是一个函数

//! 高阶组件名称中开头以 with
import React, { ReactNode } from "react";
export const withForwardRef = (Comp: any) => {
//todo 接收组件作为参数
//todo 返回值是一个新组件
return class _ extends React.Component {
//todo 多个组件复用的逻辑就可以写这里

fn = () => {
//todo 复用逻辑
console.log("一万行复用逻辑");
};

render() {
// 将复用的逻辑绑定在传入的组件身上
return <Comp fn={this.fn} />;
}
};
};

复用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// App.tsx
import React from "react";
import Tab from "./components/Tab";
import Content from "./components/Content";
import { withForwardRef } from "./hoc";

const HocTab = withForwardRef(Tab);
const HocContent = withForwardRef(Content);

export default function App() {
return (
<div>
<h3> 高阶组件 </h3>
<HocTab />
<HocContent />
</div>
);
}

Fragment(片段)

  1. 将组件的某一个部分抽离出来
  2. 可以将列表分组
1
2
3
4
5
6
7
8
9
10
11
12
import React from "react";
import Hello from "./Hello";

export default function App() {
return (
<div>
<ul>
<Hello />
</ul>
</div>
);
}
1
2
3
4
5
6
7
8
9
10
11
12
import React, { Fragment } from "react"; // 引入Fragment

export default function Hello() {
return (
<Fragment>
{/* 替代div */}
<li>1</li>
<li>2</li>
<li>3</li>
</Fragment>
);
}

Profiler

测试组件性能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import React, { Profiler } from "react";

export default function App() {
const callback = (
id: any, // 发生提交的 Profiler 树的 “id”
phase: any, // "mount" (如果组件树刚加载) 或者 "update" (如果它重渲染了)之一
actualDuration: any, // 本次更新 committed 花费的渲染时间
baseDuration: any, // 估计不使用 memoization 的情况下渲染整颗子树需要的时间
startTime: any, // 本次更新中 React 开始渲染的时间
commitTime: any, // 本次更新中 React committed 的时间
interactions: any // 属于本次更新的 interactions 的集合
) => {
console.log("id", id);
console.log("phase", phase);
console.log("actualDuration", actualDuration);
console.log("baseDuration", baseDuration);
console.log("startTime", startTime);
console.log("commitTime", commitTime);
console.log("interactions", interactions);
};

return (
<div>
<Profiler id="hello" onRender={callback}>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</Profiler>
</div>
);
}

Protals

可以将某一个元素或者组件渲染到我们制定的容器中

  1. 在 pulic 下的 index.html 文件 加一行 id=“app”的 div
  2. 使用 ReactDDOM.createPortal(组件,容器)
1
2
3
4
5
6
7
8
import React from "react";
import ReactDOM from "react-dom";
import ToolTip from "./ToolTip";

export default function App() {
const app: any = document.querySelector("#app");
return ReactDOM.createPortal(<ToolTip />, app);
}