根据 reactjs.org 的说法,将来不会支持 componentWillMount。
https://reactjs.org/docs/react-component.html#unsafe_componentwillmount
不需要使用componentWillMount。
如果你想在组件挂载之前做一些事情,只要在constructor()中做就行了。
如果要进行网络请求,请不要在componentWillMount中进行。这是因为这样做会导致意想不到的错误。
网络请求可以在componentDidMount中完成。
希望对你有帮助。
于 2019 年 8 月 3 日更新
你之所以要求 componentWillMount 可能是因为你想在渲染之前初始化状态。
只需在 useState 中执行即可。
const helloWorld=()=>{
const [value,setValue]=useState(0) //initialize your state here
return <p>{value}</p>
}
export default helloWorld;
或者您可能想在 componentWillMount 中运行一个函数,例如,如果您的原始代码如下所示:
componentWillMount(){
console.log('componentWillMount')
}
有了钩子,你需要做的就是移除生命周期方法:
const hookComponent=()=>{
console.log('componentWillMount')
return <p>you have transfered componeWillMount from class component into hook </p>
}
我只是想在关于 useEffect 的第一个答案中添加一些内容。
useEffect(()=>{})
useEffect 在每次渲染上运行,它是 componentDidUpdate、componentDidMount 和 ComponentWillUnmount 的组合。
useEffect(()=>{},[])
如果我们在 useEffect 中添加一个空数组,它只会在组件安装时运行。这是因为 useEffect 会比较你传递给它的数组。
所以它不必是一个空数组。它可以是不变的数组。例如,它可以是 [1,2,3] 或 ['1,2']。 useEffect 仍然只在组件挂载时运行。
这取决于您是希望它只运行一次还是在每次渲染后运行。只要你知道自己在做什么,忘记添加数组并不危险。
我为钩子创建了一个示例。请检查一下。
https://codesandbox.io/s/kw6xj153wr
于 2019 年 8 月 21 日更新
我已经有一段时间没有写上面的答案了。我认为你需要注意一些事情。
当你使用
useEffect(()=>{},[])
当 react 比较你传递给数组 [] 的值时,它使用Object.is() 进行比较。
如果你传递一个对象给它,比如
useEffect(()=>{},[{name:'Tom'}])
这完全一样:
useEffect(()=>{})
它每次都会重新渲染,因为当Object.is() 比较一个对象时,它比较的是它的引用,而不是值本身。这与 {}==={} 返回 false 的原因相同,因为它们的引用不同。
如果您仍然想比较对象本身而不是引用,您可以执行以下操作:
useEffect(()=>{},[JSON.stringify({name:'Tom'})])
2021 年 7 月 9 日更新:
关于依赖的一些更新:
一般来说,如果你使用一个函数或一个对象作为依赖,它总是会重新渲染。但是 react 已经为你提供了解决方案:useCallback 和 useMemo
useCallback 能够记住一个函数。
useMemo 能够记住一个对象。
见这篇文章:
https://javascript.plainenglish.io/5-useeffect-infinite-loop-patterns-2dc9d45a253f