React: eslint-plugin-react-hooks : 쑰건 μ™ΈλΆ€μ—μ„œ '후크가 μ‘°κ±΄λΆ€λ‘œ ν˜ΈμΆœλ©λ‹ˆλ‹€'였λ₯˜

에 λ§Œλ“  2019λ…„ 09μ›” 19일  Β·  4μ½”λ©˜νŠΈ  Β·  좜처: facebook/react

κΈ°λŠ₯ 을 μš”μ²­ν•˜κ±°λ‚˜ 버그λ₯Όλ³΄κ³  ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

버그 (κ°€λŠ₯)

ν˜„μž¬ 행동은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

ν”ŒλŸ¬κ·ΈμΈμ— λ‹€μŒ 였λ₯˜κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

React Hook "useState"λŠ” μ‘°κ±΄λΆ€λ‘œ ν˜ΈμΆœλ©λ‹ˆλ‹€. React HooksλŠ” λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§μ—μ„œ μ •ν™•νžˆ λ™μΌν•œ μˆœμ„œλ‘œ ν˜ΈμΆœλ˜μ–΄μ•Όν•©λ‹ˆλ‹€. 일찍 λŒμ•„μ˜¨ ν›„ μ‹€μˆ˜λ‘œ React Hook을 호좜 ν–ˆμŠ΅λ‹ˆκΉŒ? (λ°˜μ‘ 후크 / 후크 κ·œμΉ™)

κ·ΈλŸ¬λ‚˜ μ‘°κ±΄λΆ€λ‘œ 후크λ₯Ό ν˜ΈμΆœν•œλ‹€κ³  μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ½”λ“œ:

https://codesandbox.io/s/exciting-bhabha-mqj7q

function App(props) {
  const someObject = { propA: true, propB: false };

  for (const propName in someObject) {
    if (propName === true) {
      console.log("something");
    } else {
      console.log("whatever");
    }
  }

  // THE PLUGIN ERROR MSG ON THIS useState
  const [myState, setMyState] = useState(null);

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
    </div>
  );
}

image

μ˜ˆμƒλ˜λŠ” λ™μž‘μ€ λ¬΄μ—‡μž…λ‹ˆκΉŒ?

이 μƒν™©μ—μ„œ ν”ŒλŸ¬κ·ΈμΈμ€ 였λ₯˜λ₯Ό ν‘œμ‹œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ–΄λ–€ λ²„μ „μ˜ React와 μ–΄λ–€ λΈŒλΌμš°μ € / OS가이 문제의 영ν–₯을 λ°›μŠ΅λ‹ˆκΉŒ?

image

ESLint Rules Bug

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

https://github.com/facebook/react/pull/16853을 λ³‘ν•©ν–ˆμŠ΅λ‹ˆλ‹€

λͺ¨λ“  4 λŒ“κΈ€

이 νŠΉμ • μ˜ˆμ—μ„œ λ‹€μŒμ„ λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.

pathsFromStartToEnd 은 (λŠ”) 3
allPathsFromStartToEnd 은 2

possiblyHasEarlyReturn 도 true


이 νŠΉμ • 였λ₯˜λŠ” pathsFromStartToEnd 및 allPathsFromStartToEnd κ°€ 같지 μ•Šμ„ λ•Œλ³΄κ³ λ©λ‹ˆλ‹€.

RulesOfHooks.js 라인 404 참쑰


for..in 루프 λ‚΄λΆ€μ˜ μ½”λ“œλ₯Ό λ³„λ„μ˜ ν•¨μˆ˜λ‘œ μΆ”μƒν™”ν•˜λ©΄ lint 였λ₯˜κ°€ μ‚¬λΌμ§‘λ‹ˆλ‹€.

이 경우 pathsFromStartToEnd 및 allPathsFromStartToEnd λͺ¨λ‘ 2 κ°™μŠ΅λ‹ˆλ‹€.

  const someObject = { propA: true, propB: false };
  const someFunction = (propName) => {
    if (propName === true) {
      console.log("something");
    } else {
      console.log("whatever");
    }
  }
  for (const propName in someObject) {
    someFunction(propName)
  }
  const [myState, setMyState] = useState(null);

μ™œ κ·ΈλŸ°μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

@gaearon ,이 문제λ₯Ό ν•΄κ²°ν•˜κ³  ν•΄κ²°ν•˜λŠ” MR을 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€ (# 16853).

이것이 λ°œμƒν•˜λŠ” 주된 μ΄μœ λŠ” allPathsFromStartToEnd 값이 잘λͺ» 계산 λ˜μ—ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
이 μ˜ˆμ—μ„œ μ‹œμž‘λΆ€ν„° λκΉŒμ§€μ˜ 경둜 μˆ˜λŠ” 3μ΄μ–΄μ•Όν•˜μ§€λ§Œ ν•¨μˆ˜λŠ” 2λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

이것이 λ°œμƒν•˜λŠ” μ΄μœ λŠ” μˆœν™˜ 경둜의 잘λͺ»λœ 캐싱 λ•Œλ¬Έμž…λ‹ˆλ‹€. λ”°λΌμ„œ 일반 κ·Έλž˜ν”„ μˆœνšŒμ—μ„œ 경둜 기둝도 ν•„μš”ν•˜μ§€λ§Œ μˆœν™˜ μš”μ†Œ λͺ©λ‘ 만 μ·¨ν•˜λ©°μ΄ 경둜둜 μ΄μ–΄μ§€λŠ” μš”μ†ŒλŠ” μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.
결과적으둜 for...in obj μ—μ„œ 쑰건이 μ‚¬μš©λ˜λ©΄ λ°©ν–₯에 따라 일뢀 κ²½λ‘œκ°€ 손싀 될 수 μžˆμŠ΅λ‹ˆλ‹€.

이것은 2.4.0μ—μ„œ μ—¬μ „νžˆ 문제이며 μ•½κ°„ 더 κ°„λ‹¨ν•œ μž¬ν˜„μž…λ‹ˆλ‹€.

import * as React from "react";

function Component() {
  let isLastEven = false;
  for (let x of [1, 2, 3]) {
    if (x % 2 == 0) {
      isLastEven = true;
    } else {
      isLastEven = false;
    }
  }
  let y = React.useMemo(() => 1, []);
  return <div>{y}</div>;
}

# 16853을 λ‹€μ‹œ μ—΄ 수 μžˆμŠ΅λ‹ˆκΉŒ?

https://github.com/facebook/react/pull/16853을 λ³‘ν•©ν–ˆμŠ΅λ‹ˆλ‹€

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