Javascript 反应副作用失效效应挂钩
效果(增加r的值并记录它)在useEffect钩子中按预期工作Javascript 反应副作用失效效应挂钩,javascript,reactjs,react-hooks,use-effect,Javascript,Reactjs,React Hooks,Use Effect,效果(增加r的值并记录它)在useEffect钩子中按预期工作 import React from "react"; let r = 0; export default function App() { const [state, setState] = React.useState(false); function handler() { setState(!state); } React.useEffect(() => { r
import React from "react";
let r = 0;
export default function App() {
const [state, setState] = React.useState(false);
function handler() {
setState(!state);
}
React.useEffect(() => {
r += 1;
console.log("rendering:-", r, " times");
});
return (
<>
<button onClick={handler}>render</button>
</>
);
}
从“React”导入React;
设r=0;
导出默认函数App(){
const[state,setState]=React.useState(false);
函数处理程序(){
设置状态(!状态);
}
React.useffect(()=>{
r+=1;
log(“呈现:-”,r,“时间”);
});
返回(
提供
);
}
但是在useEffect挂钩之外,效果出人意料地工作。r的值增加2而不是1
import React from "react";
let r = 0;
export default function App() {
const [state, setState] = React.useState(false);
function handler(params) {
setState(!state);
}
r += 1;
console.log("rendering:-", r, " times");
return (
<>
<button onClick={handler}>render</button>
</>
);
}
从“React”导入React;
设r=0;
导出默认函数App(){
const[state,setState]=React.useState(false);
函数处理程序(params){
设置状态(!状态);
}
r+=1;
log(“呈现:-”,r,“时间”);
返回(
提供
);
}
但是为什么???
有人能给我解释一下吗….
r
仍然增加了1
注:
从React 17开始,React自动修改控制台
方法(如console.log())在第二次调用
生命周期功能。但是,它可能会导致不希望的行为
在某些情况下,可以使用变通方法
您可以在此处阅读更多有关内容:
下面的代码示例显示,r
增加1:
import React from "react";
let log = console.log
let r = 0;
export default function App() {
const [state, setState] = React.useState(0);
console.info('render');
function handler(params) {
setState((prevState) => prevState + 1);
}
r+=1;
log("rendering:- r=" + r);
log("rendering:- state=" + state);
return (
<>
<button onClick={() => handler()}>render { state }</button>
</>
);
}
从“React”导入React;
让log=console.log
设r=0;
导出默认函数App(){
const[state,setState]=React.useState(0);
console.info(“呈现”);
函数处理程序(params){
设置状态((prevState)=>prevState+1);
}
r+=1;
日志(“呈现:-r=“+r”);
日志(“呈现:-state=“+state”);
返回(
handler()}>呈现{state}
);
}
index.js中的strictMode说唱歌手实际调用了两次函数体
<React.StrictMode>
<App />
</React.StrictMode>
严格模式不能自动检测副作用,但它
通过使它们更具确定性,可以帮助您识别它们。
这是通过故意双重调用以下函数来实现的:
在我的例子中,它仍然增加了1,谢谢你的回答,你使用的是什么版本的react ar,以及什么版本?你能做个演示吗?