Context
1 | class App extends React.Component { |
使用 Context
1 | // Context 可以让我们无须明确地传遍每一个组件,就能将值深入传递进组件树。 |
注意:如果只是想避免层层传递属性,组件组合可能是更好的解决方案
API
[React.createContext]
[Context.Provider]
一个 Provide 可以和多个消费组件有对应关系,多个 Provide 可以嵌套使用,里层数据覆盖外层
当 Provide 的 value 值发生改变时,内部所有的消费组件都会重新渲染
Provider 及其内部 consumer 组件都不受制于 shouldComponentUpdate
函数,因此当 consumer 组件在其祖先组件退出更新的情况下也能更新
[Class.contextType]
1 | class MyClass extends React.Component { |
挂载在 class 上的 contextType
属性会被重赋值为 Context 对象,类组件可以通过 this.context
消费最近的 context 值,可以在任何生命周期中访问,包括 render
[Context.Consumer]
React 组件也可以订阅到 context 变更,在函数式组件中完成订阅 context
[Context.displayName]
context 对象接受一个名为 displayName 的 property,类型为字符串
注意事项:
context 会使用参考标识(reference identity)来决定何时进行渲染,Provide 的 value 值最好是基本数据类型或内存地址
错误边界
UI 的 javascript 错误不应该导致整个应用崩溃。错误边界
是一种 React 组件,可以捕获并打印发生在子组件树任何位置的 javascript 错误,并且提供备用UI渲染
无法捕获的错误:
- 事件处理
- 异步代码
- 服务端渲染
- 自身错误
使用方法:
class 组件中定义了 static getDerivedStateFromError()
或 componentDidCatch()
这两个生命周期方法中的任意一个(或两个)时,那么它就变成一个错误边界。前者 渲染备用 UI,后者打印错误信息
只有 class 组件才可以成为错误边界组件
1 | class ErrorBoundary extends React.Component { |
Refs 转发
React.forwardRef 来获取传递给它的 ref
1 | const FancyButton = React.forwardRef((props, ref) => ( |