返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Jira任务管理系统项目总结讲解
  • 599
分享到

Jira任务管理系统项目总结讲解

2024-04-02 19:04:59 599人浏览 独家记忆
摘要

目录跨组件状态管理简单场景服务端状态客户端状态项目初始化Mock 方案错误边界useState 的惰性初始化乐观更新性能追踪自动化测试Q & A1. 如何实现页面刷新后持久化

跨组件状态管理

简单场景

对于不复杂的情况,比如父组件传递状态给子组件,可以使用 props 进行传递。如果需要传递的状态过多,我们还可以使用组合组件的方法将子组件内的部分组件提升到父组件中去,这样就不需要再一层层的传递状态了

服务端状态

对于服务端状态的维护,也就是发送网络请求才能获取到的数据,如果这些数据需要在多个组件中共享,以前可能很多人会选择用 contextredux 来管理服务端的状态,但这样会导致他们所维护的状态树过重,不利于项目的维护。

不过随着 react-queryswr 这些库的火爆,越来越多的人愿意使用它们来管理服务端的状态,除了管理状态以外,他们还可以对我们的项目做一些优化,比如 react-query 可以避免重复发送相同的请求、以及方便实现乐观更新等操作

客户端状态

对于复杂的客户端状态来说,我们一般有几种方法来管理,一是通过网页的 url,这种方式可以有效的管理较少的状态。二是通过传统的 redux,但是大部分的项目其实并没有那么多的全局状态要管理,如果都使用 redux 进行管理的话,反而会让整个项目显得笨重很多,所以,随着 react hooks 的火爆,contex 结合 hooks 慢慢成为了项目中状态管理的主流

项目初始化

  • 使用 React 官方提供的脚手架 create-react-app 来初始化 React + TS 项目
  • 使用统一的代码格式化工具 prettier(www.prettier.cn/docs/instal…),这样你的团队成员无论使用什么 IDE插件,格式化项目的时候效果都是一样的,不容易产生分歧
  • 配置 commitlint 帮助我们检查每次 git commit 的信息是否符合规范,如果不符合就让本次提交失败,这回让团队协作的效率更高,项目的可维护性也会更强

Mock 方案

  • 直接在代码中写死 Mock 数据,或者请求本地的 JSON 文件
  • 请求拦截向后端发送的请求,比如使用 Mock.js 来模拟数据
  • 使用接口管理工具来 mock 数据,比如 apipostyapi 等等,但前提项目是文档先行而不是代码先行
  • 自己用 node 开启一个本地服务器,也可以借助一些好用的库,比如 json-server

错误边界

错误边界是一种 React 组件,这种组件可以捕获发生在其子组件树任何位置的 javascript 错误,并打印这些错误,同时展示降级 UI,而并不会渲染那些发生崩溃的子组件树。

错误边界可以捕获发生在整个子组件树的渲染期间、生命周期方法以及构造函数中的错误。

useState 的惰性初始化

当参数是函数的时候,useState 帮我们保存的状态并不是该函数,而是其返回值,为了获取到该返回值,react 会在组件第一次渲染的时候执行该函数,后续组件的重复渲染中,该函数就不会再被执行了,所以这种初始化 state 的方法也叫作惰性初始化,其适用于初始 state 需要通过复杂计算才能获得的情况。所以如果想用 useState 保存函数,不能直接传入函数,而是需要多嵌套一层函数

乐观更新

客户端假设请求必然成功,因此不等待接口的返回,先行对视图进行更新,随后再根据请求返回的结果调整数据,如果请求是成功的,则不改变提前更新好的 UI;如果请求失败了,则需要将数据和 UI 视图回滚至请求前的状态并用此时数据库中的准确数据代替

性能追踪

Profiler 测量一个 React 应用多久渲染一次以及渲染一次的“代价”。 它的目的是识别出应用中渲染较慢的部分,或是可以使用类似 memoization 优化的部分,并从相关优化中获益

性能追踪是我们在开发项目时经常会被忽略的一个问题,React 恰好为我们提供了用于性能追踪的一个 API—Profiler,它的用法很简单,只需要嵌套在组件外部就可以知道该组件渲染所花费的时间,很方便帮助我们去定位哪些组件需要被优化

自动化测试

很多时候我们都需要对原先的项目添加新的功能,相信很多人都会遇到添加了新功能后,原先的功能却出现 bug 的情况,以至于我们每次加一个功能都还需要手动检查原先的功能有没有被影响

