需求:刪除功能使用confirm彈窗時希望點擊確認后,請求刪除接口,請求成功后在關閉confirm彈窗(避免請求還未完成用戶有其他操作)
問題:antd的Modal.confirm窗口官方給出的官方實例通過destroy()銷毀彈窗,一般點擊后直接關閉,而不是loading完成后關閉,所以我們需要找一個恰當的時機觸發destroy()
解決:
注:該項目是react項目,用到了umi和Model,mock, 代碼中removeLoading對應的是刪除請求的loading
//刪除的點擊事件 onRemove = (values) => { const { dispatch, removeLoading } = this.props; let confimModal = Modal.confirm({ title: '刪除', content: '是否確認刪除?', onOk:(values) => { return new Promise((res, rej) => { //點擊確認進行刪除請求,並且將confirmModal保存在state中, dispatch({ type: 'api/remove', payload: values }); this.setState({ confimModal, confirmState:true, //進入頁面時confirmState默認為false,只有在點擊確認后,數據請求成功之前標記為true }) }).catch((e) => console.warn(e)); }, onCancel() { }, }); }
根據react的生命周期,我們可以利用shouldComponentUpdate(),來進行監聽,控制刪除彈窗的銷毀
shouldComponentUpdate(nextProps, nextState){ //關閉刪除彈窗 if(nextState.confirmState&&nextState.confimModal){ //當confirmState為ture並且confirmModal存在時證明用戶點擊了刪除確認按鈕 //當接口在請求過程中,removeLoading會變為ture,請求成功后removeLoading為false,所以當為false時可以將刪除彈窗銷毀,並將關於彈窗的兩個參數設置為初始狀態 if(nextProps.removeLoading!==undefined&&!nextProps.removeLoading){ nextState.confimModal.destroy(); this.setState({ confirmState:false, confimModal:null }) } } return true }
