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);