自动化测试就可以很方便的解决刚刚的问题,每当代码更改都会使用我们预先写好的代码测试原先的函数、hook、组件、页面是否能够正常工作,返回我们想要的结果,这样我们开发完新功能之后就不用在手动的去测试了,不过由于这一块知识点难度较大,所以我也只是做了一个简单的了解~

Q & A

1. 如何实现页面刷新后持久化存储用户信息?

在正常的项目中,我们可以先在本地保存用户的 token 和用户信息,每当用户初始化页面时,我们就判断用户的浏览器本地是否存有 token,如果没有则直接跳转到登录页面;如果有则先展示本地存储的用户信息,然后根据 token 查询数据库中最新的用户信息并更新到本地

2. 如何在不同路由组件中实现网页标题的切换?

网上已经针对该问题给出了很多的解决方案,比如可以使用 react-helmet 这个库,不过我们也可以自己实现:使用原生的 doucument.title 来控制标题的变换。为了增强该功能的复用性,我们可以将其封装成一个自定义 hook 在不同的组件中使用

export default function useDocumentTitle(title: string, keepOnUnmount: boolean = true) {
  // 保存当前路由对应的标题
  const oldTitle = useRef(document.title).current
  useEffect(() => {
    // 当该组件挂载到页面中时,将开发者指定的文本替换成网页标题
    document.title = title
    // 根据传入该函数的参数来决定组件卸载时是否回滚到先前的网页标题
    return () => {
      if (!keepOnUnmount) document.title = oldTitle
    }
  }, [oldTitle, keepOnUnmount, title])
}

3. 如何避免无限渲染问题?

我们尽量控制传递给 useEffect 的依赖项数组中的变量可以是组件中管理的状态 state,也可以是 useRef 保存的值或者基本数据类型,但一定不能是对象类型的变量,因为不同的对象即使看起来是一样的但本质上它们的地址却是不同的,而 react 内部在比较新旧两个变量时用的是 === 号,在这种情况下,每次组件重复渲染时 useEffect 所比对出的新旧依赖都不相同,从而导致组件无限渲染。所以如果要传递普通对象,则该对象一定需要用 useMemo 包裹处理以避免组件无限循环渲染

4.TS 允许扩展组件的 props

如何在自己封装的组件以 antd 组件为基础的情况下,让 TS 允许扩展组件的 props?

ComponentPropsReact 内置的类型,用于获取组件的 props 类型,其需要传递一个组件(函数式或类)的类型

import { ComponentProps } from "react";
import { Select } from "antd";
type SelectProps = ComponentProps<typeof Select>;
// 其实上述的方法和下面的是等价的  // type SelectProps = Parameters<typeof Select>[0]
// Parameters 可以获取函数的参数并放置到一个元组中,而 antd 的组件恰好是一个函数,所以 [0] 就表示取出 props 的类型
// 创建自己组件的 props 类型,用好 TS 的内置类型 Omit 来防止一些我们添加的属性影响到原先 antd 组件的属性
interface IdSelectProps
  extends Omit<
  SelectProps,
  "value" | "setState" | "defaultOptionName" | "options"
  > {
  value?: Raw | null | undefined;
  setState?(value?: number): void;
  defaultOptionName?: string;
  options?: { name: string; id: number }[];
}
// 在 antd 组件的基础上再封装一个组件,使得该组件不仅可以传递原先 antd 组件中的参数,还可以传递一些我们定义的属性
export default function IdSelect(props: IdSelectProps) {
  const { value, setState, defaultOptionName, options, ...restProps } = props;
  return (
    <Select
      value={value || 0}
      onChange={(value) => setState?.(toNumber(value) || undefined)}
      // 这个 {} 并不表示对象的意思,不要理解错了,而是 jsx 语法要求在变量外边需要套个 {}
      {...restProps}     >
      {defaultOptionName ? (
        <Select.Option value={0}>{defaultOptionName}</Select.Option>
      ) : null}
      {options?.map((item) =>
        item ? (
          <Select.Option key={item.id} value={item.id}>
            {item.name}
          </Select.Option>
        ) : null
      )}
    </Select>
  );
}

5. 文件命名

什么时候将文件命名为 tsx 和 jsx,什么时候又命名为 ts 与 js?

