Javascript 组件是否在反应功能/挂钩组件上安装等效组件?
有没有办法通过挂钩在React functional components中模拟Javascript 组件是否在反应功能/挂钩组件上安装等效组件?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,有没有办法通过挂钩在React functional components中模拟componentDidMount?您想使用useEffect(),这取决于您使用函数的方式,可以像componentDidMount()一样工作 例如,您可以使用一个自定义的加载的状态属性,该属性最初设置为false,然后在渲染时将其切换为true,并且仅在该值更改时激发效果 功能组件上没有componentDidMount,但是React钩子提供了一种方法,您可以使用useffect钩子来模拟行为 将空数组作为第
componentDidMount
?您想使用useEffect()
,这取决于您使用函数的方式,可以像componentDidMount()一样工作
例如,您可以使用一个自定义的加载的
状态属性,该属性最初设置为false,然后在渲染时将其切换为true,并且仅在该值更改时激发效果
功能组件上没有
componentDidMount
,但是React钩子提供了一种方法,您可以使用useffect
钩子来模拟行为
将空数组作为第二个参数传递给useffect()
,以便仅在装载时运行回调
请仔细阅读
函数组件didmount(){
const[count,setCount]=React.useState(0);
React.useffect(()=>{
log('componentDidMount');
}, []);
返回(
componentDidMount:{count}次
{
设置计数(计数+1);
}}
>
点击我
);
}
ReactDOM.render(
,
文档查询选择器(“app”)
);代码>
用于稳定版本的挂钩(React版本16.8.0+)
对于componentDidMount
useEffect(() => {
// Your code here
}, []);
useEffect(() => {
// componentWillUnmount
return () => {
// Your code here
}
}, [yourDependency]);
对于componentdiddupdate
useEffect(() => {
// Your code here
}, [yourDependency]);
对于组件,将卸载
useEffect(() => {
// Your code here
}, []);
useEffect(() => {
// componentWillUnmount
return () => {
// Your code here
}
}, [yourDependency]);
因此,在这种情况下,需要将依赖项传递到此数组中。假设你有一个这样的状态
const[count,setCount]=useState(0)代码>
当计数增加时,您希望重新呈现函数组件。那么您的useffect
应该如下所示
useEffect(() => {
// <div>{count}</div>
}, [count]);
useffect(()=>{
//{count}
},[计数];
这样,每当计数更新时,组件都将重新渲染。希望这会有所帮助。虽然公认的答案有效,但不推荐使用。当您有多个状态并使用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(...);
}
及
这只是一个例子。因此,我们不要谈论最佳实践或代码的潜在问题。这两种方法的逻辑相同,但后者只能按预期工作。这次您可能会使用useEffect运行componentDidMount功能,但随着应用的发展,您可能会遇到一些问题。所以,与其在那个阶段重写,不如在早期阶段重写
此外,OOP也没那么糟糕,如果面向过程的编程足够的话,我们就永远不会有面向对象的编程。有时候这很痛苦,但更好(从技术上讲,把个人问题放在一边)。componentDidMount()的确切等效钩子是
希望这对您有所帮助:)react钩子中的组件didmount
没有确切的等价物。
根据我的经验,react钩子在开发它时需要一种不同的心态,一般来说,您不应该将它与类方法(如componentDidMount
)进行比较
也就是说,有一些方法可以使用钩子产生类似于componentDidMount
的效果
解决方案1:
useffect(()=>{
console.log(“我已安装”)
}, [])
解决方案2:
const num=5
useffect(()=>{
log(“我将仅在我的deps更改时运行:”,num)
},[num])
解决方案3(带功能):
useffect(()=>{
常量someFunc=()=>{
log(“装载后/装载时运行的函数”)
}
someFunc()
}, [])
解决方案4(使用回调):
const msg=“一些消息”
const myFunc=useCallback(()=>{
控制台日志(msg)
},[msg])
useffect(()=>{
myFunc()
},[myFunc])
解决方案5(发挥创意):
导出默认函数usedimounthook(回调){
const didMount=useRef(空)
useffect(()=>{
if(回调&&!didMount.current){
didMount.current=true
回调函数()
}
})
}
值得注意的是,只有在其他解决方案都不适用于您的用例的情况下,才应该真正使用解决方案5。如果您确实决定需要解决方案5,那么我建议您使用此解决方案
来源(更多细节):useffect()hook允许我们实现componentDidMount、componentdiddupdate componentWillUnMount功能
useEffect()的不同语法允许实现上述每个方法
i) 组件安装
useffect(()=>{
//代码在这里
}, []);
ii)组件更新
useffect(()=>{
//代码在这里
}[x,y,z]);
//其中x、y、z是状态变量,在其更新上,应触发此方法
iii)组件卸载
useffect(()=>{
//代码在这里
返回函数(){
//要在卸载阶段运行的代码
}
}, []);
您可以查看官方react网站了解更多信息 关于钩子内异步函数的信息:
效果回调是同步的,以防止竞争条件。将异步函数放入:
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
这个解决方案并不理想。使用状态值来确定组件是否已安装是个坏主意。另外,如果您要使用属性,ref会更好,因为它不会触发另一次重新渲染。彻底的解释!有没有办法模拟componentDidReceiveProps?即使它存在,我也不知道。你可以检查这条线,谢谢