반응형
componentDidMount를 사용으로 변환하는 중효과
리액션 훅을 배우고 기존 코드베이스를 훅으로 전환하려고 하는데 헷갈린다.내부 상태를 설정하는 것이 정상인가?useEffect
내가 그렇게 한다면 두려운 무한순환을 일으킬까?
import React, { useState, useEffect } from 'react';
import App from 'next/app';
import Layout from './../components/Layout';
function MyApp({ Component, pageProps }) {
const [ cart, setCart ] = useState([]);
const addToCart = (product) => {
setCart((prevCartState) => {
return [ ...prevCartState, product ];
});
localStorage.setItem('cart', JSON.stringify(cart));
};
//mimicking componentDidMount to run some effect using useEffect
//useEffect(() => setCount((currentCount) => currentCount + 1), []);
useEffect(() => {
const cartCache = JSON.parse(localStorage.getItem('cart'));
//cart = cartCache; Good or bad?
cartCache || setCart(() =>{
});
}, []);
return <Component {...pageProps} />;
}
원래 클래스 기반 구성 요소:
/*
export default class MyApp extends App {
state = {
cart: []
}
componentDidMount = () => {
const cart = JSON.parse(localStorage.getItem('cart'));
if (cart) {
this.setState({
cart
});
}
};
addToCart = (product) => {
this.setState({
cart: [...this.state.cart, product]
});
localStorage.setItem('cart', JSON.stringify(this.state.cart));
}
render() {
const { Component, pageProps } = this.props
return (
<contextCart.Provider value={{ cart: this.state.cart, addToCart: this.addToCart }}>
<Layout>
<Component {...pageProps} />
</Layout>
</contextCart.Provider>
)
}
}*/
내부 상태를 설정하는 것은 괜찮다.useEffect
종속 배열 내에서 동일한 필드의 변경 내용을 듣지 않는 한.당신의 특별한 경우에 당신은 전화한다.useEffect
한 번만(빈 종속성 어레이를 통과한 후)
useEffect(() => {
const cartCache = JSON.parse(localStorage.getItem('cart'));
if (cartCache) {
setCart(cartCache);
}
}, []);
그리고 두 번째를 더하는 것도 멋질 것이다.useEffect
듣다cart
변화하고 유지하다localStorage
최신의
useEffect(() => {
localStorage.setItem('cart', JSON.stringify(cart));
}, [cart]);
왜냐하면 동기식 호출이기 때문에 이 시나리오에서는 콜백 버전의 기능도 사용할 수 있다.useState
초기 값을 설정하기 위해이렇게 하면 사용할 필요가 없다.useEffect
보통 가능하다면 나는 내 기능적 부품에 새로운 부작용을 도입하는 것을 피하려고 노력한다.
대신 다음과 같이 시도하십시오.
const [ cart, setCart ] = useState(() => {
const cartCache = JSON.parse(localStorage.getItem('cart'));
if (cartCache) {
return cartCache;
}
localStorage.setItem('cart', JSON.stringify([]));
return [];
});
이렇게 하면cart
요소가 누락됨localStorage
코드가 디폴트로 그것을 만들 것이다.[]
배열을 비우고 상태용으로 설정하십시오.다른 경우에는 저장소의 값을 설정할 수 있다.
참고:또한 나는 듣기라는 측면에서 친절한 사용자의 답변에 동의한다.cart
지켜야 할 변경 사항.localStorage
와 최신의.useEffect
나의 제안은 단지 초기 상태를 위한 것이다.
참조URL: https://stackoverflow.com/questions/64402467/converting-componentdidmount-into-useeffect
반응형
'IT이야기' 카테고리의 다른 글
Vue: 소품이 설정되지 않은 경우 볼 수 있는 액세스 금지 (0) | 2022.04.07 |
---|---|
'슬롯 액티베이터'는 시각화에서 어떻게 작동하는가? (0) | 2022.04.07 |
이미 설정된 리액션 후크를 다른 값으로 설정하는 방법 (0) | 2022.04.06 |
'Proptypes'가 정의되지 않음 (0) | 2022.04.06 |
v-for는 왜 잠깐 동안만 작동하는가? (0) | 2022.04.06 |