安装
安装 Web 版本。
路由配置
<RouterProvider>
: 配置路由
首先,新建 router.js
文件,配置路由。每一路径对应一个组件。
然后,使用 RouterProvider
加载路由。
<Outlet />
动态切换内容
设置 <Outlet />
根据路由动态切换内容。
<Link>
:路由跳转
Link
组件来实现路由跳转,可以使用相对路径,并实现客户端路由,只切换变化部分。
loader
:加载远程数据(新特性)
首先,需要获取数据的组件里面导出 loader
函数,编写数据获取操作,并返回数据。
然后,在需要获取数据的路由对象里面添加一个 loader
配置。
使用 useLoaderData
获取 loader
数据。
获取动态路由参数并加载数据
<NavLink>
: 高亮选中导航菜单
className
回调函数中可以获取到, isActive
isPending
两个状态属性,然后就可以根据这两个状态加载不同的样式。
增删改查
首先,配置路由跳转。
然后,使用 <Form>
组件进行路由跳转。
添加数据 :使用 <Form>
发送 POST
请求
使用 <Form>
发送 POST
请求。
loader
和 action
的区别是 loader
用于加载数据,action
则用于修改数据。当 action
改变数据后,Router
会自动使用 loader
获取数据。
下面添加 action
, <Form>
将原生的表单进行了拦截,并将表单数据注入到了 request
对象中。使用 formData()
获取表单数据,返回一个类似于 Map
类型。可以 formData.get("name")
来获取没有表单项的数据。
为路由配置 action
属性。
redirect: 重定向页面
编辑数据 :展示表单默认值
使用表单的 defaultValue
属性设置默认值。
编辑数据: 发送 PUT
请求
根据编辑和添加指定不同的 method
值。
获取表单不同的 request.method
值。
配置编辑的路由。
删除数据:发送 DELETE
请求
action="delete"
为路由添加路径 /delete
。
添加删除的 action
。
配置路由。
navigate
: 编程式的控制导航
使用 useNavigate()
进行页面跳转。
查询数据:GET
请求+请求参数
Form
表单会把表单控件的值以键值对的形式追加到 URL
后边,这些键值对的 key
就是 name
属性,值就是 value
属性。
使用 url.searchParams
为请求数据,添加查询参数。
查询数据:编程式提交表单
监听 onChange
执行 submit()
方法。通过 event.currentTarget.form
访问表单实例。
查询数据:URL 与表单的同步
获取 URL
参数 url.searchParams
并返回。
SearchNote
中使用 useLoaderData()
获取父组件中的数据。并设置 defaultValue
为 term
。
push
vs replace
: 防止后退太多层
修改历史记录方式,不是第一次搜索就使用 replace
。
操作数据:不发生路由跳转和刷新页面
使用 useFetcher()
返回对象中的 <fetcher.Form>
来实现表单的提交。
路由中添加 action
配置。
操作数据: Optimistic UI
乐观 UI
是指先为用户返回交互效果,然后再请求服务器,更新数据。更新不成功也没有关系,下次直接展示数据库中的值。
定义一个 likes
变量,进行点赞处理之后,更新表单中的 value
值。
异常处理
加载状态:全局加载状态
使用 useNavigation()
获取到加载状态 state
,然后根据状态进行展示加载状态。
加载状态: 局部加载状态:搜索状态
通过搜索关键词 term
判断是否在搜索中。
错误处理:全屏错误提示
使用 useRouteError()
访问错误信息。
在需要展示错误的地方添加 errorElement
属性。
错误处理:局部错误提示
需要在展示错误的同时展示侧边栏,就可以将 errorElement
放到 children
的一个对象里边。所有页面都放到这个对象的 children
里面。也可以在对应的组件添加 errorElement
错误。错误是从当前节点向上查找 errorElement
,如果都没有就展示Router
默认错误。
错误处理:自定义错误信息
通过 res.status
判断是否需要抛出错误,如果有错误就使用 throw new Response()
抛出一个错误对象。
json utility
: 组装自定义响应数据
第一个参数是响应数据,第二个参数是 header
属性。
优化
先渲染后加载数据:Deferred
数据方式和加载状态展示
使用 defer()
传入对象,需要注意的是要手动进行处理 Promise
。使用 useLoaderData()
获取数据。使用 <React.Suspense>
和 <Await>
显示加载状态和请求数据。
使用 useAsyncValue
访问 deffered
数据
将需要展示的视图定义为一个单独的组件 <Note />
,然后在组件中使用 useAsyncValue()
就可以访问到最近一个父组件 <Await>
中的数据 data.note
。
配置恢复滚动位置
<ScrollRestoration>
默认会返回 location.key
, location.key
相同就会滚动到相应的位置。返回 location.pathname
,相同路径就会滚动到相同位置。
使用 JSX
配置路由
每一个路由都是一个 <Route>
组件。