简体   繁体   English

我如何使用 state 更新数组 object 的值

[英]how i can update the value of object of array by use state

I recently started learning react.js for making my final year project using MERN stack during this i am facing this issue, ie i have an array我最近开始学习 react.js 以使用 MERN 堆栈制作我的最后一年项目,在此期间我面临这个问题,即我有一个数组

let projectTech = ['js','node','react'];

and i want to concat it with technologies array present in following useState, please tell me how can i do it.我想将它与以下 useState 中存在的技术数组结合起来,请告诉我该怎么做。

const [projectObj, setProjectObj] = useState({                 
        title: '',
        type: '',
        link: '',
        technologies:[],
        role:'',
        description: ''
    });

i already tried following combinations but it's not working, after console.log(projectObj.technologies) i got empty array.我已经尝试了以下组合,但它不起作用,在console.log(projectObj.technologies)之后我得到了空数组。

setProjectObj({...projectObj,technologies: projectTech});
setProjectObj({...projectObj,technologies:[...projectTech]});
setProjectObj({...projectObj,technologies:[...projectObj.technologies,projectTech]});

please help me, how can i fix this?请帮助我,我该如何解决这个问题?

You can try using the prevState of the setState function.您可以尝试使用 setState function 的 prevState。

setProjectObj((prevState) => ({...prevState, technologies: projectTech }))

check out this: https://codesandbox.io/s/nifty-browser-wmoseu?file=/src/App.js看看这个: https://codesandbox.io/s/nifty-browser-wmoseu?file=/src/App.js

Nothing is wrong with that code.该代码没有任何问题。 You only have to change how you console.log your result.你只需要改变你控制台的方式。记录你的结果。

Since setting state is async, try to avoid logging state after setting it.由于设置state是异步的,设置后尽量避免记录state。

Add this in your component将此添加到您的组件中

const handleSetState = () => {
setProjectObj({...projectObj,technologies: projectTech});
console.log(projectObj) //WRONG, will console.log previous data
}

const handleSetState2 = () => {
const newObj = {...projectObj,technologies: projectTech}
setProjectObj(newObj);
console.log(newObj) //OK, but not actual state.
}

//BEST
useEffect(() => {
console.log(projectObj) //Console.log state
}, [projectObj]) //But only if state changes

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM