如何在 Ionic React 多按钮表单中执行 HTML5 验证?

如何解决如何在 Ionic React 多按钮表单中执行 HTML5 验证?

当点击下方 CodeSandBox 中的 Add 按钮时,Button => event.nativeEvent.submitter

返回以下 <button type="submit" style="display: none;"></button>

https://codesandbox.io/s/lingering-fog-pe7jl?file=/src/App.tsx

是否可以正确识别触发 onSubmit 事件的 ion-button<button>
正确的按钮将在 aria-label=add 标记之间包含 <ion-button> 或“添加”。

解决方法

如果单独渲染按钮并使用 onClick 事件可能会更好?

例如:

task && (
    <IonButton aria-label="update" type="button" color="secondary" onClick={ onTaskClick }>
    <IonIcon icon={ arrowUpCircleOutline }></IonIcon>
         Update
    <IonButton>

    <IonButton aria-label="delete" type=button" color="danger" onClick={ onDeleteClick }>
    <IonIcon icon={ trashOutline }></IonIcon>
        Delete
    </IonButton>
)

使用这种方法,可以更轻松地知道点击了哪个按钮。

,

使用点击事件并跟踪被点击按钮的 id,您仍然可以使用 refs 提取表单值,参见示例 https://codesandbox.io/s/boring-babbage-y14zv?file=/src/App.tsx:415-2653

const Home: React.FC = () => {
  // const task: Task = {
  //   title: "Planning Tasks",//   time: "30m"
  // };
  const task = undefined;
  const nameRef = React.useRef<any>("");

  const onTaskSubmit = async (event: any) => {
    console.log(nameRef.current.value);
    console.log(event.target.id);

    switch (event.target.id) {
      case "update":
        console.log("Go to onTaskClick()");
        break;
      case "add":
        console.log("Go to onTaskClick()");
        break;
      case "delete":
        console.log("Go to onDeleteClick()");
        break;
      case "reset":
        nameRef.current.value = "";
        break;
    }
  };

  return (
    <IonPage id="home-page">
      <IonHeader>
        <IonToolbar>
          <IonTitle>Task Planner</IonTitle>
        </IonToolbar>
      </IonHeader>
      <IonContent fullscreen>
        <IonHeader collapse="condense">
          <IonToolbar>
            <IonTitle size="large">Tasks</IonTitle>
          </IonToolbar>
        </IonHeader>

        <form>
          <IonItem>
            <IonInput ref={nameRef} placeholder={"Enter Name"}></IonInput>
          </IonItem>

          {task ? (
            <IonButton
              aria-label={"update"}
              id={"update"}
              color={"secondary"}
              onClick={onTaskSubmit}
            >
              <IonIcon icon={arrowUpCircleOutline} slot="start"></IonIcon>
              {"Update"}
            </IonButton>
          ) : (
            <IonButton
              aria-label={"add"}
              id={"add"}
              color={"primary"}
              onClick={onTaskSubmit}
            >
              <IonIcon icon={addCircleOutline} slot="start"></IonIcon>
              {"Add"}
            </IonButton>
          )}

          <IonButton
            aria-label={task ? "delete" : "clear"}
            color="danger"
            id={task ? "delete" : "clear"}
          >
            {task ? (
              <IonIcon icon={trashOutline}></IonIcon>
            ) : (
              <IonIcon icon={closeCircleOutline}></IonIcon>
            )}
            &nbsp;
            {task ? "Delete" : "Clear"}
          </IonButton>
        </form>
      </IonContent>
    </IonPage>
  );
};
,

我能够在 reportValidity() 函数内的 React ref 表单上使用 onClick 并检查是否定义了 task 对象以确定点击了哪个按钮:

在 React 表单中使用 onSubmit 会产生不可预测的结果。

const Home: React.FC = () => {
  // const task: Task = {
  //   time: "30m"
  // };
  const task = undefined;

  const taskForm = useRef<HTMLFormElement>(null);
  const timeEl = useRef<any>('time');

  const onTaskClick = () => {
    if (! taskForm?.current?.reportValidity()) return;
    let taskData: Task = {
      time: (timeEl.current).value
    }

    if (task) {
      // update Task
    } else {
      // add Task
    }
  }

  return (
    <IonPage id="home-page">
      <IonHeader>
        <IonToolbar>
          <IonTitle>Task Planner</IonTitle>
        </IonToolbar>
      </IonHeader>
      <IonContent fullscreen>
        <IonHeader collapse="condense">
          <IonToolbar>
            <IonTitle size="large">Tasks</IonTitle>
          </IonToolbar>
        </IonHeader>

        <form ref={taskForm}>
          <IonInput ref={timeEl} value={task?.time} placeholder="Time" type="text" required={true} pattern="[\d+h]?[\d+m]?" />

          <IonButton onClick={onTaskClick} type="submit" color={task ? "secondary" : "primary"}>        
          {task
            ? <IonIcon icon={arrowUpCircleOutline}></IonIcon>
            : <IonIcon icon={addCircleOutline}></IonIcon>            
          }
          &nbsp;
          {task
            ? "Update"            
            : "Add"            
          }        
          </IonButton>

          <IonButton onClick={onDeleteClick} type={task ? "submit" : "reset"} color="danger">              
          {task
            ? <IonIcon icon={trashOutline}></IonIcon>
            : <IonIcon icon={closeCircleOutline}></IonIcon>            
          }
          &nbsp;
          {task
            ? "Delete"            
            : "Clear"            
          }
          </IonButton>
        </form>
      </IonContent>
    </IonPage>
  );
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?