, prevState IS . , , prevState - , .
:
. , , , , , , , .
function App() {
const[myState,setMyState] = React.useState({propA: 'FOO'});
function handleClick() {
setMyState((prevState) => {
console.log('myState: ' + JSON.stringify(myState));
console.log('prevState: ' + JSON.stringify(prevState));
console.log('Are "myState" and "prevState" the very same object: ' + JSON.stringify(prevState === myState));
const shallowCopy = {...prevState}
console.log('shallowCopy of prevState: ' + JSON.stringify(shallowCopy));
console.log('Are "shallowCopy" and "prevState" the very same object: ' + JSON.stringify(shallowCopy === myState));
return prevState;
});
}
function updateWithShallowCopy() {
setMyState((prevState)=>{
const shallowCopy = {...prevState};
shallowCopy.propA = 'BAR<-------------------------------------';
return shallowCopy;
});
}
function updateWithoutShallowCopy() {
setMyState((prevState)=>{
prevState.propA = 'BAR';
return prevState;
});
}
return(
<React.Fragment>
<div>{myState.propA}</div>
<button onClick={handleClick}>Click to inspect</button>
<button onClick={updateWithoutShallowCopy}>Update WITHOUT shallow copy</button>
<button onClick={handleClick}>Click to inspect</button>
<button onClick={updateWithShallowCopy}>Update WITH shallow copy</button>
<div>Click in all buttons in order from left to right</div>
</React.Fragment>
);
}
ReactDOM.render(<App/>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>
<div id="root"/>
Hide result