热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

React项目构造和组件定名范例

React作为一个库,它没有划定项目的团体构造。这很好,因为它给了我们自在去尝试差别的要领,并顺应更适合我们的体式格局。另一方面,这可以会给React范畴的开发人员带来一些疑心。我

React 作为一个库,它没有划定项目的团体构造。这很好,因为它给了我们自在去尝试差别的要领,并顺应更适合我们的体式格局。另一方面,这可以会给React范畴的开发人员带来一些疑心。

我将会在本文为人人展现我已运用过一段时间而且结果不错的体式格局,这些体式格局没有经由过程重新造轮子来完成,而是经由过程将社区中的计划组合和提炼获得。

想浏览更多优良文章请猛戳GitHub博客,一年百来篇优良文章等着你!

目次构造

我常常碰到的一个题目是怎样构造文件和目次构造。在这篇文章中,我们以为你已有一个最小的构造,就像用 create-react-app 竖立的构造一样。

create-react-app 为我们天生了一个基本的项目,包含根目次另有诸如.gitignore, package.json, README.md, yarn.lock 的文件。

它还天生 publicsrc目次, src目次是我们保存源代码的处所。

请看下面的图片,以及形貌的构造:

《React 项目构造和组件定名范例》

在这篇文章中,我们只关注src目次,src 之外坚持稳定。

容器和组件 (Containers and Components)

你可以已在某些项目的根目次下看到了容器和展现组件之间的星散。我的意义是,在src中,在 src 目次下有 containers 目次和 components 目次:

src
├─ components
└─ containers

然则,这类要领有一些题目,以下所示:

  • 主观的划定规矩:关于容器和展现组件,没有明白的划定规矩。彼此之间的差别多是主观的,当你在一个团队中时,很难让一切开发人员赞同并评判这个题目。
  • 它没有斟酌组件的动态性:纵然当你决议某个组件适合于某个特定范例时,也很轻易在项目生命周期中对其举行变动,使其从另一种范例变成另一种范例,终究迫使你把它从 components 挪到 containers 目次下,反之亦然。
  • 许可两个具有雷同称号的组件:组件的定名在运用程序中具有声明性和唯一性,以防止殽杂每一个组件的职责。然则,上面的体式格局破坏了具有雷同称号的两个组件,一个是容器,另一个是展现示组件。
  • 效力低下: 纵然你在完成一个自力特征时,也不得不常常在 containerscomponents 目次下往返切换,因为一个自力特征有两种差别范例的组件是再一般不过的事变了。

另有一种要领,在模块内部保存containerscomponents星散:

src
└─ User
├─ components
└─ containers

上述要领最大限制地减少了在项目树中差别层级目次切换的题目。但是,它会增添许多噪音。依据你的运用程序有若干模块,你终究会竖立几十个containerscomponents 目次。

出于这些缘由,当我们议论构造目次和文件时,经由过程展现与容器的观点来拆分组件是可有可无的。 也就是说,除页面外,我们将把一切组件放在 components 目次下。

纵然在目次上辨别展现组件和容器组件是没有太多必要的,相识它们之间的差别性依然是有必要的。假如你对这个话题另有疑问,发起浏览这篇文章:
Presentational and Container Components

拆分和组合代码

components目次中,我们按模块/功用对文件举行分组。

在用户的增编削查中,我们只要User模块,构造是如许的

src
└─ components
└─ User
├─ Form.jsx
└─ List.jsx

当组件由多个文件构成时,我们将此组件及其文件放在具有雷同称号的目次下。 比方:假设有一个包含Form.jsx款式的Form.css。 在这类情况下,你的构造以下:

src
└─ components
└─ User
├─ Form
│ ├─ Form.jsx
│ └─ Form.css
└─ List.jsx

测试文件与被测试的文件坚持一致。在上面的例子中,
Form.jsx 的测试文件会放在同一个文件夹下而且定名为
Form.spec.jsx

UI 组件

除了经由过程模块拆分组件之外,我们还在src/components中包含一个 UI 目次,以保存个中的一切通用组件。

UI 组件是通用的组件,不属于模块。 它们是可以保存在开源库中的组件,因为它们没有来自特定运用程序的任何营业逻辑。 这些组件的示例包含:按钮,输入,复选框,挑选,模态框,数据可视化组件等等。

定名组件中的类

上面我们看到了怎样构建目次并按模块星散我们的组件。 然则,另有一个题目:怎样定名它们?

当我们议论定名组件时,它触及我们给类或定义组件的常量称号:

class MyComponent extends Component {
}
const MyComponent () => {};

如上所述,我们为组件供应的称号应当在运用程序中清楚且奇特,以便更轻易找到并防止可以的殽杂。

当我们须要运用东西作为React Dev东西举行调试时,以及当运用程序中发作运行时毛病时,组件的称号异常轻易,毛病老是与发作毛病的组件名一同涌现。

我们采纳基于途径的组件定名体式格局,即依据相关于 components 文件目次的相对途径来定名,假如在此文件夹之外,则运用相关于 src 目次的途径。举个例子,组件的途径假如是 components/User/List.jsx,那末它就被定名为 UserList

