技术资源

基础语法

框架

组件库

构建编译

代码校验工具

代码规范

React

基础规范

  1. 统一全部采用 Es6
  2. 定义变量使用let ,定义常量使用const, 使用ESModule、避免与CommonJS 混用。
  3. 每个文件只包含的一个 React 组件(联系紧密的组件可以使用「命名空间的形式」)。
  4. 始终使用 JSX 语法,不要使用 React.createElement 创建 ReactElement,以提高编写速度、可读性、可维护性。
  5. 在传递props时,如无必要,不能传递整个props,只需传递props中所需要的属性
  6. 在组件行内设置属性,不要在外部改变属性的值;
  7. 属性较多使用 {...this.props} 语法;
  8. 重复设置属性值时,前面的值会被后面的覆盖。
  9. 自定义方法放在 React API 方法之后、.render() 之前、.render() 方法始终放在最后;
  10. 避免 this.$parent
  11. 谨慎使用 this.$refs
  12. 每个文件最好不要超过300
  13. 对待修改/优化建议使用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';

组件相关规范

  1. 组件声明:class App extends Component/PureComponent{}
  2. 行内迭代:使用map进行迭代、避免使用数组的index来作为属性key的值,推荐使用唯一ID
     const { options } = this.props
    return (
    <div>
    {options.map((data) =>
    <Component name={data.name} key={data.id} />
    )}
    </div>
    );
  3. 注释:组件之间的注释需要用 {} 包裹。
  4. 使用箭头函数进行 this 指向
     // good
    getValue = () => {}
    <MyComponent onClick = { this.getValue } />
  5. 对于无状态组件、使用纯函数组件而非使用 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>)
}

自闭合标签

  1. JSX 中所有标签必须闭合;传递默认值为true
// good
<MyComponent showName={true}/>

() 使用

  1. 多行的 JSX 使用 () 包裹,有组件嵌套时使用多行模式;
  2. 单行 JSX 省略 ()

JSX 属性使用双引号"",JS相关属性使用单引号''

// bad
<Foo bar='bar' /> // good
<Foo bar="bar" />

变量判定

  1. 对所有定义的或者传入的变量,都进行默认设置或者判定是否为undefined,防止数据未定义时程序报错。
// good
onChange(value => console.log(value?.name))

数据操作

  1. 数组与数组合并
// good
const a = [1,2];
const b = [3,4];
const c = [...a,...b];
  1. 对象与对象合并
// good
const a = {name:'张三'}
const b = {age:32}
const c = {...a,...b};
  1. 对象并入数组
// good
const a = [{name:'张三'}];
const b = {name:'Lucy'};
const c = [...a,b];
  1. 数值互换
// 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
**/

以下情况需加注释

  1. 公共组件使用说明
  2. 各组件中重要函数或者类说明
  3. 复杂的业务逻辑处理说明
  4. 特殊情况的代码处理说明,对于代码中特殊用途的变量、存在临界值、函数中使用的hack、使用了某种算法或思路等需要进行注释描述
  5. 注释块必须以/(至少两个星号)开头/;
  6. 单行注释使用//

注释块

  /**
*@description 函数注释(做什么的)
*@param {string} p1 参数1的说明
*@param {string} p2 参数2的说明,比较长
*@return 返回值描述
**/ getUserInfo(p1,p2) => {
// do something
return xxx
}

TypeScript

  1. 使用TSLint 管理代码规范

  2. 尽量避免使用 any 定义数据类型、写好声明文件

  3. 命名

    1. 类型名使用 PascalCase
    2. 接口名前不要加 I
    3. 枚举值使用 PascalCase ( 建议使用 enum 进行枚举)
    4. 函数名使用 camelCase
    5. 属性和局部变量名使用 camelCase
    6. 私有属性名不要使用 _ 前缀
    7. 命名时尽可能地使用全名(而非缩写)
  4. TypeScript HandelBook

CSS相关规范

  1. 使用语义化、通用的命名方式(不能使用汉语拼音);
  2. 尽量使用css moudles 避免样式代码冲突、建议使用驼峰方式进行命名;
  3. 避免选择器嵌套层级过多,尽量少于 3 级;
  4. 避免选择器和 Class、ID 叠加使用;
  5. 避免使用 !important 修改样式
  6. 使用 classnames 管理同一组件上的多个className
  7. 使用less进行样式编写、避免使用多种css处理器混用

