在React的功能组件中,有方法通过钩子来模拟componentDidMount吗?
当前回答
useLayoutEffect钩子是React钩子中ComponentDidMount的最佳替代方案。 useLayoutEffect钩子在渲染UI之前执行,useEffect钩子在渲染UI之后执行。根据您的需要使用它。 示例代码:
import { useLayoutEffect, useEffect } from "react";
export default function App() {
useEffect(() => {
console.log("useEffect Statements");
}, []);
useLayoutEffect(() => {
console.log("useLayoutEffect Statements");
}, []);
return (
<div>
<h1>Hello Guys</h1>
</div>
);
}
其他回答
关于钩子内异步函数的信息:
效果回调是同步的,以防止竞争条件。把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
您希望使用useEffect(),这取决于您如何使用函数,可以像componentDidMount()一样工作。
如。你可以使用一个自定义的加载状态属性,初始设置为false,并在呈现时将其切换为true,并且仅在该值发生变化时触发效果。
文档
在功能组件上没有componentDidMount,但是React Hooks提供了一种方法,可以通过使用useEffect钩子来模拟行为。
将一个空数组作为第二个参数传递给useEffect(),以仅在挂载时运行回调。
请阅读有关useEffect的文档。
function ComponentDidMount() { const [count, setCount] = React.useState(0); React.useEffect(() => { console.log('componentDidMount'); }, []); return ( <div> <p>componentDidMount: {count} times</p> <button onClick={() => { setCount(count + 1); }} > Click Me </button> </div> ); } ReactDOM.render( <div> <ComponentDidMount /> </div>, document.querySelector("#app") ); <script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script> <div id="app"></div>
在react钩子中没有完全等价的componentDidMount。
根据我的经验,react钩子在开发时需要不同的心态,一般来说,你不应该将它与componentDidMount等类方法进行比较。
尽管如此,还是有一些方法可以使用钩子来产生与componentDidMount类似的效果。
解决方案1:
useEffect(() => {
console.log("I have been mounted")
}, [])
解决方案2:
const num = 5
useEffect(() => {
console.log("I will only run if my deps change: ", num)
}, [num])
方案三(带功能):
useEffect(() => {
const someFunc = () => {
console.log("Function being run after/on mount")
}
someFunc()
}, [])
解决方案4 (useCallback):
const msg = "some message"
const myFunc = useCallback(() => {
console.log(msg)
}, [msg])
useEffect(() => {
myFunc()
}, [myFunc])
解决方案5(变得有创意):
export default function useDidMountHook(callback) {
const didMount = useRef(null)
useEffect(() => {
if (callback && !didMount.current) {
didMount.current = true
callback()
}
})
}
值得注意的是,只有当其他解决方案都不适合您的用例时,才应该真正使用解决方案5。如果你决定你需要解决方案5,那么我建议使用这个预先制作的钩子use-did-mount。
来源(更多细节):在react钩子中使用componentDidMount
对于钩子的稳定版本(React version 16.8.0+)
对于componentDidMount
useEffect(() => {
// Your code here
}, []);
对于componentDidUpdate
useEffect(() => {
// Your code here
}, [yourDependency]);
对于componentWillUnmount
useEffect(() => {
// componentWillUnmount
return () => {
// Your code here
}
}, [yourDependency]);
在这种情况下,你需要将你的依赖传递到这个数组中。假设有一个这样的状态
const [count, setCount] = useState(0);
当count增加时,你想重新渲染你的函数组件。然后你的useEffect应该看起来像这样
useEffect(() => {
// <div>{count}</div>
}, [count]);
这样,每当你的计数更新你的组件将重新呈现。希望这对你有所帮助。
推荐文章
- 如何将“camelCase”转换为“Camel Case”?
- 我们可以在另一个JS文件中调用用一个JavaScript编写的函数吗?
- 如何使用JavaScript重新加载ReCaptcha ?
- jQuery。由于转义了JSON中的单引号,parseJSON抛出“无效JSON”错误
- 在JavaScript关联数组中动态创建键
- ReactJS和公共文件夹中的图像
- 在React Native中使用Fetch授权头
- 为什么我的球(物体)没有缩小/消失?
- 如何使用jQuery检测页面的滚动位置
- if(key in object)或者if(object. hasownproperty (key)
- 一元加/数字(x)和parseFloat(x)之间的区别是什么?
- angularjs中的compile函数和link函数有什么区别
- 删除绑定中添加的事件监听器
- 很好的初学者教程socket.io?
- HtmlSpecialChars在JavaScript中等价于什么?