在usestate中使用链表来方便状态管理,这被认为是好的行为或坏的行为

问题描述 投票:0回答:1

我在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);
}

这被认为是好的行为吗,或者我不应该依赖链表来做到这一点。

javascript reactjs typescript linked-list
1个回答
0
投票

是的,这很好。这并没有什么问题或者会导致它不起作用。您仍然遵循Reducer 和不可变状态的React 最佳实践。这只是一个简单的状态机。

我们无法判断这是否是适合您的问题领域的解决方案,但如果您认为这比其他替代方案更易于维护,那就很好。请注意,您选择的链接列表表示形式仅允许在单个方向上导航,并且合并额外的子状态可能并不容易。但只有您自己才能判断您是否需要它们。

顺便说一句,没有理由在

next
函数中克隆状态对象。此外,
navbarState
始终与
sidebarState
具有相同的值是不寻常的 - 您可以将其简化为单个
state
属性。

© www.soinside.com 2019 - 2024. All rights reserved.