[TOC]
React Redux WDS Co., Ltd. Standard
1. Structural Project
<Project Name>/
|-- node_modules
|-- public/
|-- src/
|-- actions/
|-- {action1}Action.js
|-- {action2}Action.js
|-- components/
|-- {group}/
|-- WDS{Component}Component.jsx
|-- resources/
|-- styles/
|-- css/
|-- {style}.css
|-- jsx/
|-- {style}Style.jsx
|-- images/
|-- js/
|-- WDS{Component}Constants.jsx
|-- WDS{Component}Controller.jsx
|-- history/
|-- history.js
|-- pages/
|-- {group}/
|-- WDS{Page}Page.jsx
|-- resources/
|-- styles/
|-- css/
|-- {style}.css
|-- jsx/
|-- {style}Style.jsx
|-- images/
|-- js/
|-- WDS{Page}Constants.jsx
|-- WDS{Page}Controller.jsx
|-- reducers/
|-- index.js
|-- {reducer}Reducer.js
|-- resources/
|-- styles/
|-- css/
|-- {style}.css
|-- jsx/
|-- {style}Style.jsx
|-- images/
|-- js/
|-- Constants/
|-- URLConstants.js
|-- {xxx}Constants.js
|-- Controllers/
|-- {xxx}Controller.js
|-- Utils/
|-- {xxx}Utils.js
|-- routes/
|-- {xxx}Routes.js
|-- templates/
|-- WDS{Template}Template.jsx
|-- resources/
|-- styles/
|-- css/
|-- {style}.css
|-- jsx/
|-- {style}Style.jsx
|-- images/
|-- js/
|-- WDS{Template}Constants.jsx
|-- WDS{Component}Controller.jsx
|-- App.jsx
|-- index.js
|-- package.json
|-- README.md
|-- .prettierrc
|-- yarn.lock
2. Declaration
Constant
Variable
ตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ ทั้งหมด คั่นระหว่างคำด้วย "_" เช่น
// urlConstant.js
export const URI = "localhost:3000"
export const URL_LOGIN = URI + "/login"
Function
ขึ้นต้นด้วย "_" ตามด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก
คั่นระหว่างคำด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ เฉพาะตัวอักษรตัวแรก
ตามด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก
// wdsUtils.js
/**
* @param {string} errorType
* @param {string} msg
* @description fucntion for print log
* @author dev_name 01/01/2100
*/
export const _printLog = (errorType, msg) => {
// TO DO
}
/**
* @param {string} input1
* @param {string} input2
* @return {string}
* @description fucntion add number
* @author dev_name 01/01/2100
*/
export const _calculateAdd = (input1, input2) => {
return input1 + input2
}
การเขียน JS doc
// parameter input
// @param เว้นวรรค ตามด้วย "{ประเภทตัวแปร}" เว้นวรรค ตามด้วย "ชื่อตัวแปร"
@param {data type} parameter
// return output
// @return เว้นวรรค ตามด้วย "{ประเภทตัวแปร}"
@return {data type}
// description of function
// @description เว้นวรรค ตามด้วยคำอธิบาย
@description description
// author dev_name date
// @author ชื่อผู้สร้าง วัน/เดือน/ปี (ค.ศ.)
@author dev_name 01/01/2100
Variable
ขึ้นต้นด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก
คั่นระหว่างคำด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ เฉพาะตัวอักษรตัวแรก
ตามด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก
const input1Parameter
let input2Parameter
Boolean Variable
ขึ้นต้นด้วยคำว่า "is" หรือ "has" ตามบริบทของการใช้งาน
const isValid = true
const hasChild = false
Local Constant Variable
ตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก ทั้งหมด คั่นระหว่างคำด้วย "_"
const page_name = "Home";
Function
React Life Cycle Function
ขึ้นต้นด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก
คั่นระหว่างคำด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ เฉพาะตัวอักษรตัวแรก
ตามด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก
componentDidMount() {
// To Do
}
Common Function
ขึ้นต้นด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก
คั่นระหว่างคำด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ เฉพาะตัวอักษรตัวแรก
ตามด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก
onClick = (e) => {
// Recommended
}
!!! ไม่ควรใช้ function แบบเดิม เพราะต้อง bind function เอง
function onClick(e) {
// Not Recommended
}
Custom Function
ขึ้นต้นด้วย "_ " ตามด้วย ตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก
คั่นระหว่างคำด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ เฉพาะตัวอักษรตัวแรก
ตามด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก
_validateFromSubmit = (e) => {
// Recommended
}
!!! ไม่ควรใช้ function แบบเดิม เพราะต้อง bind function เอง
function _validateFromSubmit(e) {
// Not Recommended
}
Class
import React, { Component, Fragment } from 'react';
export default class HomePage extends Component {
render() {
return (
<Fragment>
<h1>Home</h1>
</Fragment>
);
}
}
Class Component
ขึ้นต้นด้วย "WDS " ตามด้วย ชื่อของ Component ที่ขึ้นต้นด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ เฉพาะตัวอักษรตัวแรก
คั่นระหว่างคำด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ เฉพาะตัวอักษรตัวแรก
ตามด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก ตามด้วยคำว่า "Component"
import React, { Component, Fragment } from 'react';
import { Input, Icon } from 'antd';
export default class WDSUsernameTextfieldComponent extends Component {
render() {
return (
<Input prefix={<Icon type="user" style={{ color: 'rgba(0,0,0,.25)' }} />} placeholder="Username" />
);
}
}
Class Template
ขึ้นต้นด้วย "WDS " ตามด้วย ชื่อของ Template ที่ขึ้นต้นด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ เฉพาะตัวอักษรตัวแรก
ตามด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก ตามด้วยคำว่า "Template"
import React, { Component } from 'react';
import { Layout } from 'antd';
import * as EventConstants from '../../../resources/js/constants/eventConstants';
import { style } from './resources/style/jsx/footerStyle';
const { Footer } = Layout;
export default class WDSFooterTemplate extends Component {
constructor(props) {
super(props);
this.state = {
systemFooter: ''
};
}
render() {
return <Footer style={style}>{this.state.systemFooter}</Footer>;
}
}
Class Page
ขึ้นต้นด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ เฉพาะตัวอักษรตัวแรก
ตามด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก ตามด้วยคำว่า "Page"
import React from 'react';
import Axios from 'axios';
import Login from '../../templates/form/login/Login';
import history from '../../history';
import * as UrlConstants from '../../resources/js/constants/urlConstants';
import Logo from './resources/images/logo_login.png';
import './resources/style/css/login.css';
export default class LoginPage extends React.Component {
_login = async params => {
const results = await Axios.post(UrlConstants.URL_LOGIN, params);
if (results.data.success) {
history.push('/process');
}
};
render() {
return (
<div className="login">
<img src={Logo} className="login-logo" alt="logo" />
<br />
<br />
<br />
<Login getFormSubmitFn={this._login} />
</div>
);
}
}
Import
// กลุ่มของ Dependency Library
import React, { Component, Fragment } from 'react';
import Axios from 'axios';
import { Form, Input, Button } from 'antd';
// กลุ่มของ Template
import WDSHeaderTemplate from "../../template/common/WDSHeaderTemplate"
import WDSFooterTemplate from "../../template/common/WDSFooterTemplate"
// กลุ่มของ Component
import WDSTextfieldComponent from "../../component/common/WDSTextfieldComponent"
import WDSDropdownComponent from "../../component/common/WDSDropdownComponent"
// กลุ่มของ Constants
import * as UrlConstants from '../../resources/js/constants/urlConstants';
import * as EventConstants from '../../resources/js/constants/eventConstants';
// กลุ่มของ Controller
import * as CommonController from '../../resources/js/controller/commonController';
import { _printLog, _calculateAdd } from '../../resources/js/controller/commonUtils';
// กลุ่มของรูปภาพ
import Logo from './resources/images/logo_login.png';
import Icon from './resources/images/icon.png';
// กลุ่มของ Style
import { Style } from "../../resources/style/jax/wdsStyle"
import '../../resources/style/css/style.css';
3. Event Handling
### Event Emitter
Publish (emit)
this.props.eventEmitter.emit(actionName,data)
Subscription (on)
this.props.eventEmitter.on(actionName,listener)
#### Unsubscription (removeAllListeners)
this.props.eventEmitter.removeListener()
4. Routing
Switch
Switch เป็นการทำ Route แบบเปลี่ยนทั้งหน้า เมื่อ url เปลี่ยนหน้าจอจะแสดงผลที่ตรงกับ path ที่ระบุไว้เพียงหน้าจอเดียว โดยเรียงลำดับการแสดงผลจากบนลงล่าง
// app.js
import React, { Component } from 'react';
import Routing from './routes/mainRoutes';
import './resources/style/css/App.css';
class App extends Component {
render() {
return <Routing eventEmitter={this.props.eventEmitter} />;
}
}
export default App;
import ไฟล์ mainRoutes.js เพื่อใช้ในการกำหนดเส้นทาง App.js
// mainRoutes.js
import React from 'react';
import { Switch, Route } from 'react-router-dom';
import LoginPage from '../pages/login/LoginPage';
import MainPage from '../pages/main/MainPage';
export default ({ eventEmitter }) => (
<Switch>
<Route exact path="/" component={LoginPage} />
<Route path="/login" component={LoginPage} />
<Route
path="/process"
render={props => <MainPage eventEmitter={eventEmitter} {...props} />}
/>
</Switch>
);
match
match เป็นการแสดงผล component เฉพาะส่วน ซึ่งสามารถทำงานภายใต้หน้าจอหลักได้
// mainPage.jsx
import React from 'react';
import { Layout } from 'antd';
import ContentRoutes from '../../routes/contentRoutes';
export default class MainPage extends React.Component {
render() {
return (
<Layout style={{ minHeight: '100vh' }}>
<Header/>
<Sider/>
<Layout>
<Breadcrumb />
<div className="content" style={{ margin: 10 }}>
<ContentRoutes
match={this.props.match}
/>
</div>
<Footer />
</Layout>
</Layout>
);
}
}
import ไฟล์ contentRoutes.js เพื่อใช้ในการกำหนดเส้นทาง App.js
//contentRoutes.js
import React from 'react';
import { Switch, Route } from 'react-router-dom';
import Content1 from '../pages/content/Content1';
import Content2 from '../pages/content/Content2';
import Content3 from '../pages/content/Content3';
import Home from '../pages/content/Home';
export default ({ match }) => {
return (
<Switch>
<Route path={`${match.url}/home`} component={Home} />
<Route path={`${match.url}/content1`} component={Content1} />
<Route path={`${match.url}/content2`} component={Content2} />
<Route path={`${match.url}/content3`} component={Content3} />
</Switch>
);
};
5. Calling API
#### post
ขึ้นต้นด้วยคำว่า "_request" ตามด้วย ชื่อของ API ที่ขึ้นต้นด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ เฉพาะตัวอักษรตัวแรก
ตามด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์เล็ก ตามด้วยคำว่า "Api"
import React, { Component } from 'react';
import Axios from 'axios';
import { Layout } from 'antd';
import Header from '../../templates/layout/header/WDSHeaderTemplate';
import * as UrlConstants from '../../resources/js/constants/urlConstants';
export default class MainPage extends Component {
constructor(props) {
super(props);
this.state = { collapsed: false };
}
componentDidMount() {
this._requestGetSystemInfoApi();
}
_requestGetSystemInfoApi = async () => {
const params = {};
const results = await Axios.post(UrlConstants.URL_GET_SYSTEM_INFO, params);
if (results.data.success) {
// TO DO
}
};
render() {
return (
<Layout style={{ minHeight: '100vh' }}>
<Header />
</Layout>
);
}
}