【实战】 六、用户体验优化 - 加载中和错误状态处理(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十)

这篇具有很好参考价值的文章主要介绍了【实战】 六、用户体验优化 - 加载中和错误状态处理(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


学习内容来源:React + React Hook + TS 最佳实践-慕课网


相对原教程,我在学习开始时(2023.03)采用的是当前最新版本:

版本
react & react-dom ^18.2.0
react-router & react-router-dom ^6.11.2
antd ^4.24.8
@commitlint/cli & @commitlint/config-conventional ^17.4.4
eslint-config-prettier ^8.6.0
husky ^8.0.3
lint-staged ^13.1.2
prettier 2.8.4
json-server 0.17.2
craco-less ^2.0.0
@craco/craco ^7.1.0
qs ^6.11.0
dayjs ^1.11.7
react-helmet ^6.1.0
@types/react-helmet ^6.1.6
react-query ^6.1.0
@welldone-software/why-did-you-render ^7.0.1
@emotion/react & @emotion/styled ^11.10.6

具体配置、操作和内容会有差异,“坑”也会有所不同。。。


一、项目起航:项目初始化与配置

  • 一、项目起航:项目初始化与配置

二、React 与 Hook 应用:实现项目列表

  • 二、React 与 Hook 应用:实现项目列表

三、TS 应用:JS神助攻 - 强类型

  • 三、 TS 应用:JS神助攻 - 强类型

四、JWT、用户认证与异步请求

  • 四、 JWT、用户认证与异步请求(上)

  • 四、 JWT、用户认证与异步请求(下)

五、CSS 其实很简单 - 用 CSS-in-JS 添加样式

  • 五、CSS 其实很简单 - 用 CSS-in-JS 添加样式(上)

  • 五、CSS 其实很简单 - 用 CSS-in-JS 添加样式(下)

六、用户体验优化 - 加载中和错误状态处理

1~2

  • 六、用户体验优化 - 加载中和错误状态处理(上)

3

  • 六、用户体验优化 - 加载中和错误状态处理(中)

4.用useAsync获取用户信息

修改 src\components\lib.tsx(新增全屏 Loading 组件 和 全屏 Error 展示组件):

import { Spin, Typography } from "antd";
import { DevTools } from "jira-dev-tool";

...
const FullPage = styled.div`
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
`

export const FullPageLoading = () => <FullPage>
  <Spin size="large"/>
</FullPage>

export const FullPageErrorFallback = ({error}: {error: Error | null}) => <FullPage>
  <DevTools/>
  <Typography.Text type="danger">{error?.message}</Typography.Text>
</FullPage>
  • 为了展示报错信息的同时,DevTools 依旧展示,需要引入

修改 src\context\auth-context.tsx(使用 useAsync 改造,并新增全屏 Loading 组件 和 全屏 Error 展示组件)(部分未修改内容省略):

...
import { useAsync } from "utils/use-async";
import { FullPageErrorFallback, FullPageLoading } from "components/lib";

...

export const AuthProvider = ({ children }: { children: ReactNode }) => {
  // 这里要考虑到初始值的类型与后续值类型,取并组成一个泛型
  // const [user, setUser] = useState<User | null>(null);
  const { data: user, error, isLoading, isReady, isSuccess, isError, run, setData: setUser } = useAsync<User | null>()

  ...

  useMount(() => run(initUser()));

  if (isReady || isLoading) {
    return <FullPageLoading/>
  }

  if (isError) {
    return <FullPageErrorFallback error={error}/>
  }

  return (...);
};
...

查看效果:完美!

5.实现 Error Boundaries,捕获边界错误

修改 src\unauthenticated-app\index.tsx(新增一个“抛出异常”按钮):

...
export const UnauthenticatedApp = () => {
  ...
  return (
    <Container>
      <Header />
      <Background />
      <Button onClick={() => {
        throw new Error('点击抛出一个异常')
      }}>抛出异常</Button>
      <ShadowCard>...</ShadowCard>
    </Container>
  );
};
...

修改 src\authenticated-app.tsx(新增一个变量展示它不存在的一个属性):

...
export const AuthenticatedApp = () => {
  ...
  const value: any = undefined;
  ...
  return (
    <Container>
      { value.notExist }
      ...
    </Container>
  );
};
...

编译代码并全局安装推荐的 serve 库,然后启动并访问:

npm run build
yarn global add serve
serve -s build

点击“抛出异常”按钮:

  • 测试环境:页面展示抛出异常
  • 生产环境:页面不变,控制台抛出异常

登录后:

  • 测试环境:页面展示异常信息
  • 生产环境:页面空白,控制台打印出异常信息

这两种异常对比可看出:在渲染阶段出现未被捕获的异常,整个组件树都会被卸载(错误的展示内容比空白内容更可怕)

  • 错误边界 – React

接下来写一个错误边界捕获组件 —— 新建:src\components\error-boundary.tsx

import React, { ReactNode } from "react";

type FallbackRender = (props: { error: Error | null }) => React.ReactElement

// children: ReactNode
export class ErrorBoundary extends React.Component<React.PropsWithChildren<{fallbackRender: FallbackRender}>, { error: Error | null }> {
  state = { error: null }

  // 当子组件抛出异常,这里会接受到并更改 state
  static getDerivedStateFromError(error: Error) {
    return { error }
  }

  render() {
    const { error } = this.state
    const { fallbackRender, children } = this.props
    return error ? fallbackRender({ error }) : children
  }
}
  • 如果一个 class 组件中定义了 static getDerivedStateFromError()componentDidCatch() 这两个生命周期方法中的任意一个(或两个)时,那么它就变成一个错误边界
  • React.PropsWithChildrenReact 中的一个 Utility Types (工具类型) 类型处理器,将传入属性以类似 Object.assign 的方式合并:
    • type PropsWithChildren<P = unknown> = P & { children?: ReactNode | undefined };

修改:src\App.tsx(使用错误边界组件 ErrorBoundary 包裹,并将异常展示在 FullPageErrorFallback 中):

...
import { ErrorBoundary } from "components/error-boundary";
import { FullPageErrorFallback } from "components/lib";

function App() {
  ...
  return (
    <div className="App">
      <ErrorBoundary fallbackRender={FullPageErrorFallback}>
       {user ? <AuthenticatedApp /> : <UnauthenticatedApp />}
      </ErrorBoundary>
    </div>
  );
}
...

重新编译代码并重启serve,然后访问:

npm run build
serve -s build

手动抛出错误还是原样,渲染异常导致的边界错误被截获并展示!

Cannot read property 'notExist' of undefined

测试过程中可能会需要清除 localStorage:

【实战】 六、用户体验优化 - 加载中和错误状态处理(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十),ux,react.js,前端

测试结束后清除以下两个文件中的测试内容(“抛出异常”按钮 和 “value”):

  • src\unauthenticated-app\index.tsx
  • src\authenticated-app.tsx

部分引用笔记还在草稿阶段,敬请期待。。。文章来源地址https://www.toymoban.com/news/detail-553697.html

到了这里,关于【实战】 六、用户体验优化 - 加载中和错误状态处理(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 改变用户体验:Whirl动画加载库的无限可能

    哈喽!欢迎来到程序视点。今天小二哥要分享的不是 Animate.js,也不是 Move.js,而是能提供108种加载动画的库: Whirl . 让加载动画变得丰富多彩! 话不多说,直接来看例子。 以上只是冰山一角。whirl的CSS加载动画集合中有108种选项供你挑选。选中喜欢的动画后,点击“Grab th

    2024年02月06日
    浏览(32)
  • vue前端开发自学,异步加载组件,提升用户端的客户体验度

    vue前端开发自学,异步加载组件,提升用户端的客户体验度!现实项目开发时,组件的数量非常庞大,如果都是一口气加载完,对手机用户来说,体验度会很差。因此,非常有必要使用异步加载。 那就是,用到了哪个组件,再去加载它就行了。用不到的时候,不加载它。下面看

    2024年01月16日
    浏览(31)
  • 记一次rax应用用户体验性能优化

    对于前端开发攻城狮们来说,性能优化是一个永恒的话题。随着前端需求复杂度的不断升高,在项目中想始终保持着良好的性能也逐渐成为了一个有挑战的事情。本次分享简述我们在 Rax 项目中常用的一些性能优化方式,并将从近期的一个实际业务需求出发,讲述我在 Rax C端

    2024年02月21日
    浏览(36)
  • uniapp 中 的progress加载进度条 的使用,在 页面显示数据加载的进度条,使用户的使用体验效果更好

    学习目标如下: 例如: uniapp 中 的progress加载进度条 的使用,在 页面显示数据加载的进度条,使用户的使用体验效果更好 学习内容如下所示: 相关属性的说明 进度条的显示 是否显示属性的控制 显示进度条 进度条的样式设置 提示:这里统计学习计划的总量 1、进度条的显

    2024年02月15日
    浏览(42)
  • 医疗小程序:让服务更高效,用户体验更优化

    随着移动互联网的快速发展,小程序已经成为了一个热门的开发方向。医疗健康类小程序也不例外,拥有广泛的市场需求和前景。本文将为你提供一份完整的医疗健康类小程序开发攻略,帮助你快速开发上线一个专业成熟的小程序商城。 一、选择合适的小程序商城制作平台

    2024年02月10日
    浏览(33)
  • 网站优化指南:提升用户体验与搜索引擎排名

    💂 个人网站:【海拥】【游戏大全】【神级源码资源网】 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】 💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 拥有一个优化的网站对于吸引用户、提升用户体验以及在搜索引擎中获得更好的排名至

    2024年02月12日
    浏览(88)
  • Solr在搜索引擎中的用户体验优化

    作者:禅与计算机程序设计艺术 引言 1.1. 背景介绍 搜索引擎是互联网时代最为基础的应用之一,对于用户体验的要求也越来越高。搜索引擎的性能与稳定性、搜索结果的准确性和多样性、搜索结果的相关性等方面都会影响着用户的体验。而Solr是一款高性能、可扩展、易于使

    2024年02月13日
    浏览(40)
  • 优化您的服务请求,增强用户体验和服务交付

    您的服务请求模板是否像一个复杂的迷宫,给您的团队带来延误和困惑?您的技术人员是否厌倦了为了解最终用户的需求而与他们来回奔波?强大且可定制的请求模板可能正是您所需要的! 服务交付团队(尤其是 IT)的用户可以通过各种渠道(如电子邮件、电话、聊天和步入

    2024年01月16日
    浏览(24)
  • C端用户体验度量实战篇-京东快递小程序体验度量全面升级

    本文通过介绍体验度量模型升级研究过程、研究方法及研究结果等内容,结合实际C端产品应用,观测新模型运行周期的表现,验证了其在高速发展的业务形态和日益变化的用户需求上的适用性和有效性。我们从体验价值为导向的底层模型设计,到主客观体验影响因子在实际业

    2024年02月07日
    浏览(29)
  • 短视频矩阵系统优化技巧:提升内容质量与用户体验的关键步骤

    随着互联网的不断发展,短视频已成为人们获取信息、娱乐休闲的重要方式之一。在这个短视频繁荣的时代,如何打造优质的短视频矩阵系统,提升内容质量与用户体验,成为了业内人士关注的焦点。本文将探讨短视频矩阵系统优化技巧,旨在帮助运营者更好地提升短视频内

    2024年04月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包