개발자

긴 arrayList state 변경시 성능최적화 할수있는 방법을 알고싶습니다.

2022년 10월 13일조회 143

import { useState } from 'react'; function App() { const [data, setData] = useState([ {text: '', num : 0}, * 10000 ]) return ( <div> {data.map((item, idx) => ( <TextTest1 key={idx} idx={idx} item={item} data={data} setData={setData} /> ))} </div> ); } const TextTest1 = ({idx, item, data, setData}) => { return ( <div> <input type="text" value={item.text} onChange={(e) => { let arr = [...data] arr[idx].text = e.target.value setData(arr) }} /> <input type="number" value={item.num} onChange={(e) => { let arr = [...data] arr[idx].num = e.target.value setData(arr) }} /> </div> ) } export default App; 만약 state값이 const [data, setData] = useState([ {text: '', num : 0}, * 10000 ]) 저렇게 array list의 오브젝트가 10000개가있을경우 인풋값을 변경할시 성능이 상당히 느려지는데 혹시 이런경우에 성능을 최적화 할수있는 방법이 있나요?

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

성원님의 프로필 사진

올려주신 코드는 인풋값이 변경될 때마다 10,000번씩 TextTest1를 새로 그려주고있어서 성능이슈가 발생하고있는 것 같은데요, 메모이제이션을 통해 해결하면 될 것 같습니다. TextTest1 컴포넌트를 React.memo로 감싸고, props로 넘겨주던 item={item} data={data}를 변경. data는 setData에서 꺼내올 수 있기 때문에 제거하고, item은 객체이므로 item.text, item.num과 같이 레퍼런스값이 아닌 value값으로 변경해줍니다. 참고용 코드도 첨부할게요! function App() { const arr = Array.from({ length: 1000 }, (v, i) => ({ text: "", num: 0 })); const [data, setData] = useState(arr); console.log(data); return ( <div> {data.map((item, idx) => ( <TextTest1 key={idx} idx={idx} text={item.text} num={item.num} setData={setData} /> ))} </div> ); } const TextTest1 = React.memo(({ idx, text, num, setData }) => { console.log("render"); return ( <div> <input type="text" value={text} onChange={(e) => { const input = e.target.value; setData((prevArr) => { return [ ...prevArr.slice(0, idx), { text: input, num: prevArr[idx].num }, ...prevArr.slice(idx + 1, prevArr.length) ]; }); }} /> <input type="number" value={num} onChange={(e) => { const number = e.target.value; setData((prevArr) => { return [ ...prevArr.slice(0, idx), { text: prevArr[idx].text, num: number }, ...prevArr.slice(idx + 1, prevArr.length) ]; }); }} /> </div> ); }); export default App;

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!