В соответствии сactjs.org, componentWillMount не будет поддерживаться в будущем.https://reactjs.org/docs/react-component.html#unsafe_componentwillmount
Нет необходимости использовать componentWillMount.
Если вы хотите что-то сделать до монтирования компонента, просто сделайте это в конструкторе ().
ЕслиВы хотите делать сетевые запросы, не делайте этого в componentWillMount.Это потому, что это приведет к неожиданным ошибкам.
Сетевые запросы можно выполнять в componentDidMount.
Надеюсь, это поможет.
обновлено 08.03 2019
Причина, по которой выСпросите для 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
обновлено 21/08/2019
С тех пор, как я написал, он был белымответ выше.Есть кое-что, на что, я думаю, нужно обратить внимание.Когда вы используете
useEffect(()=>{},[])
Когда реагирует, сравнивает значения, которые вы передали в массив [], он использует Object.is () для сравнения.Если вы передадите ему объект, такой как
useEffect(()=>{},[{name:'Tom'}])
Это точно так же, как:
useEffect(()=>{})
Он будет рендериться каждый раз, потому что когда Object.is () сравниваетобъект, он сравнивает свою ссылку, а не само значение.Это то же самое, что и то, почему {} === {} возвращает false, потому что их ссылки разные.Если вы все еще хотите сравнить сам объект, а не ссылку, вы можете сделать что-то вроде этого:
useEffect(()=>{},[JSON.stringify({name:'Tom'})])