Javascript 如何避免在每次渲染时执行useState函数参数(以获取初始值)?
请参见下面的代码段,每个渲染都会执行Javascript 如何避免在每次渲染时执行useState函数参数(以获取初始值)?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,请参见下面的代码段,每个渲染都会执行getInitialState。即使从它返回的值仅在第一次渲染期间使用 我知道这是正常的Javascript行为。但是有没有一种方法可以避免使用React 函数应用程序(){ 函数getInitialState(){ log('Executing getInitialState…'); 返回({ 福:“酒吧” }); } const[myState,setMyState]=React.useState(getInitialState()); const[my
getInitialState
。即使从它返回的值仅在第一次渲染期间使用
我知道这是正常的Javascript行为。但是有没有一种方法可以避免使用React
函数应用程序(){
函数getInitialState(){
log('Executing getInitialState…');
返回({
福:“酒吧”
});
}
const[myState,setMyState]=React.useState(getInitialState());
const[myBoolean,setMyBoolean]=React.useState(false);
返回(
我是应用程序
我的状态:{JSON.stringify(myState)}
My boolean:{JSON.stringify(myBoolean)}
setMyBoolean((prevState)=>!prevState)}>强制更新
);
}
ReactDOM.render(,document.getElementById('root'))代码>
试着用
函数getInitialState(){
log('Executing getInitialState…');
返回{
福:“酒吧”
};
}
函数App(){
const getInitial=React.useMoom(()=>getInitialState(),[]);
const[myState,setMyState]=React.useState(getInitial);
const[myBoolean,setMyBoolean]=React.useState(false);
返回(
我是应用程序
我的状态:{JSON.stringify(myState)}
My boolean:{JSON.stringify(myBoolean)}
setMyBoolean(prevState=>!prevState)}>
部队更新
);
}
ReactDOM.render(,document.getElementById('root'))代码>
不要直接在useState
中调用函数,传递一个匿名函数来触发该函数。请向官员咨询
函数getInitialState(){
log('Executing getInitialState…');
返回({
福:“酒吧”
});
}
函数App(){
const[myState,setMyState]=React.useState(()=>getInitialState());
const[myBoolean,setMyBoolean]=React.useState(false);
返回(
我是应用程序
我的状态:{JSON.stringify(myState)}
My boolean:{JSON.stringify(myBoolean)}
setMyBoolean((prevState)=>!prevState)}>强制更新
);
}
ReactDOM.render(,document.getElementById('root'))代码>
您需要根据以下公式计算函数中的状态:
或更短:
const [myState, setMyState] = useState(getInitialState);
又一个钩子抓住了 所有好的解决方案,我的2美分=上面多米尼克的较短解决方案。:)
您正在传递一个计算函数(函数的结果传递给useState)。如果您传递函数,React知道它只需要在第一次调用该函数:
函数应用程序(){
函数getInitialState(){
log('Executing getInitialState…');
返回({
福:“酒吧”
});
}
const[myState,setMyState]=React.useState(getInitialState);/!prevState)}>强制更新
);
}
ReactDOM.render(,document.getElementById('root'))代码>
为什么你需要它是一个函数而不是一个常数?这是一个很好的答案,但你应该详细说明它发生的原因和方式。getInitialState()
每次都会执行该函数,但是()=>getInitialState()
将传递函数的引用,因此它将被调用一次。React将根据参数以不同方式处理useState
。在代码中,getInitialState()
将返回一个值。而useState
将以不同的方式处理函数引用。如果是函数,则仅在初始渲染时执行
const [myState, setMyState] = useState(getInitialState);