javascript - 为什么删除一个组件会影响另一个组件的生命周期?

标签 javascript reactjs

以下代码示例包含 2 个组件:Component1日志prevStatecomponentDidUpdate方法,Component2删除按钮单击以显示 componentWillUnmount 的使用.

const { useState } = React;

class Component1 extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      name: 'John',
    };
  }
  componentDidUpdate(prevProps, prevState) {
    console.log(prevState);
  }
  render() {
    return (
      <div>
        <div>The name is {this.state.name}</div>
        <label htmlFor="prevstate">Type here to see prevState in console: </label>
        <input
          id="prevstate"
          onChange={(e) => {
            this.setState({ name: e.target.value });
          }}
        />
      </div>
    );
  }
}

class Component2 extends React.Component {
  componentDidMount() {
    console.log('Mount');
  }
  componentWillUnmount() {
    console.log('Unmount');
  }
  render() {
    return (
      <div>
        <div>Click the button to remove the element</div>
      </div>
    );
  }
}

const App = () => {
  const [showComponent, setShowComponent] = useState(true);
  return (
    <div>
      <Component1 />
      {showComponent ? <Component2 /> : null}
      <button
        onClick={() => {
          setShowComponent(false);
        }}
      >
        Remove
      </button>
    </div>
  );
};

// Render it
ReactDOM.render(<App />, document.getElementById('react'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react"></div>

现在我发现这两个组件相互干扰:单击按钮还会记录 prevState在第一个组件中。我认为会发生的是 componentDidUpdate方法只会监视 Component1 的更新,但它似乎监视了两个组件之外的按钮,为什么会发生这种情况?

最佳答案

当 App 被渲染时,它的 child 也会被渲染。您可以尝试将 Component1 设为 React.PureComponent或定义 shouldComponentUpdate如果你想减少重新渲染。

关于javascript - 为什么删除一个组件会影响另一个组件的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64911669/

相关文章:

javascript - 算法 : finding nearby value the fastest way

reactjs - 正确管理 React 状态会出现奇怪的错误

javascript - Redux 中的异步请求

javascript - 获取 api 时未调用 useEffect 且未更新状态

javascript - 未声明 HTML 文档的字符编码

javascript - Aurelia 选择初始值

javascript - 让 child ul in an li

javascript - Phonegap Build in iphone exec 错误

javascript - react 。呈现和更新 1500 个 <li> 元素的简单列表时非常慢。我认为 VirtualDOM 很快

arrays - 在状态中保存对象数组 - ReactJS