πŸ’‘React State Tips

πŸ”— Useful lessons I've learned about Handling react stateλ₯Ό 보고 μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.

1. μƒνƒœ(state)λ₯Ό λ‹€λ£¨λŠ” 방법과 각각 ν•„μš”ν•œ 상황을 μ•Œκ³  μžˆλ‹€.

react-state

2. 클래슀 μ»΄ν¬λ„ŒνŠΈλŠ” 더이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

βš™οΈ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ μž₯점

  • μ½”λ“œ μ–‘ κ°μ†Œ, hooks μ‚¬μš©, 이해 간단함, this ν‚€μ›Œλ“œ μ—†μŒ

3. κΈ°μ‘΄ μƒνƒœ/속성(props)λ‘œλΆ€ν„° νŒŒμƒλœ μƒνƒœ(derived state)λ₯Ό μ‚¬μš©ν•œλ‹€.

derived-state
  export default function Checkout() {
    const { dispatch } = useCart();
    const [address, setAddress] = useState(emptyAddress);
    const [satus, setStatus] = useState(STATUS.IDLE);
    const [saveError, setSaveError] = useState(null);
    const [touched, setTouched] = useState({});

    // derived state
    const errors = getErrors(address);
    const isValid = Object.keys(errors).length === 0;

    //...
  }

4. πŸ”₯ λ¦¬μ•‘νŠΈ λ Œλ”λ§ μ‹œμ κ³Ό λ Œλ”λ§ 방지법을 μ•Œκ³  μžˆλ‹€.

react-render

5. λŒ€λΆ€λΆ„μ˜ μƒνƒœλŠ” 리λͺ¨νŠΈμ΄λ‹€.

  • useApi 같은 custom hook, react-query, swr 등을 μ‚¬μš©ν•˜μ—¬ 리λͺ¨νŠΈ μƒνƒœλ₯Ό κ°„μ†Œν™”

     import React from "react";
     import useFetch  from "./useFetch";
    
     export default function App() {
       const { data: products, loading, error } = useFetch("products");
       if(loading) return "Loading...";
       if(error) throw error;
       return // JSX
     }

6. 둜컬 μƒνƒœλΆ€ν„° μ‹œμž‘ν•΄λΌ. κΈ€λ‘œλ²Œ μƒνƒœλŠ” μ΅œν›„μ˜ μˆ˜λ‹¨μ΄λ‹€.

  • 속성(props) 전달 과정이 λ³΅μž‘ν•΄μ§€λ©΄, Contextλ‚˜ Redux μ‚¬μš©μ„ κ³ λ €ν•΄λ³Ό 수 μžˆλ‹€.

7. Lodash, Underscore, Ramdaλ₯Ό μ‚¬μš©ν•˜μ§€ 말고, immutableJSλ₯Ό 받아듀여라.

βš™οΈ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λΆˆλ³€ 데이터λ₯Ό λ‹€λ£¨λŠ” 방식

  • Object.assign

  • Spread syntax: { ...myObj }

  • Immutable array methods: .map, .filter, .find, .some, .every, .reduce λ“±

8. 폼(form) λΌμ΄λΈŒλŸ¬λ¦¬λŠ” ν•„μš” μ—†λ‹€. νŒ¨ν„΄μ΄ ν•„μš”ν•˜λ‹€.

form-pattern

9. πŸ”₯ μ—¬λŸ¬ μƒνƒœλŠ” μ—΄κ±°ν˜•(enum)으둜 μž‘μ„±ν•œλ‹€.

 // Using seperate state to track the form's status πŸ‘ŽπŸ» 
 const [submitting, setSubmitting] = useState(false);
 const [submitted, setSubmitted] = useState(false);
 const [completed, setCompleted] = useState(false);

 // Using a single status enum instead πŸ‘
 const STATUS = {
   IDLE: "IDLE",
   SUBMITTING: "SUBMITTING",
   SUBMITTED: "SUBMITTED",
   COMPLETED: "COMPLETED",
 };

 const [status, setStatus] = useState(STATUS.IDLE);

Last updated