Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.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
Javascript 如何使用react钩子复制基于类的组件异步setState方法_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 如何使用react钩子复制基于类的组件异步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

我想更新数组中每个元素的状态。但是在函数执行之后,状态中只有最后一个数组元素

在基于类的组件中,我们使用回调方法和setstate函数来执行状态更新后的任何操作。在钩子里怎么做

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
,则该代码看起来完全正确@请参考这个问题