ReasonML 中的 useEffect 与 useEffect0
useEffect vs useEffect0 in ReasonML
我正在尝试了解两者之间的区别:
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
,您必须更改 useEffect
至 useEffect0
原始版本使用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>;
};
那么为什么使用不同的结构时调用会发生变化?
任何链接或解释将不胜感激。
谢谢。
Reason 中的 React.useEffect(f)
在 JavaScript 中编译为 React.useEffect(f)
。 Reason 中的 React.useEffect0(f)
在 JavaScript 中编译为 React.useEffect(f, [])
。
区别在于第二个 []
参数插入 JavaScript。默认情况下,JavaScript 中的 useEffect
在 每个 渲染时触发。通过在第二个参数中添加空数组,我们告诉 React 只在组件首次渲染时触发它一次。
我正在尝试了解两者之间的区别:
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
,您必须更改 useEffect
至 useEffect0
原始版本使用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)
在 JavaScript 中编译为 React.useEffect(f)
。 Reason 中的 React.useEffect0(f)
在 JavaScript 中编译为 React.useEffect(f, [])
。
区别在于第二个 []
参数插入 JavaScript。默认情况下,JavaScript 中的 useEffect
在 每个 渲染时触发。通过在第二个参数中添加空数组,我们告诉 React 只在组件首次渲染时触发它一次。