`console.log()`로 이것저것 리액트 기본사항을 확인했습니다.
19630 단어 react
console.log() 렌더링 타이밍 확인
⚠️ 로깅 결과를 단순화하기 위해 수명 주기가 두 번 호출되지 않도록 "엄격 모드"를 의도적으로 비활성화합니다.
Strict Mode – React
1. 부모 구성 요소 및 자식 구성 요소의 상태 업데이트 및 다시 렌더링
확인할 사항
암호
App
ChildA
(부모로부터 소품을 받음) count
입니다. ChildB
(부모로부터 소품을 받지 않음)const ChildA = ({ state }) => {
const [count, setCount] = React.useState(0);
+ console.log(`rendering in child A component: count has ${count}`);
return (
...
<button onClick={() => setCount(count + 1)}>Child A: Count-up</button>
...
);
};
const ChildB = () => {
console.log("rendering in child B component");
return <div>Child B doesn't have props passed from the parent</div>;
};
export default function App() {
const [state, setState] = React.useState(false);
console.log("rendering in parent component");
return (
<div className="App">
...
<button onClick={() => setState(!state)}>Update the parent state</button>
...
<ChildA state={state} />
...
<ChildB />
</div>
);
}
콘솔 결과
<!-- 1. Initial rendering -->
rendering in parent component
rendering in child A component: count has 0
rendering in child B component
<!-- 2. Update the parent state -->
rendering in parent component
rendering in child A component: count has 0
rendering in child B component
<!-- 3. Update the child A state -->
rendering in child A component: count has 1
<!-- 4. Update the parent state -->
rendering in parent component
rendering in child A component: count has 1
rendering in child B component
확인됨
데모
2. useState initialState 대 Lazy 초기 상태
확인할 사항
initialState
는 매번 다시 렌더링할 때마다 호출되는지 확인합니다. React: useState
암호
App
Child
.childStateA
상태: 게으른 초기 상태childStateB
상태: 초기 상태const someExpensiveCalculation = (number, type) => {
console.log(`in the ${type} initial state`);
return number * 10;
};
const Child = ({ number }) => {
const [childStateA, setChildStateA] = React.useState(() => {
return someExpensiveCalculation(number, "lazy");
});
const [childStateB, setChildStateB] = React.useState(
someExpensiveCalculation(number, "default")
);
console.log(
`rendering in child component: A: ${childStateA}, B: ${childStateB}`
);
return (
<>
<p>{`The childStateA is ${childStateA}`}</p>
<button onClick={() => setChildStateA(childStateA + 1)}>
Child A: Count-up
</button>
<p>{`The childStateB is ${childStateB}`}</p>
<button onClick={() => setChildStateB(childStateB + 1)}>
Child B: Count-up
</button>
</>
);
};
export default function App() {
const [state, setState] = React.useState(false);
return (
<div className="App">
<button onClick={() => setState(!state)}>Update the parent state</button>
<Child number={10} />
</div>
);
}
콘솔 결과
<!-- 1. Initial rendering -->
in the lazy initial state
in the default initial state
rendering in child component: A: 100, B: 100
<!-- 2. Parent state update -->
in the default initial state
rendering in child component: A: 100, B: 100
<!-- 3. Child state A update -->
in the default initial state
rendering in child component: A: 101, B: 100
<!-- 3. Child state B update -->
in the default initial state
rendering in child component: A: 101, B: 101
<!-- 4. Parent state update -->
in the default initial state
rendering in child component: A: 101, B: 101
확인됨
initialState
로 값을 넘기면 re-rendering이 실행될 때마다 someExpensiveCalculation()`이 호출됩니다. 데모
3. 사용시기 효과
확인할 사항
useEffect
에 전달된 함수가 실행되는지 확인하십시오. React: useEffect
암호
useEffect
가 종속 값인 state
에서 데이터를 가져온 후 message
상태를 업데이트합니다.const dataFetchMock = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("setMessage executed in useEffect");
}, 1500);
});
export default function App() {
const [message, setMessage] = React.useState();
const [state, setState] = React.useState(false);
React.useEffect(() => {
console.log(`in useEffect. state: ${state}`);
dataFetchMock.then((value) => {
setMessage(value);
});
}, [state]);
console.log(`rendering: just before return jsx. message: ${message}`);
return (
<div className="App">
<button onClick={() => setState(!state)}>Update the parent state</button>
<p>{message === undefined ? "undefined" : message}</p>
</div>
);
}
콘솔 결과
<!-- 1. Initial rendering -->
rendering: just before return jsx. message: undefined
in useEffect. state: false
rendering: just before return jsx. message: setMessage executed in useEffect
<!-- 2. State(dependency of the useEffect) updated -->
rendering: just before return jsx. message: setMessage executed in useEffect
in useEffect. state: true
rendering: just before return jsx. message: setMessage executed in useEffect
확인됨
useEffect
=> message
에서 useEffect
상태 변경 트리거된 렌더링 다시useEffect
의 종속성 배열에 포함된 상태를 업데이트할 때(2번 참조) 상태를 업데이트하여 렌더링 => useEffect
=> message
에서 useEffect
상태를 변경하여 다시 렌더링합니다. 데모
요약
막연한 이해로 React를 사용할 수 있습니다.
다만, 리렌더링 등의 타이밍을 직접 확인하는 것이 도움이 될 것이라고 생각했습니다.
Reference
이 문제에 관하여(`console.log()`로 이것저것 리액트 기본사항을 확인했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/takuyakikuchi/i-checked-this-and-that-of-react-basics-with-consolelog-4850
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(`console.log()`로 이것저것 리액트 기본사항을 확인했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/takuyakikuchi/i-checked-this-and-that-of-react-basics-with-consolelog-4850텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)