gpt4 book ai didi

use-effect - ReasonML 中的 useEffect 与 useEffect0

转载 作者:行者123 更新时间:2023-12-03 20:26:06 26 4
gpt4 key购买 nike

我试图了解两者之间的区别:

 React.useEffect(() => {
let timerId = Js.Global.setInterval(() => tick(), 1000);
Some(() => Js.Global.clearInterval(timerId));
});
React.useEffect0(() => {
let timerId = Js.Global.setInterval(() => tick(), 1000);
Some(() => Js.Global.clearInterval(timerId));
});

它们都具有相同的类型签名并且都编译但 useEffect0什么也没做:
// useEffect0 : unit => option(unit => unit) => unit
// useEffect : unit => option(unit => unit) => unit

使用 https://reasonml.github.io/reason-react/blog/2019/04/10/react-hooks 处的示例,它使用 useEffect但是如果你改变它使用 useState而不是 useReducer你要改 useEffectuseEffect0
原版使用 useEffect0 :
type action =
| Tick;

type state = {
count: int,
};

[@react.component]
let make = () => {
let (state, dispatch) = React.useReducer(
(state, action) =>
switch (action) {
| Tick => {count: state.count + 1}
},
{count: 0}
);

React.useEffect0(() => {
let timerId = Js.Global.setInterval(() => dispatch(Tick), 1000);
Some(() => Js.Global.clearInterval(timerId))
});

<div>{ReasonReact.string(string_of_int(state.count))}</div>;
};

删除后 useReducer并使用 useEffect :
[@react.component]
let make = () => {
let (state, dispatch) = React.useState(()=>
{count: 0}
);
let tick =()=> dispatch(_=>{count: state.count + 1});
React.useEffect(() => {
let timerId = Js.Global.setInterval(() => tick(), 1000);
Some(() => Js.Global.clearInterval(timerId))
});

<div>{ReasonReact.string(string_of_int(state.count))}</div>;
};

那么为什么在使用不同的结构时调用会发生变化呢?

任何链接或解释将不胜感激。

谢谢你。

最佳答案

React.useEffect(f)在 Reason 编译为 React.useEffect(f)在 JavaScript 中。 React.useEffect0(f)在 Reason 编译为 React.useEffect(f, [])在 JavaScript 中。

不同的是第二个[]插入到 JavaScript 中的参数。默认情况下,useEffect在 JavaScript 中,每次渲染都会触发。通过在第二个参数中添加空数组,我们告诉 React 在组件第一次渲染时只触发一次。

关于use-effect - ReasonML 中的 useEffect 与 useEffect0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60996617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com