当文件中包含组件的时候用 tsxjsx 后缀命名,其它情况下用 tsjs 命名就可以了。正确的使用文件后缀名可以提高项目的可读性,当别人一看到该文件的后缀是以 tsx 结尾的,就能立马知道该文件中包含的是一个组件而不是普通的函数

6. 什么时候使用组件组合?

Context 主要应用场景在于很多不同层级的组件需要访问同样一些的数据。请谨慎使用,因为这会使得组件的复用性变差。

如果你只是想避免层层传递一些属性, 组件组合(component composition) 有时候是一个比 context 更好的解决方案。—— React 官网

听起来很高大上的名词,其实非常简单,就是在面对一些状态需要层层跨组件传递时,如果这些状态都是集中在某一个区域里面使用,那么可以把这一块区域抽离出一个组件放置到状态初始化的地方。这样原本需要层层传递多个状态,现在就只需要将组件传递过去即可。

这种做法还有一个好处就是子组件不需要担心如何消费上层传入过来的状态,只需要将注意力放到渲染传入进来的组件上,下面是官网给出的示例:

function Page(props) {
  const user = props.user;
  const userLink = (
    <Link href={user.permalink}>
      <Avatar user={user} size={props.avatarSize} />
    </Link>
  );
  return <PageLayout userLink={userLink} />;
}
// 现在,我们有这样的组件:
<Page user={user} avatarSize={avatarSize} />
// ... 渲染出 ...Page的子组件
<PageLayout userLink={...} />
// ... 渲染出 ...PageLayout的子组件
<NavigationBar userLink={...} />
// ... 渲染出 ...
{props.userLink}

7. 如何将自己的项目部署到 github 上?

  • 新建一个名为 你的github用户名.github.io 的仓库
  • 在开发环境下安装 gh-pages 依赖 yarn add gh-pages -D,该库是 github 专门为开发者提供用来部署项目的
  • package.json 文件夹中找到 scripts 字段,新加下列代码中的信息
// 如果你是用 npm 来启动项目的,也可以修改为 npm run build
"predeploy": "yarn build", 
// 该字段表示的意思为将打包后的 build 文件夹推送到指定仓库的 main 分支
"deploy": "gh-pages -d build -r 创建的仓库地址 -b main"
  • 在命令行中执行 yarn deploy 命令,其会预先 predeploy 字段对应的命令 yarn build,然后将打包后的内容 push 到指定的仓库中去,所有操作完成之后打开 github 指定的网页即可看到你的应用啦!如果后续需要更新项目,只需要更新代码后重新执行该命令即可

8. 部署 github 页面报404

部署到 github 上的项目为啥有时刷新页面会报 404 的错误?

假设我们部署在 github 上的地址为 sindu12jun.github.io,由于我们的项目是单页面应用,里面用的都是前端路由,如果当前 url 变化为了 sindu12jun.github.io/projects,此时…

这样服务端接收到这个 url 对应的请求后会误认为是服务器路由,其并找不到该 url 匹配的接口,也不会像访问首页 url 一样将 index.html 响应给客户端,而是返回一个404的页面,网上已经有很多成熟的解决方案了,可以参考 github.com/rafgraph/sp…

9. 我们的项目是用什么工具把 TS 编译成 JS 文件的?

可能学习TS 的朋友都知道其真正要在浏览器或者 node 中被执行需要提前编译成 JS 文件,对于这个编译工具大家的第一反应可能是 tsc

其实不是, 目前大多数的 ts 项目都是 ts 类型检查 + babel 编译 这样的组合,这个项目也不例外 (可以去项目 node_modules 下面看一下,会发现有个 @babel 文件夹),用 babel 编译 ts,就可以实现 babel 编译一切,从而降低开发/配置成本

10. 所有的函数式组件都应该被 React.memo 所包裹吗?

在子组件没有经过特殊处理的情况下,父组件由于状态改变导致重复渲染时,子组件也会进行重复渲染,但有的时候我们并不想让子组件进行无用的渲染,这时就会想到在组件外用 React.memo 来包裹

React.memo 会比较函数式组件前后两次的 props 是否发生了变化,比较方法是浅层比较,如果判断为没有变化,则组件不会重新渲染,听起来是一个很不错的优化方案,那是不是可以在每一个组件外面都包裹一层 React.memo 呢?

其实是不需要的,React.memo 由于自身需要做前后两次 props 的浅层比较,是要消耗一定性能的。再者有 React diff 算法的加持下,其实很多DOM 元素并不会被真正的渲染,所以很多组件就算没有做 memo 优化,仍然不会对项目的性能造成什么影响。

