Skip to content

free-axh/react-repository

Repository files navigation

一、目录结构

.
├── README.md
├── config
│   ├── env.js
│   ├── jest
│   │   ├── cssTransform.js
│   │   └── fileTransform.js
│   ├── paths.js
│   ├── webpack.config.js
│   └── webpackDevServer.config.js
├── package-lock.json
├── package.json
├── public
│   ├── favicon.ico
│   ├── index.html
│   └── manifest.json
├── scripts
│   ├── build.js
│   ├── start.js
│   └── test.js
├── server
│   └── server.js
├── src
│   ├── App.css
│   ├── App.js
│   ├── App.test.js
│   ├── Intl.js
│   ├── common
│   │   ├── loading
│   │   │   └── index.js
│   │   └── toast
│   │       ├── index.js
│   │       └── toast.modal.less
│   ├── index.css
│   ├── index.js
│   ├── logo.svg
│   ├── redux
│   │   ├── index.js
│   │   ├── login.js
│   │   └── root.js
│   ├── server
│   │   ├── index.js
│   │   └── login.js
│   ├── serviceWorker.js
│   ├── store.js
│   ├── utils
│   │   ├── localStorage.js
│   │   ├── locale
│   │   │   ├── en_US
│   │   │   │   ├── home_US.js
│   │   │   │   └── index.js
│   │   │   └── zh_CN
│   │   │       ├── home_CN.js
│   │   │       └── index.js
│   │   ├── router
│   │   │   ├── renderLoadable.js
│   │   │   ├── renderRoutesMap.js
│   │   │   ├── routeMethods.js
│   │   │   ├── router.js
│   │   │   ├── routerConfig.js
│   │   │   └── routerGuard.js
│   │   ├── server
│   │   │   ├── axios.js
│   │   │   └── http.js
│   │   └── skin
│   │       ├── index.less
│   │       ├── skin.default.less
│   │       ├── skin.js
│   │       └── skin.red.less
│   └── views
│       ├── demo
│       │   └── index.js
│       ├── error
│       │   ├── page404.js
│       │   └── page404.module.less
│       ├── header
│       │   ├── index.js
│       │   └── index.module.less
│       ├── home
│       │   └── index.js
│       └── login
│           ├── antdTest.less
│           ├── index.js
│           ├── loginValidation.js
│           └── loginValidation.module.less
└── tree.txt

1、config

create-react-app脚手架生成的项目,执行npm run eject命令生成的项目打包配置文件。

2、public

3、scripts

4、server

5、src

###(1)、src/common 备注:项目公共组件位置

###(2)、src/redux 备注:redux用于统一管理state
注意事项:
1、Action、Reducer和redux-saga统一写在一个js文件下,方便管理;
2、Reducer的命名规则为:xx + Reducers,saga的命名规则为:xx + Saga;
3、Action的命名规则为:{ type: '标明js文件所属名称/action动作实际含义名称' }

###(3)、src/server 备注:项目数据请求接口
注意事项:
1、数据请求接口文件以每个页面为单位;
2、每个js文件内部创建规范如下

import axios from '../utils/server/axios';

const login = {
  /**
   * 登录请求
   */
  login: () => axios('/data', 'GET', { username: 'xiaoli', password: '123456' }),
  /**
   * 验证token是否过期
   */
  validationToken: data => axios('/token', 'POST', data),
};

export default login;

###(4)、src/utils 备注:项目工具文件
1、utils/locale:多语言配置文件,具体使用方式参考react-intl官方API;
参考文档:
(1)、使用 react-intl 实现 React 组件国际化:https://www.jianshu.com/p/574f6cea4f26
2、utils/router:项目路由配置文件
(1)、routerConfig文件配置规则如下:

const routes = [
  { path: '/login', key: 'login', component: 'views/login/index', common: false },
  { path: '/home', key: 'home', component: 'views/home/index', common: true },
  { path: '/demo', key: 'demo', component: 'views/demo/index', common: true },
  { path: '/', key: 'login', component: 'views/login/index', common: false },
];

export default routes;

其中common字段表示页面是否拥有顶部和左侧公共部分,true为拥有,false为不拥有;
(2)、routerMethods文件为react-router路由跳转方法的统一封装,用于整个项目的路由跳转使用
3、utils/server:项目的ip地址配置和对axios的再次封装,在封装中完善了数据请求的请求拦截器、响应拦截器和请求的错误处理
(1)、ip地址配置(server/http.js)

const defaultConfig = {
  /**
   * 数据访问ip + port
   */
  baseUrl: 'http://localhost:9023',
  /**
   * 音视频socket访问ip + port
   */
  videoBaseUrl: 'http://localhost:9023',
};

export default defaultConfig;

(2)、请求拦截器(server/axios.js)

/**
 * 请求拦截器
 */
axios.interceptors.request.use(
  (config) => {
    const token = getStore('token');
    const newConfig = config;
    if (token) {
      newConfig.headers.Authorization = token;
    }
    return newConfig;
  },
  error => error,
);

(3)、响应拦截器(server/axios.js)

/**
 * 响应拦截器
 */
axios.interceptors.response.use(
  res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res),
  (error) => {
    const { response } = error;
    console.log('response', response);
    if (response) {
      errorHandle(response.status);
      return response;
    }
    return error;
  },
);

(4)、错误处理(server/axios.js)

/**
 * 请求失败错误处理
 */
const errorHandle = (status) => {
  switch (status) {
    // 401: 未登录状态
    case 401:
      replace('login');
      break;
      // 403: token 过期
    case 403:
      removeStore('token');
      replace('login');
      break;
      // 404: 请求不存在
    case 404:
      break;
    default:
      break;
  }
};

4、utils/skin:项目换肤配置文件
描述:每个主题色单独创建一个样式文件,在样式文件内部采用less的变量进行定义主题色的各个颜色值。使用过程中通过skin.js中如下代码改变root的类名,以达到主题色的更换。

export const switchSkin = (className) => {
  global.document.getElementById('root').className = className;
};

5、utils/localStorage.js:项目缓存处理函数封装
(1)、setStore(key, value):保存数据到localStorage中;
(2)、getStore(key):获取localStorage中key对应的数据;
(3)、removeStore(key):删除localStorage中key对应的数据。

###(5)、src/view 备注:项目页面创建区域
注意事项:
1、css样式全部单独创建一个文件统一管理,创建位置在所属页面模块目录下;
2、css样式采用less;
3、create-react-app脚手架集成了css-module,需要混淆css类名以达到项目类名不重复的目的,css样式文件命名规范为xxx.module.less;
4、建议:全局和局部state数据结构尽量简单,以便在shouldComponentUpdate中进行数据比较。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published