• Brave
    2021-08-20
    对于思考题这是我的想法: import React, {useContext, useReducer} from 'react' import {reducer, ModalContext} from "./NiceModal/modalContext"; import Demo1 from "./demo1"; const Main = () => { const context = useContext(ModalContext) const [state, dispatch] = useReducer(reducer, context.state) return ( <ModalContext.Provider value={{ state, dispatch, }}> <Demo1/> </ModalContext.Provider> ) } export default Main 创建useNiceModal: const useNiceModal = (modalId) => { const {state, dispatch} = useContext(ModalContext) const args = state[modalId] const show = useCallback((args) => { dispatch({ type: 'show', modalId, args }) }, [modalId, args, dispatch]) const hide = useCallback(() => { dispatch({ type: 'hide', modalId }) }, [dispatch, modalId]) return { show, hide, args, visible: !!args, } } export default useNiceModal 在Demo1中: const Demo1 = () => { const modalId = 'my-first-modal' const Content = (props) => { return ( <div>Hello world!</div> ) } const MyModal = createNiceModal({ modalId, title: '这是我的标题', content: '这是我的内容' }, Content) const modal = useNiceModal(modalId) return ( <div> <button onClick={() => modal.show()}> 打开弹窗 </button> <MyModal/> </div> ) } export default Demo1
    展开

    作者回复: 回答的很好,结合了 useReducer 和 useContext ,可以看到,从 redux 转到 context,基本代码逻辑是没有变化的,都是 dispatch action。这里也看到了 useReducer 的使用场景,通常都会和 useContext 结合来完成一些比较复杂的数据管理逻辑,在一定程度可以取代 redux。

    
    9
  • SenjougaharaSama
    2021-07-16
    为啥不直接通过portal?

    作者回复: 文中示例的 antd modal 就是基于 portal 实现的。

    
    
  • 咚门
    2021-10-05
    其实我感觉有点简单问题复杂化了,文章一开始要解决的问题是两个组件需要用到同一个modal的问题,这时候本身就不该把UserInfoModal放到Sider和UserInfo的父亲组件,这不符合react的组合思想,而是应该在Sider和UserInfo里分别调用UserInfoModal 并控制显示与否就好了。定义全局modal状态管理违背了前面几章讲的文件组合去依赖这个原则吧,整个系统的modal高度耦合,新人来了得花很多时间理解。并且,看代码虽然判断了visible反回null,但是本身是有多少个modal就一直存在了少个 instance,而modal往往只能同时存在一个。
    
    17
  • 珍惜眼前人
    2021-06-29
    建议大家一定要跟着老师的代码敲,这节对于我这个新手来说有点难度
    
    9
  • Bug般的存在
    2021-07-04
    modal.show().then() 感觉这个思路打死我我也想不出来,我不配做程序员😂
    共 1 条评论
    3
  • 何用
    2021-06-26
    弹出层并不仅限于 Modal, 还有 Drawer 等等。这些弹出层显隐处理逻辑都很相似,因而可以考虑个更通用的命名,比如说叫 Overlay。
    
    3
  • 咚门
    2021-10-05
    其实我感觉有点简单问题复杂化了,文章一开始要解决的问题是两个组件需要用到同一个modal的问题,这时候本身就不该把UserInfoModal放到Sider和UserInfo的父亲组件,这不符合react的组合思想,而是应该在Sider和UserInfo里分别调用UserInfoModal 并控制显示与否就好了。定义全局modal状态管理违背了前面几章讲的文件组合去依赖这个原则吧,整个系统的modal高度耦合,新人来了得花很多时间理解。并且,看代码虽然判断了visible反回null,但是本身是有多少个modal就一直存在了少个 instance,而modal往往只能同时存在一个。
    
    2
  • 灵感_idea
    2022-12-26 来自广东
    本章节的讲解,看似是把简单问题复杂化,也不太好理解,但其实老师只是提供一种思路,即,在考虑代码复用性、维护性时,不要头疼医头,脚疼医脚,可以有一种更系统化,通用化的方式解决问题,初始成本是高的,后续就低很多、清晰很多了。从另一个角度看,这些代码或许不适合在初建项目时使用,而是在迭代、重构的时候更佳,即不过早优化,就好理解了。
    
    1
  • Geek_4e92cc
    2022-05-30
    为什么不用传送门传到根节点render呢?
    
    1
  • Geek_6304e3
    2022-02-26
    感觉没必要,这样子简单的问题复杂化了
    
    1