React 배열 상태가 업데이트되지 않습니다.
Sep 17 2020
배열 상태를 모두 채우고 싶지만 projectItems는 useState에서 업데이트되지 않으며 projectItems를 넣으면 구성 요소가 다시 렌더링됩니다. 그래서 usecallback을 사용하고 있지만 filterItems 및 projectItems를 useCallback에 종속성 배열로 넣고 useState에 콜백을 넣으면 useCallback이 실행되지 않습니다.
const [filteredItems, setfilteredItems] = useState([]);
const [projectItems, setProjectItems] = useState([]);
const { projects } = props;
const callback = useCallback(() => {
console.log('callback');
const projectData = projects.map(i => {
return (
{
key: '1',
projectName: i.project_name,
size: i.size,
location: i.location,
status: `Day ${i.Finished_events_days}/${i.total_days_needed}`,
score: `${i.score}/10`,
view: <a>View Project</a>,
download: <a>Download</a>,
feedback: <a>Feedback</a>,
audit: <a>Audit</a>
})
});
setProjectItems(prevState => [...prevState, ...projectData]);
console.log(projectItems);
setfilteredItems([...projectItems]);
}, [projectItems, filteredItems]);
useEffect(() => {
}, [callback]);
답변
1 DrewReese Sep 17 2020 at 13:59
발행물
상태 업데이트는 렌더주기 사이에 처리되므로이를 기록하거나 사용하려고 하면 다음 렌더주기 가 아닌 현재 렌더주기 의 값만 산출 됩니다 .
setProjectItems(prevState => [...prevState, ...projectData]);
console.log(projectItems); // <-- current state!
setfilteredItems([...projectItems]); // <-- current state!
해결책
효과 후크를 사용하여 projectItems상태 업데이트에 "반응"하여 업데이트를 트리거합니다 filteredItems.
...
setProjectItems(prevState => [...prevState, ...projectData]);
...
useEffect(() => {
console.log(projectItems); // <-- updated state!
setfilteredItems([...projectItems]); // <-- updated state!
}, [projectItems]);
메모:
- 하지 않으면
callback됩니다 실제로 아이 컴퍼넌트에 전달하기 나는 그것을 memoize 할 필요는 생각하지 않습니다. projectItems후크 콜백 함수가이를 업데이트하기 때문에 종속성이되어야 한다고 생각하지 않습니다 .filteredItems후크 콜백에서 참조되지 않으므로 종속성이 아닙니다.
Nazeer Sep 17 2020 at 14:07
useEffect방법을 사용 하여 배열의 변경 사항을 업데이트 할 수 있습니다 .
useEffect(() => {
setfilteredItems([...projectItems]);
}, [projectItems]);