Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 组件是否在反应功能/挂钩组件上安装等效组件?_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 组件是否在反应功能/挂钩组件上安装等效组件?

Javascript 组件是否在反应功能/挂钩组件上安装等效组件?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,有没有办法通过挂钩在React functional components中模拟componentDidMount?您想使用useEffect(),这取决于您使用函数的方式,可以像componentDidMount()一样工作 例如,您可以使用一个自定义的加载的状态属性,该属性最初设置为false,然后在渲染时将其切换为true,并且仅在该值更改时激发效果 功能组件上没有componentDidMount,但是React钩子提供了一种方法,您可以使用useffect钩子来模拟行为 将空数组作为第

有没有办法通过挂钩在React functional components中模拟
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?即使它存在,我也不知道。你可以检查这条线,谢谢