如在 React Hooks 中给初始值一个空对象

IT技术 reactjs typescript
2021-04-29 04:51:56

我有这个代码

export interface Y{
  title: string;
  name: string;
}

const [x, setX] = useState<Y>(Object);

但是我的朋友说这是个坏主意。为什么使用这个 useState(Object) 是个坏主意?

3个回答

好吧,我发现奇怪的是你传递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);