在React的功能组件中,有方法通过钩子来模拟componentDidMount吗?
当前回答
虽然公认的答案是可行的,但不建议使用。当你有多个状态并且你和useEffect一起使用它时,它会警告你是否将它添加到依赖数组或者根本不使用它。
它有时会导致问题,可能会产生不可预测的输出。因此,我建议您花点精力将函数重写为类。有很少的变化,您可以将一些组件作为类,一些作为函数。您没有义务只使用一种约定。
以这个为例
function App() {
const [appointments, setAppointments] = useState([]);
const [aptId, setAptId] = useState(1);
useEffect(() => {
fetch('./data.json')
.then(response => response.json())
.then(result => {
const apts = result.map(item => {
item.aptId = aptId;
console.log(aptId);
setAptId(aptId + 1);
return item;
})
setAppointments(apts);
});
}, []);
return(...);
}
and
class App extends Component {
constructor() {
super();
this.state = {
appointments: [],
aptId: 1,
}
}
componentDidMount() {
fetch('./data.json')
.then(response => response.json())
.then(result => {
const apts = result.map(item => {
item.aptId = this.state.aptId;
this.setState({aptId: this.state.aptId + 1});
console.log(this.state.aptId);
return item;
});
this.setState({appointments: apts});
});
}
render(...);
}
这只是举个例子。因此,让我们不要谈论代码的最佳实践或潜在问题。两者的逻辑相同,但后者只能按预期工作。此时,你可能会获得componentDidMount功能和useEffect,但随着应用程序的发展,你可能会面临一些问题。所以,与其在那个阶段重写,不如在早期就重写。
此外,面向对象并不是那么糟糕,如果面向过程编程就足够了,我们就永远不会有面向对象编程了。有时会很痛苦,但更好(技术上来说。暂且把个人问题放在一边)。
其他回答
虽然公认的答案是可行的,但不建议使用。当你有多个状态并且你和useEffect一起使用它时,它会警告你是否将它添加到依赖数组或者根本不使用它。
它有时会导致问题,可能会产生不可预测的输出。因此,我建议您花点精力将函数重写为类。有很少的变化,您可以将一些组件作为类,一些作为函数。您没有义务只使用一种约定。
以这个为例
function App() {
const [appointments, setAppointments] = useState([]);
const [aptId, setAptId] = useState(1);
useEffect(() => {
fetch('./data.json')
.then(response => response.json())
.then(result => {
const apts = result.map(item => {
item.aptId = aptId;
console.log(aptId);
setAptId(aptId + 1);
return item;
})
setAppointments(apts);
});
}, []);
return(...);
}
and
class App extends Component {
constructor() {
super();
this.state = {
appointments: [],
aptId: 1,
}
}
componentDidMount() {
fetch('./data.json')
.then(response => response.json())
.then(result => {
const apts = result.map(item => {
item.aptId = this.state.aptId;
this.setState({aptId: this.state.aptId + 1});
console.log(this.state.aptId);
return item;
});
this.setState({appointments: apts});
});
}
render(...);
}
这只是举个例子。因此,让我们不要谈论代码的最佳实践或潜在问题。两者的逻辑相同,但后者只能按预期工作。此时,你可能会获得componentDidMount功能和useEffect,但随着应用程序的发展,你可能会面临一些问题。所以,与其在那个阶段重写,不如在早期就重写。
此外,面向对象并不是那么糟糕,如果面向过程编程就足够了,我们就永远不会有面向对象编程了。有时会很痛苦,但更好(技术上来说。暂且把个人问题放在一边)。
componentDidMount()的等效钩子是
useEffect(()=>{},[]);
希望这对你有帮助。
关于钩子内异步函数的信息:
效果回调是同步的,以防止竞争条件。把async函数放在里面:
useEffect(() => {
async function fetchData() {
// You can await here
const response = await MyAPI.getData(someId);
// ...
}
fetchData();
}, [someId]); // Or [] if effect doesn't need props or state
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// Similar to componentDidMount and componentDidUpdate:
useEffect(() => {
// Update the document title using the browser API
document.title = `You clicked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
请访问这个官方文件。很容易理解最新的方式。
https://reactjs.org/docs/hooks-effect.html
useEffect()钩子允许我们实现componentDidMount功能,componentDidUpdate componentWillUnMount功能。
useEffect()的不同语法允许实现上述每一种方法。
我)componentDidMount
useEffect(() => {
//code here
}, []);
(二)componentDidUpdate
useEffect(() => {
//code here
}, [x,y,z]);
//where x,y,z are state variables on whose update, this method should get triggered
3) componentDidUnmount
useEffect(() => {
//code here
return function() {
//code to be run during unmount phase
}
}, []);
你可以查看官方react网站获取更多信息。hook的官方反应页面
推荐文章
- 检测用户何时离开网页的最佳方法?
- 当“模糊”事件发生时,我如何才能找到哪个元素的焦点去了*到*?
- React不会加载本地图像
- 如何将Blob转换为JavaScript文件
- 在另一个js文件中调用JavaScript函数
- 如何在svg元素中使用z索引?
- 如何求一个数的长度?
- 跨源请求头(CORS)与PHP头
- 如何用Express/Node以编程方式发送404响应?
- parseInt(null, 24) === 23…等等,什么?
- JavaScript变量声明在循环外还是循环内?
- 元素在“for(…in…)”循环中排序
- 在哪里放置JavaScript在HTML文件?
- Axios获取url工作,但第二个参数作为对象,它不
- 什么时候.then(success, fail)被认为是承诺的反模式?