【问题标题】:How can i get multiple recoil atoms when using components multiple?使用多个组件时如何获得多个反冲原子?
【发布时间】:2021-05-06 08:23:42
【问题描述】:

在某些组件中,我使用反冲原子来管理我的状态。一个例子是我的模态组件。它看起来像这样:

export const modalState = atom({
  key: "modalState",
  default: false
})

export const useToggleModalState = () => {
  const setModalState = useSetRecoilState(modalState)
  return (state, callback) => {
     setModalState(state)
     if (callback) {
        callback()
     }
  }
}

export const Modal = (props) => {
  <Transition show={modalState}>
    <Dialog>
      <Dialog.Title>My Modal Headline</Dialog.title>
      <Dialog.Description>My Modal Description</Dialog.Description>
    </Dialog>
  </Transition>
}

我正在使用这样的模式:

const toggleModalState = useToggleModalState();

return (
  <Modal />
  <Button text="Close Modal" onClick={() => toggleModalState(false)} />
)

但是,如果我多次使用模态,模态会自动复制,但 我仍然对所有模态只使用一种状态。当然,我不想要那个。如果我多次使用一个组件,我希望多次创建状态,这样我就可以单独更改每个组件的状态。

我读到还有atomFamilys。我现在可以使用这些吗?那我的代码应该是什么样子?如果我多次使用一个组件,是否也可以自动创建多个原子?

【问题讨论】:

    标签: reactjs recoiljs


    【解决方案1】:

    你为什么要为此使用后坐力? modal 的 state 与 modal 本身相关联,它不需要访问全局状态。

    您可以只使用useState 来确定是否要在组件中显示模式:

    export const Modal = (props) => {
      <Transition show={props.show}>
        <Dialog>
          <Dialog.Title>My Modal Headline</Dialog.title>
          <Dialog.Description>My Modal Description</Dialog.Description>
        </Dialog>
      </Transition>
    }
    
    export const ComponentWithModal = () => {
      const [showModal, setShowModal] = useState(false);
    
      return (
        <>
          <Modal show={showModal}/>
          <Button text="Open Modal" onClick={() => setShowModal(true)} />
          <Button text="Close Modal" onClick={() => setShowModal(false)} />
        </>
      )
    }
    

    【讨论】:

    • 我同意,useState 当然也可以使用。但是,我想让我的状态管理更简单、更集中。起初我也使用了您的方法,但是随着时间的流逝,它变得令人困惑。哪些组件是无状态的或有状态的?另一种可能性是在模态本身中定义状态,但是您必须再次使用 ref 等才能更改外部状态。我已经找到了解决方案。使用atomFamily 现在可以使用。还是谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多