• React的高阶函数


    1.认识高阶函数

    • 高阶组件 本身不是一个组件,而是一个函数
    • 函数的参数是一个组件,返回值也是一个组件
    高阶组件的定义
    1. import ThemeContext from "../context/theme_context"
    2. function withTheme(OriginComponent) {
    3. return (props) => {
    4. return (
    5. <ThemeContext.Consumer>
    6. {
    7. value => {
    8. return <OriginComponent {...props} {...value} />
    9. }
    10. }
    11. ThemeContext.Consumer>
    12. )
    13. }
    14. }
    15. export default withTheme

    2.高阶函数的意义

    优点:

    • 利用高阶组件可以针对某些React代码进行更加优雅的处理
    • 解决早期React使用Mixin混入,引起的相互依赖,相互耦合,不利于代码维护

    缺点:

    • HOC需要在 原组件上进行包裹或者嵌套,如果大量使用HOC,将会产生非常多的嵌套,这让调试变得非常困难
    • HOC 可以劫持props,在不遵守约定的情况下也可能造成冲突

    3.Portals的使用

    某些情况下,我们希望渲染的内容独立于父组件,甚至是独立于当前挂载到的DOM元素中(默认都是挂载到id为root的DOM 元素上的)。
    Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案:
    • 第一 个参数(child)是任何可渲染的 React 子元素,例如一个元素,字符串或 fragment
    • 第二个 参数(container)是一个 DOM 元素

    通过React内置的createPortal函数实现 

     Modal.jsx

    1. import React, { PureComponent } from 'react'
    2. import { createPortal } from "react-dom"
    3. export class Modal extends PureComponent {
    4. render() {
    5. return createPortal(this.props.children, document.querySelector("#modal"))
    6. }
    7. }
    8. export default Modal

     App.jsx

    1. import React, { PureComponent } from 'react'
    2. import { createPortal } from "react-dom"
    3. import Modal from './Modal'
    4. export class App extends PureComponent {
    5. render() {
    6. return (
    7. <div className='app'>
    8. <h1>App H1h1>
    9. {
    10. createPortal(<h2>App H2h2>, document.querySelector("#why"))
    11. }
    12. {/* 2.Modal组件 */}
    13. <Modal>
    14. <h2>我是标题h2>
    15. <p>我是内容, 哈哈哈p>
    16. Modal>
    17. div>
    18. )
    19. }
    20. }
    21. export default App

    4.Fragment的使用

    在之前的开发中,我们总是在一个组件中返回内容时包裹一个div元素:

    如果希望不渲染这层的div,就可以通过Fragment实现,Fragment 允许你将子列表分组,而无需向 DOM 添加额外节点;

    React还提供了Fragment的短语法,看起来像空标签 <> ;
    但是,如果我们需要在Fragment中添加key,那么就不能使用短语法;
    1. import React, { PureComponent, Fragment } from 'react'
    2. export class App extends PureComponent {
    3. constructor() {
    4. super()
    5. this.state = {
    6. sections: [
    7. { title: "哈哈哈", content: "我是内容, 哈哈哈" },
    8. { title: "呵呵呵", content: "我是内容, 呵呵呵" },
    9. { title: "嘿嘿嘿", content: "我是内容, 嘿嘿嘿" },
    10. { title: "嘻嘻嘻", content: "我是内容, 嘻嘻嘻" },
    11. ]
    12. }
    13. }
    14. render() {
    15. const { sections } = this.state
    16. return (
    17. <>
    18. <h2>我是App的标题h2>
    19. <p>我是App的内容, 哈哈哈哈p>
    20. <hr />
    21. {
    22. sections.map(item => {
    23. return (
    24. <Fragment key={item.title}>
    25. <h2>{item.title}h2>
    26. <p>{item.content}p>
    27. Fragment>
    28. )
    29. })
    30. }
    31. )
    32. }
    33. }
    34. export default App

    5.StrictMode

    StrictMode 是一个用来突出显示应用程序中潜在问题的工具:

    • 与 Fragment 一样,StrictMode 不会渲染任何可见的 Ui
    • 它为其后代元素触发额外的检查和警告
    • 严格模式检查仅在开发模式下运行; 它们不会影响生产构建

    StrictMode检查项:

    • 识别不安全的生命周期
    • 使用过时的ref API
    • 检查意外的副作用
    • 使用废弃的findDOMNode方法
    • 检测过时的context APi
    1. import React, { PureComponent, StrictMode } from 'react'
    2. // import { findDOMNode } from "react-dom"
    3. import Home from './pages/Home'
    4. import Profile from './pages/Profile'
    5. export class App extends PureComponent {
    6. render() {
    7. return (
    8. <div>
    9. <StrictMode>
    10. <Home/>
    11. StrictMode>
    12. <Profile/>
    13. div>
    14. )
    15. }
    16. }
    17. export default App

  • 相关阅读:
    c语言范例实例
    MATLAB循环结构之while语句
    如何科学的设定KR?
    ansible ---- ansible.builtin.command
    碳化硅夹阻整流器(PBR)
    CentOS 7安装Redis5.0.7
    Bootstrap Your Own Latent: A New Approach to Self-Supervised Learning
    伦敦银交易所数据全面吗?
    【ARM Coresight 系列文章19.1 -- Cortex-A720 PMU 详细介绍】
    AS400 大厂面试
  • 原文地址:https://blog.csdn.net/weixin_47342624/article/details/133313210