React 中 setState的对象、数组的操作

 先看以下代码

import {useState} from 'react'

function App() {
  let [count, setCount] = useState(0);
  let [arr, setArr] = useState([]);

  const handleClick = () => {
      count += 1;
      setCount(count)
      console.log(count)
  }
  const getCount = ()=>{
      setTimeout(() => {
          console.log(count)   // 先按getCount 按钮 再按Add按钮 输出的是3s前的数字
      }, 3000)
  }


  const handleArrClick = ()=>{
      arr.push(Math.random())
      // setArr(arr)  此处这种方式 页面是不刷新的,react hook更新数组不是往原数组里添加项目,而是要用一个新数组完全替代
      setArr([...arr])
      console.log(arr)
  }

  return (
      <>
        <h2>{count}</h2>
        <button onClick={handleClick}>Add</button>
        <button onClick={getCount}>getCount</button>
          <br/>
          {
              arr.map((item,index)=>{
                  return <h2 key={index}>{item}</h2>
              })
          }
        <button onClick={(e)=>handleArrClick(e)}>Add arr</button>
      </>
  );
}
export default App;

react hook只用了useState钩子函数来给函数(无状态)组件添加状态,状态值为什么不是最新的?其原因是「Capture Value」 特性;

援引文章 精读《useEffect 完全指南》 中对 Capture Value 概念的解释:「每次 Render 的内容都会形成一个快照并保留下来,因此当状态变更而 Rerender 时,就形成了 N 个 Render 状态,而每个 Render 状态都拥有自己固定不变的 Props 与 State」

解决方案可参考

React Hooks: Get prevState values

 

下面是更改数据的一些小技巧:

 // 1、修改object中某项
 
this.setState({
  object: {...object, key: value}
});
  // 2、删除数组首位
 
array.splice(0, 1);
this.setState({
  array
});
  // 3、删除数组尾部
 
array.splice(array.length - 1);
this.setState({
  array
});
  // 4、删除数组任意一项
 
array.splice(index, 1);
this.setState({
  array
});
  // 5、数组尾部添加一项
 
this.setState({
  array: [...array, item]
});
 //  6、数组头部添加一项
 
this.setState({
  array: [item, ...array]
});
  7、数组任意位置添加一项
 
array.splice(index, 0, item);
this.setState({
  array
});
 // 8、修改数组中任意一项中值
 
function updateArrayItem(index, key, value) {
  this.setState({
    array: array.map((item, _index) => _index == index ? {...item, [key]: value} : item)
  });
}
//  9、复杂类型修改
 
this.setState(prevState => return newState);

 

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
React,当使用setState方法时出现TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))错误的原因通常是因为你将一个非迭代对象传递给了setState方法。通常情况下,这是由于在使用useState或useReducer时,将初始状态设置为了一个非迭代对象,例如null、undefined或数字。在你提供的引用,错误发生在useState的初始化。 正确的写法是将初始状态设置为一个合适的迭代对象。例如,你可以使用一个空数组作为初始状态: const [age, setAge] = useState([]) 或者,你可以根据你的需求设置初始状态为一个有意义的值,比如一个空对象{}。 根据你提供的代码示例,你可以更改List组件的useState初始化为正确的形式: const [age, setAge] = useState(18) 这样就能避免报错了。记得在使用useState时,仔细检查初始状态的值,确保它是一个迭代对象,而不是一个非迭代对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [TypeError undefined is not iterable (cannot read property Symbol(Symbol.iterator))](https://blog.csdn.net/m0_59092234/article/details/123431518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值