javascript - 为什么 componentDidMount 在 componentWillUnmount 之后运行?

标签 javascript html reactjs react-hooks react-lifecycle

我试图捕获 componentDidMountcomponentWillUnmount 之间的区别并尝试了以下代码:


class App extends React.Component {

  constructor(props) {
    super(props);

    this.state = {
      name: "",
    };
  }

  componentDidMount() {
    console.log("Inside componentDidMount");
  }

  componentWillUnmount() {
    console.log("Inside ComponentWillUnMount");
  }

  render() {
    return (
      <div className="App">
        {console.log("I am in render")}
        <header className="App-header">
          <input
            type="text"
            value={this.state.name}
            onChange={(e) => this.setState({ name: e.target.value })}
            placeholder="enter your name"
          />
          <p>Edit and save to reload.</p>
        </header>
      </div>
    );
  }
}

目前我的理解是

  1. componentDidMount 会在组件挂载后调用,只调用一次 即使经过多次重新渲染(如果我在这里错了,请纠正我)
  2. componentWillUnmount 将在组件卸载时调用一次。

但我在控制台中观察到 componentDidMount 在渲染之后被调用,这是预期的,而且在 componentWillUnMount 之后。

我的问题是:

  1. 为什么 componentWillUnMount 被调用,因为我只有 App 组件,没有其他组件要渲染,而且我仍在第一个屏幕上?为什么要卸载 App 组件,因为我仍在那个屏幕上,在那里我可以看到 App 组件包含的内容(这是输入)

  2. 为什么 componentDidMountcomponentWillUnMount 之后运行?

为什么我们需要在构造函数中使用 props 调用 super()?

Result with Class component

我什至用 useEffect 的功能组件尝试了上面的代码,结果是一样的。

const AppSample = () => {
    useEffect(() => {
        console.log('I am in useEffect');
        return () => {
            console.log("Inside clean up function")
        }
    }, []);

    const [name , setName ] = useState('')

    return  (
        <div>
        {
            console.log(" I am inside render")
        }
            <input value={ name } onChange={(e) => setName(e.target.value)} />
        </div>
    )
}

console.log('I am in running') 打印两次,一次在渲染之后,另一次在执行清理函数之后

Result With functional component

最佳答案

你必须有 <StrictMode>在您的 index.js 中启用文件.

替换 <StrictMode><>

然后你会发现render()componentDidMount在你的 App 组件中只触发一次并且 componentWillUnmount除非卸载 App 组件,否则不会触发

严格模式引用:https://github.com/facebook/react/issues/12856#issuecomment-613145789

关于javascript - 为什么 componentDidMount 在 componentWillUnmount 之后运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71951953/

相关文章:

html - 图像上的文本 block

css - 有没有一种方法可以将下拉元素显示在另一个元素上以收集元素

javascript - CSS 转换在转换为 React 代码 : 时停止运行

javascript - 在 html 中插入 javascript 变量的框架

javascript - 开放层 3 : Show vector labels on hover

html - 将淡出效果添加到大表的最后一列

javascript - ES6 在组件内包裹组件

javascript - 如何 "hide"ommit Babel/Webpack/Plugins配置文件?

javascript - 在 JQuery AJAX 发布之前暂停

javascript - 如何从 Firebase 的 JavaScript 查询创建复选框列表