Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 推动反应状态数组_Javascript_Arrays_Reactjs_React Native - Fatal编程技术网

Javascript 推动反应状态数组

Javascript 推动反应状态数组,javascript,arrays,reactjs,react-native,Javascript,Arrays,Reactjs,React Native,我想用setState而不是this.state.floors.push来写,因为我知道这是一种不好的做法,但我想不出来。我用的是react native FloorAPI.getFloorsByBuildingID(this.state.buildingID).then((response) => response.d.data.map((value) => { console.log(value.floorName) this.state.floors.push({val

我想用setState而不是this.state.floors.push来写,因为我知道这是一种不好的做法,但我想不出来。我用的是react native

FloorAPI.getFloorsByBuildingID(this.state.buildingID).then((response) => response.d.data.map((value) => {
  console.log(value.floorName)
  this.state.floors.push({value: value.floorName})
}))
你可以用

this.setState({floors: [{value: value.floorName}]}); 

为了使用设置状态。

您可以创建一个新的变量并推送到该变量,然后在映射完成后设置状态

// Create a new array based on current state:
let floors = [...this.state.floors];

// Add item to it
floors.push({ value: floorName });

// Set state
this.setState({ floors });
var tempArray = []

FloorAPI.getFloorsByBuildingID(this.state.buildingID).then((response) => response.d.data.map((value) => {
  tempArray.push({value: value.floorName})
}))

this.setState({floors: tempArray})

您始终可以使用上一个状态

setState((prevState)=>({
   floors: prevState.floors.push({...})
});
这是避免直接改变状态的好方法。另一种方法是执行以下操作:

var newState=[...this.state.floors];
newState.push({...});

setState(()=>({
  floors: newState
)}

就目前而言,最好且最简单的方法是

  this.setState(previousState => ({
      floors: [...previousState.floors, {"value": value.floorName}]
  }));

在形式上,你可以使用

setState((prevVals) => [...prevVals,newVals])

这在某种程度上是可行的,但它只在数组中放置了一个项目,我需要所有的楼层都在这个数组中,因为它将填充一个下拉菜单。简单且有效,谢谢。虽然这三个阶段是什么,但为什么需要这样做呢?对我来说,这有点奇怪,但
是一个叫做“解构”的概念的一部分:最有意义的编码。这可能是两种解决方案的混搭。在第一种解决方案中,您不应该修改
prevState.floors
,这是
push
所做的,而在第二种解决方案中,如果您正在生成一个不使用回调的
state
参数的对象,则无需将回调传递给
setState
。谢谢!现在不允许我修改prevState。现在,当你指出它时,我明白了它的原因。我得到了错误类型错误:传播非iterable的无效尝试instance@RayCoder获取
TypeError的原因:传播不可iterable实例的尝试无效
,因为用于析构函数的数据不是数组,它不可iterable的原因以及你出错的原因。
const { floors } = this.state;

// Add item to it
floors.push({ value: 5 });

// Set state
this.setState({ floors });
setState((prevVals) => [...prevVals,newVals])