我在react useState中写了一个链表,每次想要改变一个状态,我只需调用'setState(state.next())',或者'dispatch({type:"NEXT"})',这算吗作为良好的行为,否则我不应该依赖链表来做到这一点, 我使用循环链表,因为它可以自动回到第一个状态,在最终状态结束后,它在某些情况下对我有帮助,
type BarState = "expanded"|"collapsed"|"hidden"
type BarAction<T extends string = string > = {
type: T
}
type NavbarState = {
navbarState: BarState
sidebarState: BarState
isCorlorBar: boolean
next: () => NavbarState
}
const Expanded: NavbarState = {
navbarState: "expanded",
sidebarState: "expanded",
isCorlorBar: true,
next: () => ({ ...Collapsed})
}
const FullScreen: NavbarState = {
navbarState: "hidden",
sidebarState: "hidden",
isCorlorBar: false,
next: () => ({...Expanded})
}
const Collapsed: NavbarState = {
navbarState: "collapsed",
sidebarState: "collapsed",
isCorlorBar: false,
next: () => ({ ...FullScreen})
}
const reducer: Reducer<NavbarState, BarAction> = (state: NavbarState, action: BarAction): NavbarState=> {
switch (action.type) {
case 'NEXT': {
return state.next()
}
}
throw Error('Unknown action: ' + action.type);
}
这被认为是好的行为吗,或者我不应该依赖链表来做到这一点。
是的,这很好。这并没有什么问题或者会导致它不起作用。您仍然遵循Reducer 和不可变状态的React 最佳实践。这只是一个简单的状态机。
我们无法判断这是否是适合您的问题领域的解决方案,但如果您认为这比其他替代方案更易于维护,那就很好。请注意,您选择的链接列表表示形式仅允许在单个方向上导航,并且合并额外的子状态可能并不容易。但只有您自己才能判断您是否需要它们。
顺便说一句,没有理由在
next
函数中克隆状态对象。此外,navbarState
始终与 sidebarState
具有相同的值是不寻常的 - 您可以将其简化为单个 state
属性。