Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 反应数组状态未更新_Reactjs_React Redux_React Hooks_React Router Component - Fatal编程技术网

Reactjs 反应数组状态未更新

Reactjs 反应数组状态未更新,reactjs,react-redux,react-hooks,react-router-component,Reactjs,React Redux,React Hooks,React Router Component,我想填充数组状态,但投影项在useState中不更新,当我放置投影项时,组件会重新渲染。所以,我使用的是usecallback,但当我将filteredItems和projectItems作为依赖项数组放在usecallback中,将callback放在useState中时,usecallback永远不会运行 const [filteredItems, setfilteredItems] = useState([]); const [projectItems, setProjectItems]

我想填充数组状态,但投影项在useState中不更新,当我放置投影项时,组件会重新渲染。所以,我使用的是usecallback,但当我将filteredItems和projectItems作为依赖项数组放在usecallback中,将callback放在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]);
const[filteredItems,setfilteredItems]=useState([]);
常量[projectItems,setProjectItems]=useState([]);
const{projects}=props;
const callback=useCallback(()=>{
log('callback');
const projectData=projects.map(i=>{
返回(
{
键:“1”,
项目名称:i.项目名称,
尺寸:i.尺寸,
地点:一,地点,,
状态:`Day${i.Finished\u events\u days}/${i.total\u days\u needed}`,
分数:`${i.score}/10`,
查看:查看项目,
下载:下载,,
反馈:反馈,
审计:审计
})
});
setProjectItems(prevState=>[…prevState,…projectData]);
控制台日志(项目项);
setfilteredItems([…项目项]);
},[projectItems,filteredItems]);
useffect(()=>{
},[callback]);
问题 状态更新是在渲染周期之间处理的,因此尝试记录或使用状态更新只会产生当前渲染周期中的值,而不会产生下一个渲染周期中的值

setProjectItems(prevState => [...prevState, ...projectData]);
console.log(projectItems); // <-- current state!
setfilteredItems([...projectItems]); // <-- current state!
注:

  • 除非
    回调
    实际上被传递给子组件,否则我认为没有必要对其进行记忆
  • 我不认为
    projectItems
    应该是依赖项,因为钩子回调函数会更新它
  • filteredItems
    不是依赖项,因为它没有在钩子回调中引用

您可以使用
useffect
方法更新对数组的更改

useEffect(() => {
  setfilteredItems([...projectItems]);
}, [projectItems]);

useffect(()=>{},[callback])-它是干什么用的?您在哪里调用回调?我看到您正试图在状态更新排队的同一渲染周期内记录更新的状态。这回答了你的问题吗?useffect(()=>{callback()}[callback]);但是,另一个问题是,当我在useEffect中将回调作为依赖项传递时,useCallback从不运行,为什么?@devesh
useCallback
hook回调将仅在钩子的依赖项之一更新时调用,其中使用返回的记忆回调是不相关的。如果
useCallback
钩子有一个空的依赖项数组,那么它在组件装载时只运行一次。在文档中,
useCallback
对于将稳定的回调引用传递给子级非常有用。从代码片段来看,虽然我可能需要更多的上下文,但它似乎不是必需的
useCallback
。谢谢,我已经读过了。您能给我一些资源让我更深入地理解它吗。@devesh您指的是
useCallback
hook吗?除了钩子的react文档,特别是那个钩子?我不明白为什么会发生useeffect。我问的是关于官方文档之外的钩子资源。
useEffect(() => {
  setfilteredItems([...projectItems]);
}, [projectItems]);