reactjs - 当容器中的输入值更改时,不会记录 ComponentDidUpdate Inside HOC

标签 reactjs higher-order-components

import React, { useEffect, useState } from "react";
function logProps(WrappedComponent) {
    return class extends React.Component {
        componentDidUpdate(prevProps) {
        console.log("inside componentDidUpdate");
       }
        componentDidMount() {
            console.log("insideComponentDidMount");
        }
        render() {
            return <WrappedComponent {...this.props} />;
        }
     };
  }
const Container = (props) => {
    const [name, setName] = useState("");
    const handleInputChange = (value) => {
    setName(value);
    };
   return (
      <React.Fragment>
          <input value={name} onChange={(e) => handleInputChange(e.target.value)} />
      </React.Fragment>
       );
   };

export default logProps(Container);

这里容器组件被包装在 logProps HOC 中。我想在输入更改后触发组件 Did Update 函数。我使用了与官方 React 文档中描述的相同的 HOC。

最佳答案

这里有很多东西要解释

  1. 组件是虚拟(无状态)或智能(有状态)
  2. 组件将在 props 或状态发生变化时渲染 (🌟)

让我们从上到下尊重层次结构

  1. HOC 组件渲染 2.componentDidMount 触发
  2. 你现在可以输入你的 child 了
  3. 您更改值
  4. handleInputChange 被触发
  5. setName 现在使用新值调用
  6. Container 组件重新渲染 (🌟)

我们不希望 HOC 现在更新,因为直到现在它还没有发生任何奇怪的事情。 如果你想在每次字符更改时调用 componentDidUpdate,你必须从 logProps(Component) parent

传递 props

像这样

import React, { useEffect, useState } from "react";
function logProps(WrappedComponent) {
    return class extends React.Component {
        componentDidUpdate(prevProps) {
        console.log("inside componentDidUpdate");
       }
        componentDidMount() {
            console.log("insideComponentDidMount");
        }
        render() {
            return <WrappedComponent {...this.props} />;
        }
     };
  }
const Container = ({name, handleInputChange}) => {
   
   return (
      <React.Fragment>
          <input value={name} onChange={(e) => handleInputChange(e.target.value)} />
      </React.Fragment>
       );
   };

export default logProps(Container);

// parent.js
const Parent = () => {
  const [name, setName] = useState("");
  return <LogPropsContainer handleInputChange={setName} name={name} />
}

现在您将看到每个字符更改的日志 codesandbox

记录生命周期的新Hook版本

with关键字启动HOC很方便

const withLogger = (Component) => {
  function HOC(props) {
    useEffect(() => {
      console.log("component did mount", { CDM: props });
      // eslint-disable-next-line
      return () => {
        console.log("component did unmount", { CDUM: props });
      };
    }, []);

    useEffect(() => {
      console.log("component did update", { CDU: props });
      return () => {
        console.log("component did update rerender", { rerender: props });
      };
    });

    return <Component {...props} />;
  };

  // rename component for better debuging
  if (process.env.NODE_ENV !== 'production') {
   const name = Component && (Component.displayName || Component.name)
   HOC.displayName = `Logger(${name || 'Anonymous' })`
  }
};

关于reactjs - 当容器中的输入值更改时,不会记录 ComponentDidUpdate Inside HOC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65969001/

相关文章:

javascript - 如何从父组件获取intl.formatMessage?

javascript - 如何在React中实现Jquery?

javascript - 如何在 React 中编写一个需要另一个特殊功能的 HOC?

javascript - 未捕获的不变违规 : React. Children.only expected to receive a single React element child

javascript - 在 typescript 箭头函数中,参数列表前的 'new' 关键字是什么意思?

reactjs - Typescript with React - 在通用组件类上使用 HOC

reactjs - 如何将 hls.js 与 React 结合使用

reactjs - React 组件是否需要 Render Prop ?

node.js - HTTP 1.1 网关超时 504

javascript - 使用 recompose 映射从上下文中消耗的 Prop