React传-2
Suspense 与 lazy
在src/React.js
里,有几个组件长得比较奇怪。
Fragment: REACT_FRAGMENT_TYPE, |
它们都是一个symbol常量,作为一种标识,现在暂时占个位,之后看到再回来补。
直接看lazy代码
export function lazy<T, R>(ctor: () => Thenable<T, R>): LazyComponent<T> { |
传入一个Thenable函数,Thenable代表promise,最终返回一个LazyComponent类型的组件。
createContext
context 提供了一种在 组件之间共享此类值 的方式,使得我们无需每层显式添加 props 或传递组件 ,就能够实现在 组件树中传递数据 。
使用方式
const { Provider,Consumer } = React.createContext('default'); |
React.createContext 的第一个参数是 defaultValue,代表默认值,除了可以设置默认值外,它还可以让开发者手动控制更新粒度的方式,第二个参数calculateChangedBits,接受 newValue 与 oldValue 的函数,返回值作为 changedBits,在 Provider 中,当 changedBits = 0,将不再触发更新,而在 Consumer 中有一个不稳定的 props,unstable_observedBits,若 Provider 的changedBits & observedBits = 0,也将不触发更新。
以下是完整的测试用例
// From React v16.11.0 release react-reconciler/src/__tests__/ReactNewContext-test.internal.js |
源码
export function createContext<T>( |
forwardRef
forwardRef用来转发ref,前面说到过,createElement在创建ReactElement的时候回将ref过滤掉,而当custom组件是无法接收到ref,所以需要做一层转发。
使用方式
function App(){ |
这样就可以通过转发拿到input
节点。
源码
export default function forwardRef<Props, ElementType: React$ElementType>( |
如果只看react
部分的源码貌似没有什么头绪,因为大部分处理逻辑都在react-dom
和 react-reconciler
里面.
memo
memo会返回一个纯化(purified)的组件MemoFuncComponent,它的作用等同于PureComponent,只不过前者用于函数组件,后者用于类组件。
function App(){ |
react会自动对props的值做Object.is
比较,如果此次的值与上次的值不一样,则更新,否则不更新。也可以自定义比较方法,当compare函数返回true时代表更新,false则不更新。
const MyInput = memo((props)=>{ |
源码
export default function memo<Props>( |
当compare
为null
时代表默认Object.is
比较。