所以我们在想使用 React.memo 之前最好先想想这个组件重新渲染和浅层比较 props 谁花费的性能较大再决定是否使用它,如果子组件本身比较复杂,那确实是可以在它外面套一层 memo 进行优化的

总结

通过这个项目不仅巩固了自己的 ReactTS 知识,同时也学到了很多 Mock 数据、性能化、性能追踪等新知识,希望自己可以凭借新的项目和自己的理解慢慢在前端领域有自己的见解~

以上就是Jira 任务管理系统项目总结讲解的详细内容,更多关于Jira 任务管理系统的资料请关注编程网其它相关文章!

--结束END--

本文标题: Jira任务管理系统项目总结讲解

本文链接: https://lsjlt.com/news/166394.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Jira任务管理系统项目总结讲解
    目录跨组件状态管理简单场景服务端状态客户端状态项目初始化Mock 方案错误边界useState 的惰性初始化乐观更新性能追踪自动化测试Q & A1. 如何实现页面刷新后持久化...
    99+
    2024-04-02
  • C#开发物流管理系统的项目经验总结
    C# 开发物流管理系统的项目经验总结近年来,随着物流行业的快速发展,物流管理系统成为各企业不可或缺的重要工具。在这个背景下,我参与了一个C#开发的物流管理系统项目,并在项目过程中积累了一些经验。在本文中,我将总结这些经验,希望对其他开发人员...
    99+
    2023-11-03
    C# 物流管理系统 项目经验总结
  • 利用C#开发医院管理系统的项目经验总结
    引言现代医院管理系统的开发是利用计算机技术和信息管理技术对医院日常管理进行智能化和数字化的一种方式。C# 作为一种通用的、面向对象的编程语言,具备强大的.NET开发平台支持,被广泛应用于构建高效、稳定的医院管理系统。本文将总结利用C#开发医...
    99+
    2023-11-02
    C#编程 医院管理系统 项目经验总结
  • C#开发人事薪酬管理系统的项目经验总结
    C#开发人事薪酬管理系统的项目经验总结项目背景人事薪酬管理是企业管理中非常重要的一个环节,它涉及到员工的薪资发放、考核奖惩、福利待遇等诸多方面。为了更高效地管理和处理这些人事薪酬事务,我参与了一个C#开发人事薪酬管理系统的项目。该系统旨在通...
    99+
    2023-11-02
    人事管理 C#开发 薪酬系统
  • C#开发智能停车管理系统的项目经验总结
    随着城市人口的增加和汽车数量的不断增长,停车已成为城市交通管理中的瓶颈问题。为了解决这一问题,智能停车管理系统应运而生。作为一名C#开发工程师,我在开发智能停车管理系统的过程中积累了一些经验,现在将其总结如下。一、需求分析在开发之前,对需求...
    99+
    2023-11-03
    C# 管理系统 智能停车
  • 利用C#开发酒店管理系统的项目经验总结
    随着现代社会的需求,酒店管理系统已经成为了市场上不可或缺的服务之一。利用计算机技术开发酒店管理系统,可以大大提高酒店管理效率,从而提高服务质量、满足客户需求、提高经济收益等方面得到好处。本文将从项目实际需求、技术选型、代码实现以及项目总结等...
    99+
    2023-11-03
    C#开发 项目经验总结 酒店管理系统
  • C#开发学生信息管理系统的项目经验总结
    C#开发学生信息管理系统的项目经验总结引言:学生信息管理系统是一个为学校、教育机构和教育管理部门提供帮助的重要工具。随着信息技术的迅猛发展,利用计算机和软件开发技术来实现学生信息管理系统成为一种趋势。本文将总结我在C#开发学生信息管理系统项...
    99+
    2023-11-02
    项目经验总结 关键词:C#开发 学生信息管理系统
  • 钉钉项目任务管理
    创建任务清单 在开始项目之前,首先要创建任务清单。任务清单包括任务的详细说明、任务的开始和结束日期、任务所需的资源以及任务的截止日期等信息。这些信息可以帮助团队成员了解项目的进展情况,以及在什么时间完成这些任务。 分配任务 在任务...
    99+
    2023-10-28
    项目
  • 【软考】系统集成项目管理工程师【总】
    引言 本来整理这篇文章的目的是方便自己23年考试用的 但是目标已经达成了。 现在我的目标是把这篇文章 做成参加该软考 小伙伴的唯一参考资料(有它就够了)来持续更新。。。 这篇文章我将当作一个长周期...
    99+
    2023-10-12
    软件工程 集成学习 职场和发展
  • 钉钉项目管理系统
    任务列表 在项目管理中,任务列表是必不可少的。每个任务都应该包含以下信息: 任务描述:任务的主题和目的,任务的要求和时间要求 任务分配:谁负责执行任务,分配给哪些人,以及任务的截止日期 任务状态:任务的状态和延迟情况 任务列表可以...
    99+
    2023-10-28
    管理系统 项目
  • 项目中的系统管理
    简介 在现代项目管理中,系统管理是一个至关重要的概念。它涉及到如何组织、规划和控制项目中的各种系统,以确保项目的顺利进行和成功交付。系统管理不仅关注项目的硬件和软件基础设施,还包括项目的过程、流程和工具等方面。本文将探讨系统管理在项目中的重...
    99+
    2023-12-29
    项目 系统
  • 利用C#开发智能农业管理系统的项目经验总结
    智能农业是当前农业发展的趋势,利用先进的技术手段提高农业生产效率,降低生产成本,保障粮食安全。为了更好地实现农业智能化,我所在的团队利用C#编程语言开发了智能农业管理系统,现在将项目经验与大家分享,希望对有需要的读者能够有所启示。一、需求分...
    99+
    2023-11-02
    C# 智能农业 管理系统
  • 利用C#开发智能健康管理系统的项目经验总结
    利用C#开发智能健康管理系统的项目经验总结引言:随着现代生活节奏的加快和生活压力的增大,人们的健康问题日益凸显。为了更好地管理个人健康,智能健康管理系统应运而生。本文将总结利用C#开发智能健康管理系统的项目经验,包括需求分析、系统设计、开发...
    99+
    2023-11-02
    项目经验总结 关键词:C#开发 智能健康管理系统
  • 基于C#的人力资源管理系统开发项目经验总结
    人力资源管理是现代企业不可或缺的一部分,随着信息技术的发展和信息化的推进,很多企业开始采用人力资源管理系统来优化人力资源管理的流程和效率。本文将基于C#语言开发人力资源管理系统的项目经验进行总结,包括需求分析、系统设计、开发实施等方面的内容...
    99+
    2023-11-04
    人力资源管理 C#开发 项目经验
  • JavaWeb项目-图书管理系统
    目 录 设计任务与目的……………………………………………………………….4 2、设计思路………………………………………………………………………4 3、概要设计………………………………………………………...
    99+
    2023-10-23
    java 数据库 servlet
  • django--图书管理系统(项目)
    django创建一个新的项目设置静态文件,更改settings配置,在最后添加STATICFILES_DIRS = [     os.path.join(BASE_DIR,&nbs...
    99+
    2023-01-30
    图书管理系统 项目 django
  • Git分支管理实践:项目经验总结
    在软件开发过程中,代码的分支管理是非常重要的。Git分支管理是现代软件开发中十分重要的一环。Git的分支管理机制使得开发人员可以在更安全的环境下进行并行开发、版本控制和持续集成等工作。然而,尽管Git很强大,但假如分支无序管理或者没有遵守相...
    99+
    2023-11-04
    git 经验总结 分支管理
  • 钉钉任务管理系统
    钉钉任务管理系统的优点 高效便捷的任务管理方式:任务管理系统采用消息提醒和审批流程,能够帮助员工快速分配任务,提高任务分配的准确性和效率。同时,任务管理系统能够自动化任务的分配和提醒,让员工不必再手动管理任务。 良好的协同沟通体验:任务...
    99+
    2023-10-28
    管理系统
  • Linux常用系统管理命令总结
    这篇文章主要介绍“Linux常用系统管理命令总结”,在日常操作中,相信很多人在Linux常用系统管理命令总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux常用系统管理命令总结”的疑惑有所帮助!接下来...
    99+
    2023-06-13
  • 金石项目管理系统:提高项目管理效率的利器
    简介 金石项目管理系统是一款专为企业提供高效、便捷的项目管理工具。它通过集成化的功能模块,帮助企业实现对项目的全面管理和监控,提高项目执行效率,降低项目风险,提升企业竞争力。功能模块1. 项目计划与进度管理金石项目管理系统提供了强大的项目计...
    99+
    2024-01-30
    管理系统 金石 项目管理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作