当文件位于具有雷同称号的组件中时,我们不须要反复该称号。 也就是说,components/User/Form/Form.jsx将被定名为UserForm而不是UserFormForm

上面的形式有一些优点,我们可以在下面看到:

便于在项目中搜刮文件

假如编辑器支撑隐约搜刮,只需搜刮称号UserForm就可以找到准确的文件

《React 项目构造和组件定名范例》

假如你想要在目次中搜刮文件,可以很轻易地经由过程组件的名字定位到它:

《React 项目构造和组件定名范例》

防止在导入反复称号

根据该形式,可以一直依据文件的上下文为组件定名。斟酌到上面的表单,我们晓得它是一个用户表单,然则因为我们已在 User 目次中 ,所以不须要在组件文件名中反复这个单词。因而,我们只将它定名为Form.jsx

我最初运用 React 的时刻喜好用完全的名字来定名文件,然则如许会致使雷同的部份反复太屡次,同时引入时的途径太长。来看看这两种体式格局的区分:

import ScreensUserForm from './screens/User/UserForm';
// vs
import ScreensUserForm from './screens/User/Form';

在上面的示例中,可以没法看到从一种要领到另一种要领的上风。 然则运用程序称号多了话,就可以看到差别, 以下:

import MediaPlanViewChannel from '/MediaPlan/MediaPlanView/MediaPlanViewChannel.jsx';
// vs
import MediaPlanViewChannel from './MediaPlan/View/Channel';

设想一下称号反复十几二十次的模样。

因而,我们依据文件 的上下文来定名文件,依据组件的相对位置来定名组件是一种更好的体式格局。

页面(Screen)

屏幕,望文生义,就是我们在运用程序中展现出来的模样。

假如要对一个用户做增编削查的操纵,我们须要有用户列表页面,竖立新用户的页面以及编辑已有用户的页面。

我们将screens 保存在src根目次中的零丁文件夹中,因为它们将依据路由定义而不是模块举行分组:

src
├─ components
└─ screens
└─ User
├─ Form.jsx
└─ List.jsx

斟酌到项目运用react-router,我们将文件Root.jsx放在在screens目次下,并在个中定义一切运用程序路由。

Root.jsx 的代码可以像下面如许:

import React, { Component } from 'react';
import { Router } from 'react-router';
import { Redirect, Route, Switch } from 'react-router-dom';
import ScreensUserForm from './User/Form';
import ScreensUserList from './User/List';
const ScreensRoot = () => (







);
export default ScreensRoot;

请注意,我们将一切页面放在一个目次中,这个目次以路由称号定名,user/ -> User/。尝试为每一个父级路由竖立一个目次,在这个目次中构造子路由。 在这类情况下,我们竖立了User目次,并将List 页面和Form页面放入个中。这类体式格局使你看一眼 url 就可以轻松定位当前路由衬着的页面。

单个页面可用于衬着两条差别的线路,如上所述,个中包含用于竖立和编辑用户的线路。

你可以会注意到一切组件都将Screen作为其称号的前缀。 当组件位于components 目次之外时,我们应当依据它到src文件夹的相对途径来定名。 位于src/screens/User/List.jsx 的组件应定名为ScreensUserList

竖立 Root.jsx 后,目次的构造以下:

src
├─ components
└─ screens
├─ User
│ ├─ Form.jsx
│ └─ List.jsx
└─ Root.jsx

假如你对一个页面长什么模样另有疑问,看看下面的示例,它就是用户表单的页面。

import React from 'react';
import UserForm from '../../components/User/Form/Form';
const ScreensUserForm = ({ match: { params } }) => (



{`${!params.id ? 'Create' : 'Update'}`} User




);
export default ScreensUserForm;

末了,我们的运用程序构造以下:

src
├─ components
│ ├─ User
│ │ ├─ Form
│ │ │ ├─ Form.jsx
│ │ │ └─ Form.css
│ │ └─ List.jsx
│ └─ UI

└─ screens
├─ User
│ ├─ Form.jsx
│ └─ List.jsx
└─ Root.jsx

扼要回忆

  • 展现组件和容器组件保存在src/components
  • 按模块/功用对组件举行分别
  • UI组件放大src/components/UI
  • 坚持页面简朴,构造和代码起码
  • 经由过程路由定义构造页面。关于 /user/list 路由地点来讲,我们会有一个页面在 /src/screens/User/List.jsx
  • 组件依据其与组件或src的相对途径举行响应定名。 鉴于此,位于src/components/User/List.jsx的组件将被定名为UserList。 位于src/screens/User/List的组件将定名为ScreensUserList
  • 组件和目次同名时,不要在运用组件的时刻反复这个名字。斟酌如许一个场景,处于 src/components/User/List/List.jsx 位置的组件会被定名为 UserList 而不是 UserListList

你的点赞是我延续分享好东西的动力,迎接点赞!

迎接到场前端人人庭,内里会常常分享一些手艺资本。

《React 项目构造和组件定名范例》


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
author-avatar
Ww不孤单_584
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有