useNavigation
通过 useNavigation 函数获取全局导航状态,根据导航状态实现加载页面、导航时禁用表单和提交按钮等
1 | import { useNavigation } from 'react-router'; |
navigation 对象中包含以下属性
-
state:导航响应式状态,有以下值idle:初始状态loading:下一页加载中submitting:表单提交执行action中
对于一般导航和表格 GET 提交,状态变化过程为
idle->loading->idle,对于 POST、DELETE 等表单提交导航(由表单提交导致的导航),状态变化过程为idle->submitting->loading->idle -
location:导航目标页面的location对象 -
formData:表单提交导航的提交数据 -
json:useSubmit提交的按application/json编码的 json 数据 -
text:useSubmit提交的按text/plain编码的纯文本数据 -
formAction:表单提交导航的action属性 -
formMethod:表单提交导航的method属性 -
formEncType:表单提交导航的编码格式
useFetcher
在某些情况下,需要模拟 Form 组件的行为而不进行导航时,可以使用 useFetcher 来实现,useFetcher 返回一个 fetcher 对象,使用该对象模拟 Form 组件的行为
1 | import { useFetcher } from 'react-router'; |
useFetcher 默认创建一个作用域为当前组件的 fetcher 对象,当 fetcher 需要跨组件使用时,可传入一个带有 key 属性的对象参数,在不同组件中根据 key 属性值来获取 fetcher
Form 组件
fetcher 对象中提供了一个不具有导航行为的 <fetcher.Form> 组件,使用方法与 <Form> 组件相同
1 | function SomeComponent() { |
调用 loader 与 action
可通过 fetcher 在不导航的情况下调用路由的 loader 和 action,主要使用 load 和 submit 方法
load 方法
load 方法接收一个路由 path,调用该路由的 loader
1 | import { useFetcher } from "react-router"; |
submit 方法
submit 方法实现程序式的 <fetcher.Form> 组件提交,类似 <Form> 与 useSubmit,用法与 useSubmit 相同
1 | import { useFetcher } from "react-router"; |
data 属性
通过 fetcher.data 属性获取 loader 或 action 返回的数据,未调用 loader 或 action 时,data 属性为 null,该属性同时也是一个响应式状态
1 | function ProductDetails({ product }) { |
其他属性
state:fetcher状态值idle:初始状态submitting:fetcher提交且 action 函数正在执行loading:loader 正在执行
formData:表单提交数据json:表单提交的使用application/json编码的数据text:表单提交的使用text/plain编码的数据formAction:表单action属性值