在 React 下面使用 Modal 是很麻烦的,比如下面这个 antd 的 Modal:
const DemoModal: React.FC = ({isModalVisible,setIsModalVisible,onChange,otherProps}) => {const handleOk = () => {setIsModalVisible(false);};const handleCancel = () => {setIsModalVisible(false);};return (<Modaltitle="Basic Modal"visible={isModalVisible}onOk={handleOk}onCancel={handleCancel}><p>Some contents...</p></Modal>);};
单单一个 Modal 是没什么用的,一般会在父组件中的某个事件里触发,弹出窗口,一顿操作后返回些数据。
const App: React.FC = () => {const [isModalVisible, setIsModalVisible] = useState(false);const [others, setOthers] = useState(null);const showModal = () => {setIsModalVisible(true);};return (<><Button type="primary" onClick={showModal}>Open Modal</Button><DemoModalisModalVisible={isModalVisible}setModalVisible={setIsModalVisible}otherProps={{ name: '123' }}onChange={setOthers}/></>);};
那么以下这些情况也就不得不面对:
一个 Modal 就要添加这么多 state、callback,那么如果有很多个呢? 还有一点是,父组件其实完全不关心 Modal 的状态,它只是需要 Modal 返回的一个结果。我为什么要维护这些个 state、callback?
nice modal react 这个库可以解决上面的问题,具体的 demo 可以官网看。
在调用者视角,它只用传递好参数,等着返回结果就行:
import NiceModal from '@ebay/nice-modal-react';import MyAntdModal from './my-antd-modal'; // created by above codefunction App() {const showAntdModal = () => {// Show a modal with arguments passed to the component as propsNiceModal.show(MyAntdModal, { name: 'Nate' }).then(res => {// do somethingconsole.log(res);});};return (<div className="app"><h1>Nice Modal Examples</h1><div className="demo-buttons"><button onClick={showAntdModal}>Antd Modal</button></div></div>);}
它的好处有: