微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Chakra UI 在单个组件中使用多个模型

如何解决Chakra UI 在单个组件中使用多个模型

我正在使用 chakra ui 并且我想在一个组件中使用两个模态。

const { isOpen,onopen,onClose } = usedisclosure()

 <Button colorScheme="teal" size="xs" mr='2' onClick={onopen} >
                        Edit
                    </Button>
                    {/* Edit modal */}
                    <Modal isOpen={isOpen} onClose={onClose}>
                            <Modaloverlay />
                            <ModalContent>
                            <ModalHeader>Edit Modal</ModalHeader>
                            <ModalCloseButton />
                            <ModalBody>
                               Edit Modal
                            </ModalBody>

                            <ModalFooter>
                            <Button variant="ghost" mr={3} onClick={onClose}>Cancel</Button>
                                <Button colorScheme="red" onClick={()=>{deleteAddress(address.id)}}>
                                    Delete
                                </Button>
                                
                            </ModalFooter>
                            </ModalContent>
                        </Modal>


                    {/* Delete Address */}

                    <Button colorScheme="red" size="xs"  onClick={onopen}>
                        Delete
                    </Button> 
                    <Modal isOpen={isOpen} onClose={onClose}>
                            <Modaloverlay />
                            <ModalContent>
                            <ModalHeader>Delete Shipping Address</ModalHeader>
                            <ModalCloseButton />
                            <ModalBody>
                                Are you sure you want to delete the shipping address?
                            </ModalBody>

                            <ModalFooter>
                            <Button variant="ghost" mr={3} onClick={onClose}>Cancel</Button>
                                <Button colorScheme="red" onClick={()=>{deleteAddress(address.id)}}>
                                    Delete
                                </Button>
                                
                            </ModalFooter>
                            </ModalContent>
                        </Modal>

isOpen、onopen、onClose 不能作为变量更改,因为它们是内置的脉轮函数。 有人可以建议我改变其中两个模态(Chakra UI)操作的方法吗?

解决方法

您可以创建一个使用 useDisclosure 的自定义模态组件。然后你可以有这个自定义模态组件的多个实例,而模态组件不会共享相同的状态:

const CustomModal = ({ showModalButtonText,modalHeader,modalBody }) => {
  const { isOpen,onOpen,onClose } = useDisclosure();
  return (
    <>
      <Button colorScheme="red" size="xs" onClick={onOpen}>
        {showModalButtonText}
      </Button>
      <Modal isOpen={isOpen} onClose={onClose}>
        <ModalOverlay />
        <ModalContent>
          <ModalHeader>{modalHeader}</ModalHeader>
          <ModalCloseButton />
          <ModalBody>{modalBody}</ModalBody>

          <ModalFooter>
            <Button variant="ghost" mr={3} onClick={onClose}>
              Cancel
            </Button>
            <Button
              colorScheme="red"
              onClick={() => {
                alert(1);
              }}
            >
              Delete
            </Button>
          </ModalFooter>
        </ModalContent>
      </Modal>
    </>
  );
};

export default function App() {
  return (
    <div className="App">
      <CustomModal
        showModalButtonText="Edit"
        modalHeader="Edit Modal"
        modalBody="Edit Modal"
      />
      <CustomModal
        showModalButtonText="Delete"
        modalHeader="Delete Shipping Address"
        modalBody="Are you sure you want to delete the shipping address?"
      />
    </div>
  );
}

这样,CustomModal 的每个实例都会跟踪自己的 isOpenonOpenonClose 状态。

由于在您的问题中唯一的动态部分是用于打开的按钮、模态、标题文本和模态正文文本,因此我制作了道具,因此可以为每个实例单独设置这些道具。如果需要更多的部分是动态的,您可以根据需要添加道具。

我对模态做了一些小改动,以便于测试。

,

您可以简单地更改变量的名称isOpenonOpenonClose 放手:

const { isOpen: isEditOpen,onOpen: onEditOpen,onClose: onEditClose } = useDisclosure()
const { isOpen: isDeleteOpen,onOpen: onDeleteOpen,onClose: onDeleteClose } = useDisclosure()

<Button colorScheme="teal" size="xs" mr='2' onClick={onEditOpen} >
    Edit
</Button>
{/* Edit modal */}
<Modal isOpen={isEditOpen} onClose={onEditClose}>
    <ModalOverlay />
    <ModalContent>
    <ModalHeader>Edit Modal</ModalHeader>
    <ModalCloseButton />
    <ModalBody>
        Edit Modal
    </ModalBody>

    <ModalFooter>
    <Button variant="ghost" mr={3} onClick={onEditClose}>Cancel</Button>
        <Button colorScheme="red" onClick={()=>{deleteAddress(address.id)}}>
            Delete
        </Button>
        
    </ModalFooter>
    </ModalContent>
</Modal>


{/* Delete Address */}

<Button colorScheme="red" size="xs"  onClick={onDeleteOpen}>
    Delete
</Button> 
<Modal isOpen={isDeleteOpen} onClose={onSecondModalClose}>
    <ModalOverlay />
    <ModalContent>
    <ModalHeader>Delete Shipping Address</ModalHeader>
    <ModalCloseButton />
    <ModalBody>
        Are you sure you want to delete the shipping address?
    </ModalBody>

    <ModalFooter>
    <Button variant="ghost" mr={3} onClick={onDeleteClose}>Cancel</Button>
        <Button colorScheme="red" onClick={()=>{deleteAddress(address.id)}}>
            Delete
        </Button>
        
    </ModalFooter>
    </ModalContent>
</Modal>

再举一个例子:

第一个模态:

const { isOpen: isFirstModalOpen,onOpen: onFristModalOpen,onClose: onFirstModalClose } = useDisclosure()

第二模态:

const { isOpen: isSecondModalOpen,onOpen: onSecondModalOpen,onClose: onSecondModalClose } = useDisclosure()

现在这些变量具有不同的值,因此您可以在任何地方使用新名称!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?