jeecgboot-vue3筆記(三)彈窗的使用

需求描述

點擊按鈕,彈窗窗體(子組件),確定後在子組件中完成業務邏輯處理(例如添加記錄),然後回調父組件刷新以顯示最近記錄。

實現步驟

子組件

  • 子組件定義BasicModal
 <BasicModal v-bind="$attrs" @register="registerModal" title="登錄樣品" @ok="handleSubmit" :width="700" :helpMessage="['手工登錄原輔料、產品、中控樣等,通過選擇取樣點、檢測方案等登錄']" >
  • 聲明Emits
// 聲明Emits
    const emit = defineEmits(['success', 'register']);  
  • 響應register(父組件中註冊子組件時)
//表單賦值
  const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => { 
      setModalProps({confirmLoading: false}); 
  }); 
  • 響應ok(提交/確定子組件彈窗時執行)
    例如執行提交表單等,通過emit調用父組件方法,達到通知父組件的作用,例如添加記錄後,可通知父組件刷新頁面以顯示新記錄。
//表單提交事件
    async function handleSubmit() {
        try {
            const values = {"loginType":"RawMaterial","SamplingPointid":"1"};
            // const values = await validate();
            let data = refScheduled.value.getFieldsValue();
            // console.log(data);
            setModalProps({confirmLoading: true});
            //提交表單
            await login(values);
            //關閉彈窗
            closeModal();
            //刷新列表
            emit('success');
        } finally {
            setModalProps({confirmLoading: false});
        }
    }

父組件

  • 父組件引入相關ts
import {useModal} from '/@/components/Modal';
  • useModal解構展開獲取register(用於給子組件傳遞)、openModal方法起別名(多個彈窗必須)
const [registerLoginManual, {openModal:openLoginManual}] = useModal();
  • 父組件中子組件定義進行註冊、傳遞ref
<calculation @register="registerCalculation" @success="handleLoginSucc" ref="refCalculation"></calculation>
  • 響應按鈕事件顯示窗體
function onLoginManual(){
  // refLoginManual.value.
  openLoginManual(true, { 
       showFooter: true,
     });
}

解構的openModal和register在響應函數處調用的和組件@register的要一致。