You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ionic React TypeScript项目如何获取IonModal返回的数据并实现await流程

解决方案

核心问题点

  • 调用dismiss()方法时未传入要返回的自定义数据,导致onDidDismiss事件无法捕获返回值
  • 未给useIonModal添加返回数据的TS类型声明,导致调用dismiss传参时TS报错
  • onDidDismiss事件的返回数据存放在e.detail.data字段中,你之前没有从该字段取值

修正后代码

const ModalBody = ()=>{
  const [text,setText] = useState<string>("") 
  const Dismiss=(data:{isText:boolean, note:string})=>{handleDismiss(data)} 
  return(
    <div>
      <div className={"ion-text-center ion-padding"}>
        <IonTitle>Enter Your Data Here</IonTitle>
        <IonTextarea 
          rows={10} 
          inputMode="text" 
          spellCheck={true} 
          maxlength={2000} 
          className={"ReasonBox"} 
          onIonChange={(e)=>setText(e.detail.value!)}
        />
      </div>
      <div className={"modalButton"}>
        <IonButton expand={"block"} color="logoText" onClick={()=>Dismiss({isText:true,note:text})}>Save</IonButton>
        <IonButton color="logoText" expand="block" onClick={()=>handleDismiss({isText:false,note:""})}>Cancel</IonButton>
      </div>
    </div>
  )
}

// 给useIonModal添加泛型,第二个泛型参数定义modal返回的数据类型
const [present, dismiss] = useIonModal<{}, {isText:boolean, note:string}>(ModalBody);

// 调整Promise返回值类型为你需要的业务数据类型
const noteModal =():Promise<{isText:boolean, note:string}>=>{
  return new Promise((resolve)=>{
    present({
      cssClass: 'my-css',
      onDidDismiss: (e) =>{
        // 从e.detail.data中取出返回的数据
        const returnData = e.detail.data as {isText:boolean, note:string};
        resolve(returnData)  
      }
    })   
  })
}

const handleDismiss=(data:{isText:boolean, note:string})=>{
  console.log(data.note, data.isText);
  // 调用dismiss时把数据传入
  dismiss(data);  
}

使用方式

你可以直接用await调用获取返回数据,符合你的需求:

const handleOpenModal = async () => {
  const modalResult = await noteModal();
  if(modalResult.isText){
    // 拿到用户输入的文本进行后续处理
    const userInput = modalResult.note;
    console.log("用户输入的内容:", userInput);
  }else{
    console.log("用户取消了输入");
  }
}

简化方案(可选)

如果不想自己封装Promise,也可以直接使用present方法的原生返回值,本身就是Promise,会在modal关闭时resolve返回数据:

const handleOpenModal = async () => {
  const { data } = await present({ cssClass: 'my-css' });
  console.log(data); // 直接拿到返回的自定义数据
}

内容的提问来源于stack exchange,提问作者DougB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:15:03