模板网站制作服务,天津建设网查询分数,中国关键词,做网站哪间好懒加载React.lazy函数能让你像渲染常规组件一样处理动态引入(的组件)。 Suspense加载指示器为组件做优雅降级。 fallback属性接受任何在组件加载过程中你想展示的 React 元素。const OtherComponent React.lazy(() import(./OtherComponent));function MyComponent() { r…懒加载React.lazy函数能让你像渲染常规组件一样处理动态引入(的组件)。 Suspense加载指示器为组件做优雅降级。 fallback属性接受任何在组件加载过程中你想展示的 React 元素。const OtherComponent React.lazy(() import(./OtherComponent));function MyComponent() { return ( Loading...} );}ContextContext提供了一个无需为每层组件手动添加 props就能在组件树间进行数据传递的方法设计目的是为了共享那些对于一个组件树而言是“全局”的数据。// Context 可以让我们无须明确地传遍每一个组件就能将值深入传递进组件树。// 为当前的 theme 创建一个 context(“light”为默认值)。const ThemeContext React.createContext(light);class App extends React.Component { render() { // 使用一个 Provider 来将当前的 theme 传递给以下的组件树。 // 无论多深任何组件都能读取这个值。 // 在这个例子中我们将 “dark” 作为当前的值传递下去。 return ( ); }}// 中间的组件再也不必指明往下传递 theme 了。function Toolbar(props) { return ( ; }}请谨慎使用因为这会使得组件的复用性变差。API:React.createContext 创建一个 Context 对象。当 React 渲染一个订阅了这个 Context 对象的组件这个组件会从组件树中离自身最近的那个匹配的 Provider 中读取到当前的 context 值。只有当组件所处的树中没有匹配到 Provider 时其 defaultValue 参数才会生效。Context.Provider 每个 Context 对象都会返回一个 Provider React 组件它允许消费组件订阅 context 的变化。当 Provider 的 value 值发生变化时它内部的所有消费组件都会重新渲染。Class.contextType 挂载在 class 上的 contextType 属性会被重赋值为一个由 React.createContext() 创建的 Context 对象。这能让你使用 this.context 来消费最近 Context 上的那个值。你可以在任何生命周期中访问到它包括 render 函数中。Context.Consumer 这里React 组件也可以订阅到 context 变更。这能让你在函数式组件中完成订阅 context。RefsRefs 提供了一种方式允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。不能在函数组件上使用 ref 属性因为他们没有实例可以在函数组件内部使用 ref 属性。适合使用 refs 的情况 - 管理焦点文本选择或媒体播放。 - 触发强制动画。 - 集成第三方 DOM 库。使用方法创建 RefsRefs 是使用 React.createRef() 创建的并通过 ref 属性附加到 React 元素。 class MyComponent extends React.Component { constructor(props) { super(props); this.myRef React.createRef(); } render() { return 在 ref 的 current 属性中被访问 const node this.myRef.current;Refs 转发Ref 转发是一项将 ref 自动地通过组件传递到其一子组件的技巧。子组件使用React.forwardRef接收ref。可用于Hoc处理ref。const FancyButton React.forwardRef((props, ref) ( {props.children} ));// 你可以直接获取 DOM button 的 refconst ref React.createRef();Click me!;上例中FancyButton 使用 React.forwardRef 来获取传递给它的 ref然后转发到它渲染的 DOM button。这样使用 FancyButton 的组件可以获取底层 DOM 节点 button 的 ref 并在必要时访问就像其直接使用 DOM button 一样。FragmentsFragments 允许你将子列表分组而无需向 DOM 添加额外节点。key 是唯一可以传递给 Fragment 的属性render() { return ( );}可简写为高阶组件(HOC)HOC是参数为组件返回值为新组件的函数。HOC 不会修改传入的组件也不会使用继承来复制其行为。相反HOC 通过将组件包装在容器组件中来组成新组件。HOC 是纯函数没有副作用。示例// 此函数接收一个组件...function withSubscription(WrappedComponent, selectData) { // ...并返回另一个组件... return class extends React.Component { constructor(props) { super(props); this.handleChange this.handleChange.bind(this); this.state { data: selectData(DataSource, props) }; } componentDidMount() { // ...负责订阅相关的操作... DataSource.addChangeListener(this.handleChange); } componentWillUnmount() { DataSource.removeChangeListener(this.handleChange); } handleChange() { this.setState({ data: selectData(DataSource, this.props) }); } render() { // ... 并使用新数据渲染被包装的组件! // 请注意我们可能还会传递其他属性 return ; } };}上例中class组件为HOC的容器组件容器组件担任分离将高层和低层关注的责任由容器管理订阅和状态并将 prop 传递给处理渲染 UI。HOC 使用容器作为其实现的一部分你可以将 HOC 视为参数化容器组件。注意事项不要在 render 方法中使用 HOC。在render中使用会导致diff 算法在对比组件变化时每次检测都不一样每次渲染都会进行卸载和重新挂载的操作这不仅仅是性能问题 - 重新挂载组件会导致该组件及其所有子组件的状态丢失。务必复制静态方法到容器组件上。可以使用hoist-non-react-statics自动拷贝所有非 React 静态方法 import hoistNonReactStatic from hoist-non-react-statics; function enhance(WrappedComponent) { class Enhance extends React.Component {/*...*/} hoistNonReactStatic(Enhance, WrappedComponent); return Enhance; }Refs 不会被传递。可用过Refs 转发解决常见的HOC:redux的 connectReact.PureComponent大部分情况下你可以使用 React.PureComponent 来代替手写 shouldComponentUpdate。只有当检测数据是数组或对象时由于浅拷贝的问题会导致比较出现偏差不能使用此时使用深拷贝仍可继续使用。如以下代码class CounterButton extends React.Component { constructor(props) { super(props); this.state {count: 1}; } shouldComponentUpdate(nextProps, nextState) { if (this.props.color ! nextProps.color) { return true; } if (this.state.count ! nextState.count) { return true; } return false; } render() { return ( this.setState(state ({count: state.count 1}))} Count: {this.state.count} ); }}可替换为class CounterButton extends React.PureComponent { constructor(props) { super(props); this.state {count: 1}; } render() { return ( this.setState(state ({count: state.count 1}))} Count: {this.state.count} ); }}PortalsPortal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案。一个 portal 的典型用例是当父组件有 overflow: hidden 或 z-index 样式时但你需要子组件能够在视觉上“跳出”其容器。例如对话框、悬浮卡以及提示框render() { // React 并*没有*创建一个新的 div。它只是把子元素渲染到 domNode 中。 // domNode 是一个可以在任何位置的有效 DOM 节点。 return ReactDOM.createPortal( this.props.children, domNode );}React.StrictModeStrictMode 不会渲染任何可见的 UI。它为其后代元素触发额外的检查和警告。严格模式检查仅在开发模式下运行它们不会影响生产构建。作用识别不安全的生命周期关于使用过时字符串 ref API 的警告关于使用废弃的 findDOMNode 方法的警告检测意外的副作用检测过时的 context APIReact.memoReact.memo 为高阶组件。它与 React.PureComponent 非常相似但它适用于函数组件但不适用于 class 组件。如果你的函数组件在给定相同 props 的情况下渲染相同的结果那么你可以通过将其包装在 React.memo 中调用以此通过记忆组件渲染结果的方式来提高组件的性能表现。这意味着在这种情况下React 将跳过渲染组件的操作并直接复用最近一次渲染的结果。默认情况下其只会对复杂对象做浅层对比如果你想要控制对比过程那么请将自定义的比较函数通过第二个参数传入来实现。const MyComponent React.memo(function MyComponent(props) { /* 使用 props 渲染 */});