代码提交

  1. 使用 commitizen 进行代码提交 commitizen
  2. 尽量避免代码一次性提交多个变更、在完成一个组件的开发后及时进行代码提交
  3. 拉取分支进行需求开发、不要在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凤凰项目规范的更多相关文章

  1. React Native 项目运行在 Web 浏览器上面

    React Native 的出现,让前端工程师拥有了使用 JavaScript 编写原生 APP 的能力.相比之前的 Web app 来说,对于性能和用户体验提升了非常多. 但是 React Nati ...

  2. react组件开发规范(一)

    这是通过修改项目运行在Google上时的警告,总结的的部分react组件开发规范: (1)编写组件时,一定要写PropTypes,切莫为了省事儿而不写! 如果一个Props不是required,一定在 ...

  3. React Native 项目整合 CodePush 全然指南

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/y4x5M0nivSrJaY3X92c/article/details/81976844 作者 | 钱 ...

  4. 【腾讯Bugly干货分享】React Native项目实战总结

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 “8小时内拼工作,8小时外拼成长 ...

  5. React 实践项目 (二)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...

  6. React 实践项目 (三)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! 上回说到使用Redux进行 ...

  7. React 实践项目 (五)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...

  8. 书籍推荐系列之一 -- 《凤凰项目:一个IT运维的传奇故事》

    博客已经完全更新了名字,新的名字,新的开始,想让自走向新的道路是很难的,走出舒适圈说了好久,也是时候开始行动了,今天就从写博客开始. 今天给大家推荐一本书,<凤凰项目:一个IT运维的传奇故事&g ...

  9. React Native 项目实战-Tamic

    layout: post title: React Native 项目实战 date: 2016-10-18 15:02:29 +0800 comments: true categories: Rea ...

随机推荐

  1. vue使用v-chart图表出现的问题

    npm i v-charts echarts -S 引入 import VCharts from 'v-charts' Vue.use(VCharts) 后发现报错,后来发现安装echarts版本太高 ...

  2. 编写Java程序,使用抽象类和抽象方法构建不同动物的扑食行为,抽象类设计

    返回本章节 返回作业目录 需求说明: 不同的动物都有进食的行为,但是在进食前需要捕获到食物后才可以进食. 要求定义一个抽象的动物类,该类中有一个抽象的捕食方法,和一个非抽象的进食方法.在进食方法中调用 ...

  3. 按需引入element-ui报错

    按需引入element-ui报错 项目用的脚手架是 vue-cli 3 按照官方文档按需引入组件: https://element.eleme.cn/#/zh-CN/component/quickst ...

  4. DES对称加密算法实现:Java,C#,Golang,Python

    数据加密标准(DES,Data Encryption Standard,简写DES)是一种采用块密码加密的对称密钥算法,加密分组长度为64位,其中8.16.24.32.40.48.56.64 等8位是 ...

  5. Solon 1.6.12 发布,类似 Spring 的生态体系

    关于官网 千呼万唤始出来: https://solon.noear.org .整了一个月多了,总体样子有了...还得不断接着整! 关于 Solon Solon 是一个轻量级应用开发框架.支持 Web. ...

  6. ApkToolBoxGUI 0.0.8发布了!!

    https://github.com/jiangxincode/ApkToolBoxGUI APKToolBoxGUI是一个程序员常用的小工具合集,有个比较友好的交互界面.主要包含编码转换,时间戳转换 ...

  7. Python DataFrame to_sql方法插入日期或时间类型的数据时 报ORA-01861 文字与字符串不匹配 的解决方法

    业务团队近期提出一个需求: 希望在接口调用之前先批量插入Excel中的数据作为数据预置 这个需求以前已经开发完成 本来以为可以很快调试完毕 没成想遭遇一个难关 DataFrame.to_sql方法在执 ...

  8. JDK_win10环境下安装JDK8时点击下一步没反应的解决办法

    问题现象 打开JDK8,点击下一步就没后续了... 解决方法 百度了一下"win10安装jdk8点下一步无响应" . 按照博客中说的操作试了下...安装成功了... 只想说...什 ...

  9. layui父表单获取子表单的值完成修改操作

    最近在做项目时,学着用layui开发后台管理系统. 但在做编辑表单时遇到了一个坑. 点击编辑时会出现一个弹窗. 我们需要从父表单传值给子表单.content是传值给子表单 layer.open({ t ...

  10. 乒乓球队比赛,甲队有abc三人,乙队有xyz三人。 抽签得出比赛名单:a不和x比,c不和x,z比, 利用集合求出比赛名单

    import java.util.HashMap; import java.util.Map; /** * 乒乓球队比赛,甲队有abc三人,乙队有xyz三人. * 抽签得出比赛名单:a不和x比,c不和 ...