Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

React 简洁代码之道 #45

Open
SunShinewyf opened this issue Jul 1, 2018 · 0 comments
Open

React 简洁代码之道 #45

SunShinewyf opened this issue Jul 1, 2018 · 0 comments
Labels

Comments

@SunShinewyf
Copy link
Owner

最近在研究代码重构之路,发现自己的一些代码写得有点丑陋而且可读性不强,于是去学习了一些经验,整理如下

可读性强而且简洁的代码让人有阅读的欲望,也可以显示出代码的一种美感,同时便于后期的维护和扩展。如何让其他人看到你的代码不难受、易接受,是开发者的一种能力,也是一种修养~

变量

起有含义的变量名

通过对变量取有含义的名字,不仅可以免除注释带来的代码不美观的弊端,还能提高可读性。所谓顾名思义,就是这个道理。

//Bad
const yyyymmdstr = moment().format('YYYY/MM/DD');

//Good
const currentDate = moment().format('YYYY/MM/DD');

//遍历的情况
//Bad
tagList.forEach(i=>{
    doSomething(i);
})

//Good
tagList.forEach(tag=>{
   doSomething(tag);
})

对于常量使用全大写字符串命名

在代码中,我们常常需要使用一些常量(配置项),这些常量不宜直接出现在代码中,否则会难以知晓它的意思,也不便于之后的管理。最好是将这些常量使用全大写字符串命名,并将其抽取到一个配置项文件中,防止日后更改~

//Bad
setTimeout(blastOff, 86400000);

//Good 
//在 config.js 中配置 MILLISECONDS_IN_A_DAY = 86400000;
import { MILLISECONDS_IN_A_DAY } from 'config.js'
setTimeout(blastOff, MILLISECONDS_IN_A_DAY);

函数

使用默认参数而不是条件语句

对于一些有默然参数的函数,最好把参数的默认值直接写上,而不是在函数体里面写条件语句,如下:

//Bad
function queryUser(userId) {
  const userId = userId || '11111';
  // do something
}

//Good
function queryUser(userId = '11111') {
  // do something
}

将对象作为参数传递时使用解构

当需要给一个函数传递一个对象结构的参数时,可以使用 ES6 的解构语法,使用解构有如下好处:

  • 需要使用该对象的哪些属性一目了然
  • 有助于防止副作用
  • 可以很容易获取函数所需的值
//Bad
function queryUser(userId, userName, age, sex) {
  // ...
}

//Good
function queryUser({userId, userName, age, sex}){
  // ...
}

queryUser({'11111', '恬竹', '18', 'woman'})

防止副作用

在给某个函数传递一个引用对象时,可能会给该引用对象带来一些副作用

//Bad
const addItemToCart = (cart, item) => {
  cart.push({ item, date: Date.now() });
};

//Good

const addItemToCart = (cart, item) => {
  return [...cart, { item, date: Date.now() }];
};

使用箭头函数

组件中的函数最好使用箭头函数,可以避免手动绑定 this 上下文

//Bad
export default class MyContainer extends Component {
  contructor (props) {
    super(props)
    this.state = {
      stateItemA: undefined,
      stateItemB: 'default string'
    }
    
    this.someMethod = this.someMethod.bind(this)
    this.anotherMethod = this.anotherMethod.bind(this)
  }
  
  someMethod () {
    // ...
  }
  
  anotherMethod () {
    // ...
  }
  
  render () {
    return (
      <SomeComponent />
    )
  }
}

//Good
export default class MyContainer extends Component {
  state = {
    stateItemA: undefined,
    stateItemB: 'default string'
  }
  
  someMethod = () => {
    // ...
  }
  
  anotherMethod = () => {
    // ...
  }
  
  render () {
    return (
      <SomeComponent />
    )
  }

组件

使用扩展运算符传递 props 给组件

在给组件传递 props 时,为每个 props 或者 state 进行单个声明显然和冗余,可以直接使用扩展运算符进行传递:

//Bad
class MyContainer extends Component {
  state = {
    itemA: 'A',
    itemB: 'B',
    itemC: 'C'
  }

  _onPress = () => {
    // ...
  }
  
  render () {
    return (
      <MyComponent
       itemA={this.state.itemA}
       itemB={this.state.itemB}
       itemC={this.state.itemC}
       onPress={this._onPress}
      />
    )
  }
}
//Good
class MyContainer extends Component {
  state = {
    itemA: 'A',
    itemB: 'B',
    itemC: 'C'
  }

  _onPress = () => {
    // ...
  }
  
  render () {
    return (
      <MyComponent
       {...this.state}
       onPress={this._onPress}
      />
    )
  }
}

持续更新中~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant