React 코드 작성에 있어 가장 효율적인 관행은?

안녕하세요?

React 코드 작성에 있어 가장 효율적인 관행에 대해 알아보겠습니다.


ES6 문법

애로우 함수 사용하기(Arrow Functions)

// ES5
function getSum(a, b) {
  return a + b
}

// ES6
const getSum = (a, b) => a + b

템플릿 리터럴로 문자열 나타내기(Use Template Literal)

// ES5
var name = 'Bilal'
console.log('My name is ' + name)

// ES6
const name = 'Bilal'
console.log(`My name is ${name}`)

var 대신 const & let 사용하여 변수 선언

const 와 let 은 블록 스코프를 가집니다.

// ES5
var fruits = ['apple', 'banana']

// ES6
let fruits = ['apple', 'banana']
fruits.push('mango')

const workingHours = 8

객체 디스트럭쳐링 (Object Destructuring)

var person = {
  name: 'John',
  age: 40,
}

// ES5
var name = person.name
var age = person.age

// ES6
const { name, age } = person

객체 정의(Defining Objects)

var name = 'John'
var age = 40
var designations = 'Full Stack Developer'
var workingHours = 8

// ES5
var person = {
  name: name,
  age: age,
  designation: designation,
  workingHours: workingHours,
}

// ES6
const person = { name, age, designation, workingHours }

React 문법

배열을 map 할 때 key prop을 꼭 넣자

const students = [
  { id: 1, name: 'Bilal' },
  { id: 2, name: 'Haris' },
]

// in return function of component
;<ul>
  {students.map(({ id, name }) => (
    <li key={id}>{name}</li>
  ))}
</ul>

컴포넌트 이름은 첫 글자를 대문자로 하는 PascalCase로

const helloText = () => <div>Hello</div> // wrong

const HelloText = () => <div>Hello</div> // correct

변수나 함수 이름은 첫 글자가 소문자인 camelCase로

const working_hours = 10 // bad approach

const workingHours = 10 // good approach

const get_sum = (a, b) => a + b // bad approach

const getSum = (a, b) => a + b // good approach

HTML 코드에서 ID와 className 은 kebab-case로

<!--bad approach-->
<div className="hello_word" id="hello_world">Hello World</div>

<!--good approach -->
<div className="hello-word" id="hello-world">Hello World</div>

객체(Object)와 배열(Array)에서 꼭 null과 undefined 체크하기

const person = {
  name: 'Haris',
  city: 'Lahore',
}
console.log('Age', person.age) // error
console.log('Age', person.age ? person.age : 20) // correct
console.log('Age', person.age ?? 20) //correct

const oddNumbers = undefined
console.log(oddNumbers.length) // error
console.log(oddNumbers.length ? oddNumbers.length : 'Array is undefined') // correct
console.log(oddNumbers.length ?? 'Array is undefined') // correct

인라인 스타일링 자제하기

인라인 스타일링은 꼭 필요하지 않으면 되도록 쓰지 마세요.

코드가 지저분 해집니다.

되도록 css 클래스나 id를 이용해서 작성 바랍니다.

const text = <div style={{ fontWeight: 'bold' }}>Happy Learing!</div> // bad approach

const text = <div className='learning-text'>Happy Learing!</div> // good approach

React 코드에서 DOM 조작을 직접 하지 않기

되도록 useState를 사용하십시오.

// bad
;<div id='error-msg'>Please enter a valid value</div>
document.getElementById('error-msg').visibility = visible

// good
const [isValid, setIsValid] = useState(false)
;<div hidden={isValid}>Please enter a valid value</div>

useEffect 에서 항상 이벤트 리스너 제거하기

const printHello = () => console.log('HELLO')
useEffect(() => {
  document.addEventListener('click', printHello)
  return () => document.removeEventListener('click', printHello)
})

비슷한 컴포넌트는 범용 컴포넌트를 만들어서 props만 바꿔서 사용하기

const Input=(props)=>{
  const [inputValue, setInputValue]=useState('');
  return(
    <label>{props.thing}</label>
    <input type='text' value={inputValue} onChange={(e)=>setInputValue(e.target.value)} />
  )
}

// in your react component
<div>
  <Input thing="First Name" />
  <Input thing="Second Name" />
</div>

if-else 대신 삼항 연산자 사용하기

// Bad approach
if (name === 'Ali') {
  return 1
} else if (name === 'Bilal') {
  return 2
} else {
  return 3
}

// Good approach
name === 'Ali' ? 1 : name === 'Bilal' ? 2 : 3

컴포넌트 props는 디스트럭쳐링해서 쓰기

// Bad approach
const Details = props => {
  return (
    <div>
      <p>{props.name}</p>
      <p>{props.age}</p>
      <p>{props.designation}</p>
    </div>
  )
}

// Good approach
const Details = ({ name, age, designation }) => {
  return (
    <div>
      <p>{name}</p>
      <p>{age}</p>
      <p>{designation}</p>
    </div>
  )
}

useState로 지정한 State 변수는 비동기식이라서 같은 함수에서 변경된 값을 조회하는 행동은 하지 마세요.

const Message = () => {
  const [message, setMessage] = useState('Hello World')
  const changeMessage = messageText => {
    setMessage('Happy Learning')
    console.log(message) // It will print Hello World on console
  }

  return <div>{message}</div>
}

위 코드에서 setMessage로 State 변숫값을 변경했고 바로 그다음에 그 값을 참조했는데요.

useState는 Async 비동기식으로 작동하기 때문에 우리가 의도한 대로 작동되지 않습니다.

항상 === 사용하기

'2' == 2 ? true : false // true
'2' === 2 ? true : false // false

이상으로 React 코드 작성에 있어 대체로 잘 알려진 관행에 대해 알아보았는데요.

꼭 옳다는 얘기는 아니지만 되도록 위와 같이 코드 작성 관행을 지키면 좀 더 깔끔하고 좋은 코드가 될 것입니다.

그럼.