在 React Hook 中设置一个对象
Setting an object in React Hook
使用这两种方法在 React Hook 中设置对象有什么不同吗?
const INITIAL_STATE = {
foo = '',
bar = ''
}
// ...
// Method 1
const [state, setState] = useState(INITIAL_STATE);
// Method 2
const [state, setState] = useState({ ...INITIAL_STATE });
两种方法都很好,我只是想知道使用其中一种方法是否有任何退路或优势。
useState
将仅在第一次调用时使用初始状态。但它会在每次渲染时调用,并且 { ...INITIAL_STATE }
每次都会创建一个新的未使用对象。此开销应该不会引起注意。
方法 1 传入初始对象,这意味着挂钩将始终使用对该原始对象的引用。
方法二是将原来的对象展开成一个新的对象来创建一个新的对象,这意味着钩子将不再引用原来的对象。
首先初始化对象应该这样写,用冒号代替等号
const INITIAL_STATE = {
foo : '',
bar : ''
}
在使用方法 1 时,挂钩将引用 INITIAL_STATE
,这意味着对此 INITIAL_STATE
所做的任何更改也会影响状态。
例如,创建一个按钮并给它一个onClick函数来更新INITIAL_STATE.foo的值,也会影响state.foo,如果你console.log(state.foo), 可以看到数值已经更新了
方法2,它不会引用原始对象,而是在每次调用钩子函数时创建一个新对象,但是这种解构行为只是做一个浅拷贝,如果INITIAL_STATE
具有一个值为任何对象或数组的属性,当您对 INITIAL_STATE
.
进行更改时,它也会引用该对象
function changeInitialState(){
const INITIAL_STATE = {
foo: '',
bar: '',
something: {
name: 0
}
}
const [state, setState] = useState({...INITIAL_STATE})
return <button onClick={() => {
INITIAL_STATE.something.name = 'hello';
console.log(state.something.name) // you will see the name has been updated as well
}}></button>
}
使用这两种方法在 React Hook 中设置对象有什么不同吗?
const INITIAL_STATE = {
foo = '',
bar = ''
}
// ...
// Method 1
const [state, setState] = useState(INITIAL_STATE);
// Method 2
const [state, setState] = useState({ ...INITIAL_STATE });
两种方法都很好,我只是想知道使用其中一种方法是否有任何退路或优势。
useState
将仅在第一次调用时使用初始状态。但它会在每次渲染时调用,并且 { ...INITIAL_STATE }
每次都会创建一个新的未使用对象。此开销应该不会引起注意。
方法 1 传入初始对象,这意味着挂钩将始终使用对该原始对象的引用。
方法二是将原来的对象展开成一个新的对象来创建一个新的对象,这意味着钩子将不再引用原来的对象。
首先初始化对象应该这样写,用冒号代替等号
const INITIAL_STATE = {
foo : '',
bar : ''
}
在使用方法 1 时,挂钩将引用 INITIAL_STATE
,这意味着对此 INITIAL_STATE
所做的任何更改也会影响状态。
例如,创建一个按钮并给它一个onClick函数来更新INITIAL_STATE.foo的值,也会影响state.foo,如果你console.log(state.foo), 可以看到数值已经更新了
方法2,它不会引用原始对象,而是在每次调用钩子函数时创建一个新对象,但是这种解构行为只是做一个浅拷贝,如果INITIAL_STATE
具有一个值为任何对象或数组的属性,当您对 INITIAL_STATE
.
function changeInitialState(){
const INITIAL_STATE = {
foo: '',
bar: '',
something: {
name: 0
}
}
const [state, setState] = useState({...INITIAL_STATE})
return <button onClick={() => {
INITIAL_STATE.something.name = 'hello';
console.log(state.something.name) // you will see the name has been updated as well
}}></button>
}