我有这个代码
export interface Y{
title: string;
name: string;
}
const [x, setX] = useState<Y>(Object);
但是我的朋友说这是个坏主意。为什么使用这个 useState(Object) 是个坏主意?
我有这个代码
export interface Y{
title: string;
name: string;
}
const [x, setX] = useState<Y>(Object);
但是我的朋友说这是个坏主意。为什么使用这个 useState(Object) 是个坏主意?
好吧,我发现奇怪的是你传递Object
了 useState 钩子。
export interface Y{
title: string;
name: string;
}
const [x, setX] = useState<Y>();
在那种情况下 x 的类型是 Y | undefined
,这更好,因为现在我们知道 x 是空的。
Object
像你一样通过会让typescript快乐,但现在你欺骗自己,因为typescript不会保护你。
根据情况,我建议走第一条路线并将 useState 留空,或者硬编码对象结构,例如
const [x, setX] = useState<Y>({title: '', name: ''});
如果问题是使用 useReducer 还是 useState - 我认为这完全取决于您更改对象的频率。如果逻辑足够简单,使用 useReducer 可能是一种矫枉过正。另外,不要忘记 useState 只是 useReducer 钩子的一个包装器,afaik。
const [x, setX] = useState<Y>(Object);
这不是有效的typescript,因为泛型参数的使用<Y>
使类型系统期望初始状态为类型Y
(或空),从而成为唯一有效的输入,useState({ title: '', name: '' })
或useState(null)
此外,useState 钩子不会对状态执行部分更新。
export interface Y{
title: string;
name: string;
}
const [x, setX] = useState<Y>({ title: 'Mr', name: 'Jack' });
setX({ name: 'John' }) // <-- title: undefined
setX({ ...x, name: 'john' }) // <-- You will have to do this instead
性能和推理明智这对于小对象来说是可以的,但是当你有一个大的状态对象时,状态管理变得困难。但是将状态分解为许多变量会使代码变得冗长。在这种情况下,您可以使用reducer hook。
下面的代码对我有用
const [selectedAccount, setselectedAccount] = useState(Object);