我的 React 最佳实践

🚀 优质资源分享 🚀

学习路线指引(点击解锁) 知识定位 人群定位
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

There are a thousand Hamlets in a thousand people’s eyes. ----- 威廉·莎士比亚

免责声明:以下充满个人观点,辩证学习

React 目前开发以函数组件为主,辅以 hooks 实现大部分的页面逻辑。目前数栈的 react 版本是 16.13.1,该版本是支持 hooks 的,故以下实践是 hooks 相关的最佳实践。

前置理解

首先,应当明确 React 所推崇的函数式编程以及 f(data) = UI 是什么?

函数式编程

函数式编程是什么?这里的函数并非 JavaScript 中的函数,或任何语言中的函数。此处的函数是数学概念中的函数。让我们来回忆一下数学中的函数是什么。

file

在数学概念中,函数即一种特殊的映射,如何理解映射

以一元二次方程为例, f(x) 是一种映射关系,给定一个的 x ,则存在 y 与之对应。

我们将一元二次方程理解为一个黑盒,该黑盒存在一个输入,一个输出,在输入端我们给入一个值 x = 2 则输出端必然会给出一个 y = 4

f(data)=UI

在了解了数学中函数的概念后,将其概念套用到 React 中,我们就可以明白 f(data)=UI 到底指什么意思?

结论:个人理解,将当前组件内部的所有逻辑视为一个黑盒,该黑盒有且仅有一个输入,有且仅有一个输出,输入端为 props,输出端则是当前组件的 UI ,不同的输入会决定不同的输出,就像把 x = 1x = 2 给到所得到的结果是不一样的一样。而将这样的组件组合起来就是每一个页面,即 React 应用。

业务开发

目前绝大部分的后台管理系统,不仅仅是数栈,包括所有 ERP 系统,图书管理系统等等。其主体页面大致可以包括一下三类:

  • 筛选条件(Filter)+ 表格(Table)
  • 表单(Form)相关的新增,编辑功能
  • 概览页面(Overview),包括一些图表和表格
第一类

file

以上是这次在资产中负责开发的文件治理规则页面,属于是第一类的典型页面,那这一类的页面应该如何开发才是最佳实践?

首先,我们将这一类页面抽象成如下结构
file

如此一来,我们不难实现如下的 dom 结构

<div className="container">
  <div className="header">
    <div className="filter">筛选区div>
    <div className="buttonGroup">按钮区div>
  div>
  <div className="content">表格区div>
div>

接下来,我们需要补充各个区域的内容。

筛选区通常会有一些筛选项,这里我们有两个选择,如果比较复杂的筛选项,如存在 5 个以上或存在联动的交互,则选择通过 Form 来实现,而上图中这种比较简单的则可以直接实现。
这里我们不难观察到我们需要 3 个 value 值来实现这 3 个输入框或下拉框的受控模式,这里我们通过声明一个 filter 的变量,将这 3 个值做一个整合。

function (){
  const [filter, setFilter] = useState({
    a: undefined,
    b: undefined,
    c: undefined
  });
  
  return <><>
}

提问:为什么要 3 个值都放入到一个变量里?

答:1. 减少冗长的定义。 2. 为后续铺垫。

声明完 3 个值后,我们把组件填入

function (){
  const [filter, setFilter] = useState({
    a: undefined,
    b: undefined,
    c: undefined
  });

  return (
    <div className="container">
 <div className="header">
 <div className="filter">
 <Input value={filter.a} onChange={(e) => setFilter(f => ({...f, a: e.target.value})} />
 <Input value={filter.b} onChange={(e) => setFilter(f => ({...f, b: e.target.value})} />
 <Input value={filter.c} onChange={(e)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值