Javascript 如何使用react钩子复制基于类的组件异步setState方法
我想更新数组中每个元素的状态。但是在函数执行之后,状态中只有最后一个数组元素 在基于类的组件中,我们使用回调方法和setstate函数来执行状态更新后的任何操作。在钩子里怎么做Javascript 如何使用react钩子复制基于类的组件异步setState方法,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我想更新数组中每个元素的状态。但是在函数执行之后,状态中只有最后一个数组元素 在基于类的组件中,我们使用回调方法和setstate函数来执行状态更新后的任何操作。在钩子里怎么做 import React, { useState, useEffect, useRef } from "react"; export default function App() { const [state, setState] = useState([]); const add = ({name, value
import React, { useState, useEffect, useRef } from "react";
export default function App() {
const [state, setState] = useState([]);
const add = ({name, value}) => {
setState( [...state, {name, value}]);
}
useEffect(() => {
console.log('update')
}, [state])
const handleClick = () => {
const array = [{
name: 'Sam',
value: '23'
},{
name: 'Ram',
value: '24'
},{
name: 'Pam',
value: '25'
}]
for(const a of array){
console.log({a})
add(a);
}
}
return (
<div className="App">
<button onClick={handleClick}>add</button>
</div>
);
}
import React,{useState,useffect,useRef}来自“React”;
导出默认函数App(){
const[state,setState]=useState([]);
常量添加=({name,value})=>{
setState([…state,{name,value}]);
}
useffect(()=>{
console.log('update')
},[国家])
常量handleClick=()=>{
常量数组=[{
姓名:“山姆”,
值:“23”
},{
名称:“Ram”,
值:“24”
},{
姓名:‘Pam’,
值:“25”
}]
for(数组的常数a){
console.log({a})
添加(a);
}
}
返回(
添加
);
}
状态更新是异步的。反复做
setState( [...state, {name, value}]);
您多次使用原始的状态
,而不是新状态
理想情况下,不要重复调用setState
,而不允许组件在其间重新启动,请执行以下操作:
const addAll = (entries) => {
setState([...state, ...entries]);
};
addAll(array);
但是,如果需要重复调用状态设置器,请使用回调表单,以便始终使用当前状态,而不是过时状态:
setState(currentState => [...currentState, {name, value}]);
你在评论中说:
setState(currentState=>({…currentState[name]:value}))
但对于对象,它不起作用
确实如此,假设您试图将名称位于name
中的属性设置为value
,则代码看起来完全正确:
const{useState}=React;
常量示例=()=>{
常量[状态,设置状态]=使用状态({
答:1,,
b:2
});
const updateProperty=(名称、值)=>{
setState(currentState=>({…currentState,[名称]:值}));
};
常量addA=()=>{
更新属性(“a”,状态.a+1);
};
常量addB=()=>{
更新属性(“b”,状态为.b+1);
};
常量addC=()=>{
更新属性(“c”,(state.c | | 0)+1);
};
返回(
a={state.a},b={state.b},c={state.c}
);
};
render(,document.getElementById(“根”))代码>
状态更新是异步的。反复做
setState( [...state, {name, value}]);
您多次使用原始的状态
,而不是新状态
理想情况下,不要重复调用setState
,而不允许组件在其间重新启动,请执行以下操作:
const addAll = (entries) => {
setState([...state, ...entries]);
};
addAll(array);
但是,如果需要重复调用状态设置器,请使用回调表单,以便始终使用当前状态,而不是过时状态:
setState(currentState => [...currentState, {name, value}]);
你在评论中说:
setState(currentState=>({…currentState[name]:value}))
但对于对象,它不起作用
确实如此,假设您试图将名称位于name
中的属性设置为value
,则代码看起来完全正确:
const{useState}=React;
常量示例=()=>{
常量[状态,设置状态]=使用状态({
答:1,,
b:2
});
const updateProperty=(名称、值)=>{
setState(currentState=>({…currentState,[名称]:值}));
};
常量addA=()=>{
更新属性(“a”,状态.a+1);
};
常量addB=()=>{
更新属性(“b”,状态为.b+1);
};
常量addC=()=>{
更新属性(“c”,(state.c | | 0)+1);
};
返回(
a={state.a},b={state.b},c={state.c}
);
};
render(,document.getElementById(“根”))代码>
setState(currentState=>({…currentState[name]:value}))但对于对象,它不起作用@T.J。Crowder@SujoySaha-这很好,我在答案的末尾添加了一个示例。如果要更新名称位于name
中的属性以匹配值value
,则该代码看起来完全正确@TJCrowder请参考此questionsetState(currentState=>({…currentState[name]:value})),但对于对象,它不起作用@T.J。Crowder@SujoySaha-这很好,我在答案的末尾添加了一个示例。如果要更新名称位于name
中的属性以匹配值value
,则该代码看起来完全正确@请参考这个问题