W

wds-react

This is a standard for coding includes a structural project of ReacJS at WDS Company.

Name Last Update
public Loading commit data...
server Loading commit data...
src Loading commit data...
.gitignore Loading commit data...
.prettierrc Loading commit data...
README.md Loading commit data...
config-overrides.js Loading commit data...
package.json Loading commit data...
yarn.lock Loading commit data...

[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>
    );
  }
}