主版本
分支
主版本 (6.23.1)開發版
版本
6.23.1v4/5.xv3.x
useSubmit

useSubmit

<Form> 的命令式版本,讓程式設計師,而不是使用者,提交表單。

這個功能只有在使用數據路由器時才有效,詳見 選擇路由器

舉例來說,表單中只要有值變動,就會提交表單。

import { useSubmit, Form } from "react-router-dom";

function SearchField() {
  let submit = useSubmit();
  return (
    <Form
      onChange={(event) => {
        submit(event.currentTarget);
      }}
    >
      <input type="text" name="search" />
      <button type="submit">Search</button>
    </Form>
  );
}

如果你想在一段時間內沒有動作後自動將某人登出網站,這個功能也會派上用場。在本例中,我們將「沒有動作」定義為使用者在 5 分鐘後沒有瀏覽到其他頁面。

import { useSubmit, useLocation } from "react-router-dom";
import { useEffect } from "react";

function AdminPage() {
  useSessionTimeout();
  return <div>{/* ... */}</div>;
}

function useSessionTimeout() {
  const submit = useSubmit();
  const location = useLocation();

  useEffect(() => {
    const timer = setTimeout(() => {
      submit(null, { method: "post", action: "/logout" });
    }, 5 * 60_000);

    return () => clearTimeout(timer);
  }, [submit, location]);
}

提交目標

submit 的第一個參數接受許多不同的值。

你可以提交任何表單或表單輸入元件。

// input element events
<input onChange={(event) => submit(event.currentTarget)} />;

// React refs
let ref = useRef();
<button ref={ref} />;
submit(ref.current);

你可以提交 FormData

let formData = new FormData();
formData.append("cheese", "gouda");
submit(formData);

或者你可以提交 URLSearchParams

let searchParams = new URLSearchParams();
searchParams.append("cheese", "gouda");
submit(searchParams);

或者任何 URLSearchParams 建構器接受的值。

submit("cheese=gouda&toasted=yes");
submit([
  ["cheese", "gouda"],
  ["toasted", "yes"],
]);

如果你提交 JSON 物件做為 POST 提交,預設行為會將資料編碼成 FormData

submit(
  { key: "value" },
  {
    method: "post",
    encType: "application/x-www-form-urlencoded",
  }
);
// will serialize into request.formData() in your action
// and will show up on useNavigation().formData during the navigation

或者你可以選擇 JSON 編碼。

submit(
  { key: "value" },
  { method: "post", encType: "application/json" }
);
// will serialize into request.json() in your action
// and will show up on useNavigation().json during the navigation

submit('{"key":"value"}', {
  method: "post",
  encType: "application/json",
});
// will encode into request.json() in your action
// and will show up on useNavigation().json during the navigation

或者純文字。

submit("value", { method: "post", encType: "text/plain" });
// will serialize into request.text() in your action
// and will show up on useNavigation().text during the navigation

提交選項

第二個參數是一組選項,這些選項(大部分)會直接對應到表單提交屬性。

submit(null, {
  method: "post",
  action: "/logout",
});

// same as
<Form action="/logout" method="post" />;

useResolvedPath 文件的 Splat 路徑 部分,請參閱適用於 splat 路徑中相對 useSubmit() action 行為的 future.v7_relativeSplatPath 未來標記的行為說明。

由於提交是導覽,因此選項也可以包含其他導覽相關道具,如 <Form> 中的

  • fetcherKey
  • navigate
  • preventScrollReset
  • relative
  • replace
  • state
  • unstable_viewTransition

options.unstable_flushSync

unstable_flushSync 選項表示 React Router DOM 會針對此提交的初始狀態更新,呼叫 ReactDOM.flushSync,而非預設的 React.startTransition。此動作可讓你在更新沖刷到 DOM 時立即執行同步 DOM 動作。

請注意,此 API 標示為不穩定,且可能會在未進行重大版本發佈的情況下,進行重大變更