React凤凰项目规范
技术资源
基础语法
框架
组件库
构建编译
代码校验工具
代码规范
React
基础规范
- 统一全部采用 Es6
- 定义变量使用let ,定义常量使用const, 使用ESModule、避免与CommonJS 混用。
- 每个文件只包含的一个 React 组件(联系紧密的组件可以使用「命名空间的形式」)。
- 始终使用 JSX 语法,不要使用
React.createElement
创建 ReactElement,以提高编写速度、可读性、可维护性。 - 在传递props时,如无必要,不能传递整个props,只需传递props中所需要的属性
- 在组件行内设置属性,不要在外部改变属性的值;
- 属性较多使用
{...this.props}
语法; - 重复设置属性值时,前面的值会被后面的覆盖。
- 自定义方法放在 React API 方法之后、
.render()
之前、.render()
方法始终放在最后; - 避免 this.$parent
- 谨慎使用 this.$refs
- 每个文件最好不要超过300行
- 对待修改/优化建议使用
TODO:xxx
进行高亮提示 (vscode 插件: TODO Highlight、Todo Tree)
命名规范
函数命名 (前缀为动词,名字应该明确表达函数作用)
动词 | 含义 | 举例 |
---|---|---|
can | 判断是否可以执行某个权限 | canLogin |
has | 判断是否含有某个值 | hasToken |
is | 判断是否为某个值 | isShowModel |
get | 获取某个值 | getUserId |
get | 设置某个值 | setCookie |
load | 加载某些数据 | loadList |
update | 更新某些数据 | updateUserInfo |
del | 删除某些数据 | delMenu |
on/handle | 组件内事件函数 | onRadioChange/handleCheckButton |
... | ... | ... |
扩展名:使用 .jsx/.tsx 作为 React 组件的扩展名;文件名:使用大驼峰,如 MyComponent;
组件命名:一个目录的根组件使用 index.jsx/.tsx 命名,以目录名称作为组件名称;
// bad
import Footer from './Footer/Footer';
// bad
import Footer from './Footer/index';
// good
import Footer from './Footer';
组件相关规范
- 组件声明:class App extends Component/PureComponent{}
- 行内迭代:使用map进行迭代、避免使用数组的index来作为属性key的值,推荐使用唯一ID
const { options } = this.props
return (
<div>
{options.map((data) =>
<Component name={data.name} key={data.id} />
)}
</div>
);
- 注释:组件之间的注释需要用
{}
包裹。 - 使用箭头函数进行 this 指向
// good
getValue = () => {}
<MyComponent onClick = { this.getValue } />
- 对于无状态组件、使用纯函数组件而非使用 Class
编写技巧
先引用外部组件库,再引用当前组件块级组件, 然后是公共函数库最后是 css 样式
import * as React from 'react';
import { Dropdown, Menu, Icon } from 'antd';
import MyComponent from './MyComponent';
import Header from 'common/Header';
import Styles from './index.less';
解构
// good
const { name } = this.props
const { name } = this.state
// bad
this.props.name
this.state.name
每次变更state 必须调用setState方法
//good
this.setState({name:'Lucy'});
//bad
this.state.name = 'Lucy';
在State更新时,如果更新的值涉及到了state和props,调用setState时不要直接使用this.props和this.state
//good
this.setState((prevState, props) => ({
name: prevState.name + props.increment
}));
//bad
this.setState({name:this.state.name});
setState是异步的,若执行setState后需马上调用、创建回调函数
this.setState(
{
name: 'Lucy',
},
() => {
// do something after state change
},
);
尽量使用三目运算
//good
ShowUserInfo(){
return isShowUserInfo : (<div>姓名:张三</div>) ? (<div>姓名:未填写</div>)
}
自闭合标签
- JSX 中所有标签必须闭合;传递默认值为true
// good
<MyComponent showName={true}/>
()
使用
- 多行的 JSX 使用
()
包裹,有组件嵌套时使用多行模式; - 单行 JSX 省略
()
。
JSX 属性使用双引号"",JS相关属性使用单引号''
// bad
<Foo bar='bar' />
// good
<Foo bar="bar" />
变量判定
- 对所有定义的或者传入的变量,都进行默认设置或者判定是否为undefined,防止数据未定义时程序报错。
// good
onChange(value => console.log(value?.name))
数据操作
- 数组与数组合并
// good
const a = [1,2];
const b = [3,4];
const c = [...a,...b];
- 对象与对象合并
// good
const a = {name:'张三'}
const b = {age:32}
const c = {...a,...b};
- 对象并入数组
// good
const a = [{name:'张三'}];
const b = {name:'Lucy'};
const c = [...a,b];
- 数值互换
// good
let a = 1;
let b = 2;
[a,b] = [b,a];
注释规范
文件顶部的注释,包括描述、作者、日期 (vscode 插件 vscode-fileheader)
/**
* @Author: yushengyu
* @description 前端代码规范
* @Date: 2020-05-28 16:18:10
* @Last Modified by: yushengyu
* @Last Modified time: 2020-05-28 16:23:36
**/
以下情况需加注释
- 公共组件使用说明
- 各组件中重要函数或者类说明
- 复杂的业务逻辑处理说明
- 特殊情况的代码处理说明,对于代码中特殊用途的变量、存在临界值、函数中使用的hack、使用了某种算法或思路等需要进行注释描述
- 注释块必须以/(至少两个星号)开头/;
- 单行注释使用//
注释块
/**
*@description 函数注释(做什么的)
*@param {string} p1 参数1的说明
*@param {string} p2 参数2的说明,比较长
*@return 返回值描述
**/
getUserInfo(p1,p2) => {
// do something
return xxx
}
TypeScript
使用TSLint 管理代码规范
尽量避免使用 any 定义数据类型、写好声明文件
命名
- 类型名使用 PascalCase
- 接口名前不要加 I
- 枚举值使用 PascalCase ( 建议使用
enum
进行枚举) - 函数名使用 camelCase
- 属性和局部变量名使用 camelCase
- 私有属性名不要使用 _ 前缀
- 命名时尽可能地使用全名(而非缩写)
CSS相关规范
- 使用语义化、通用的命名方式(不能使用汉语拼音);
- 尽量使用css moudles 避免样式代码冲突、建议使用驼峰方式进行命名;
- 避免选择器嵌套层级过多,尽量少于 3 级;
- 避免选择器和 Class、ID 叠加使用;
- 避免使用 !important 修改样式
- 使用 classnames 管理同一组件上的多个className
- 使用less进行样式编写、避免使用多种css处理器混用
代码提交
- 使用
commitizen
进行代码提交 commitizen - 尽量避免代码一次性提交多个变更、在完成一个组件的开发后及时进行代码提交
- 拉取分支进行需求开发、不要在master进行代码提交、master仅进行分支合并
创建umi项目
$ mkdir myapp && cd myapp
$ yarn create umi
选择项目
Select the boilerplate type (Use arrow keys)
ant-design-pro - Create project with an layout-only ant-design-pro boilerplate, use together with umi block.
❯ app - Create project with a simple boilerplate, support typescript.
block - Create a umi block.
library - Create a library with umi.
plugin - Create a umi plugin.
umi+dva 项目目录结构
- config 配置文件
-config.prod 生产环境配置
-config.dev 开发环境配置
- mock 本地mock数据
-component 一级目录
-index.js mock数据
- src 主目录
- api/services 自定义接口
- home 页面级的接口 API
- index.js
- assets 静态资源文件
- components 组件 公共组件
- layouts/index.js 全局布局
- models/global.js 全局store
- pages 页面目录,里面的文件即路由
- .umi/ dev 临时目录,需添加到 .gitignore
- .umi-production build 临时目录,会自动删除
- document.ejs HTML 模板
- 404.js 404 页面
- utils 公共方法
- global.css 约定的全局样式文件,自动引入,也可以用 global.less
- global.js 可以在这里加入 polyfill
React凤凰项目规范的更多相关文章
- React Native 项目运行在 Web 浏览器上面
React Native 的出现,让前端工程师拥有了使用 JavaScript 编写原生 APP 的能力.相比之前的 Web app 来说,对于性能和用户体验提升了非常多. 但是 React Nati ...
- react组件开发规范(一)
这是通过修改项目运行在Google上时的警告,总结的的部分react组件开发规范: (1)编写组件时,一定要写PropTypes,切莫为了省事儿而不写! 如果一个Props不是required,一定在 ...
- React Native 项目整合 CodePush 全然指南
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/y4x5M0nivSrJaY3X92c/article/details/81976844 作者 | 钱 ...
- 【腾讯Bugly干货分享】React Native项目实战总结
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 “8小时内拼工作,8小时外拼成长 ...
- React 实践项目 (二)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...
- React 实践项目 (三)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! 上回说到使用Redux进行 ...
- React 实践项目 (五)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...
- 书籍推荐系列之一 -- 《凤凰项目:一个IT运维的传奇故事》
博客已经完全更新了名字,新的名字,新的开始,想让自走向新的道路是很难的,走出舒适圈说了好久,也是时候开始行动了,今天就从写博客开始. 今天给大家推荐一本书,<凤凰项目:一个IT运维的传奇故事&g ...
- React Native 项目实战-Tamic
layout: post title: React Native 项目实战 date: 2016-10-18 15:02:29 +0800 comments: true categories: Rea ...
随机推荐
- Tomcat 服务器的端口会与其他的服务器端口发生冲突,此时则需要修改 Tomcat 服务器的端口
查看相关知识 查看相关练习 Tomcat 服务器的端口会与其他的服务器端口发生冲突,此时则需要修改 Tomcat 服务器的端口 实现步骤: 1.找到 Tomcat 服务器安装目录下的 conf 文件夹 ...
- Java初学者作业——编写JAVA程序,在控制台中输入六位员工的姓名,通过随机点名方式,输出当选组长的员工姓名。
返回本章节 返回作业目录 需求说明: 编写JAVA程序,在控制台中输入六位员工的姓名,通过随机点名方式,输出当选组长的员工姓名. 实现思路: (1)定义字符串类型的数组names,长度为6,用于存储六 ...
- TYPESCRIPT中文教程基础部分下----翻译自TS官方
type 别名 我们已经使用过 object 和 联合的方式 直接声明类型.但是某个类型在使用多次的情况下就要用到别名了. 别名的语法就像是在定义一个具名的对象一样: type Point = { x ...
- Django在使用logging日志模块时报错无法操作文件 logging error Permission Error [WinError 32]
产生原因: 这个问题只会在开发的时候遇到,而且配置是写入到setting.py配置文件,我们定义了日志文件大小,当日志满了的时候,这时候就会遇到这个问题, 因为在使用Pycharm运行django的时 ...
- 从AAB文件生成APK文件
开头先说方法 1.下载 bundletool 2.开始生成 java -jar bundletool.jar build-apks --bundle=[aab文件路径(例如:C:\Users\Admi ...
- Idea操作Maven详细使用:
Idea操作Maven详细使用: Maven简介 什么是 Maven Maven 的正确发音是[ˈmevən] "卖v",而不是"马瘟"以及其他什么瘟. Mav ...
- gin中自定义中间件
package main import ( "github.com/gin-gonic/gin" "log" "time" ) func L ...
- gin中jsonp的用法
package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { r := ...
- Tomcat-如何创建动态的web工程及目录介绍
1,IDEA中如何创建动态web工程 (1)创建一个新模块 (2)选择你要创建什么类型的模块 (3)输入模块名,finish完成创建 创建成功如下图: 一般在WEB-INF下建一个lib目录 存放ja ...
- IoC容器-Bean管理XML方式(注入空值和特殊符号)
Ioc操作Bean管理(xml注入其他类型属性), 字面量 (1)null值 (2)属性值包含特殊符号