【发布时间】:2020-05-23 22:01:47
【问题描述】:
我正在尝试在更改道具时更新我的初始状态,但即使使用 useEffect 也无法正常工作。这是我的以下代码: 从图片链接中,您可以看到初始状态从 (p4,p1,p3,p5) 更新为 (p4,p1,p3,p2),但 useEffect 没有触发以更改状态,因此状态保持在(p4,p1,p3,p2)。我不知道为什么并且已经挣扎了几个小时,有人可以帮助我吗?
export default (props) => {
let toollist = props.getData;
const inistate = {};
for (let index in toollist) {
let stkey = (toollist[index].ttype + toollist[index].toolid)
inistate[stkey] = [0, 0, 120, 120, false]
}
inistate.dragging = false
inistate.resize = false
console.log("ini:", inistate)
const [state, setstate] = useState(inistate)
useEffect(() => {
console.log("effected")
setstate(inistate)
}, [inistate])
console.log("state:", state)
For (getDerivedStateFromProps/moveup to parent componenet) (For Mr.carlosbf):
export default(props)=>{
const [state,setstate]=useState({});
const [prevstate,setprevstate]=useState(null);
if (props.ini !== prevstate){
console.log("changed")
setstate(props.ini)
setprevstate(props.ini)
}
console.log("state:",state)
用于useMemo(用于MR.HMR):
let toollist=props.getData;
const inistate = useMemo(() => {
console.log("memoed")
var inistate = {};
for (let index in toollist) {
let stkey = (toollist[index].ttype + toollist[index].toolid)
inistate[stkey] = [0, 0, 120, 120, false]
}
inistate.dragging=false
inistate.resize=false
return inistate
}, [toollist])
console.log(inistate)
const[state, setstate]=useState(inistate)
useEffect(()=>{
console.log(1);
setstate(inistate);
},[inistate]);
【问题讨论】:
-
尝试将
initState设置为useMemo 的结果,该结果将取决于props.getData,然后每次props.getData更改而不是每次组件呈现时都会运行效果。跨度> -
嗨,HMR 先生,您的意思是像我的编辑吗?当我运行程序时,useMemo 确实触发了,但不知何故,状态并没有随 Setstate 改变,所以它仍然是空的。抱歉,我还是 React 新手,也许我错过了一些重要的东西。
标签: reactjs react-hooks use-effect use-state