Reactjs 为什么我在react.js的setState回调中得到旧的state值

Reactjs 为什么我在react.js的setState回调中得到旧的state值,reactjs,Reactjs,我有一个函数来更新状态并调用另一个函数 更新setState回调方法中的对象值 我还在setState回调的断点上添加了一个调试器 方法,我观察到的是,值始终是旧值 我们可以这样做以确保更新状态-: updateContactPath(path, index) { const { contactPaths } = this.state; const { setFieldValue } = this.props; this.setState( {

我有一个函数来更新状态并调用另一个函数 更新setState回调方法中的对象值

  • 我还在setState回调的断点上添加了一个调试器
    方法,我观察到的是,值始终是旧值


  • 我们可以这样做以确保更新状态-:

    updateContactPath(path, index) {
        const { contactPaths } = this.state;
        const { setFieldValue } = this.props;
        this.setState(
          {
            [...contactPaths, [index]: path],
          },
          () => setFieldValue('contactPaths', this.state.contactPaths),
        );
      }
    

    这回答了你的问题吗?您可以对
    contactpath
    数组进行变异,然后使用相同的旧数组引用设置state。您需要用一个新的数组对象设置state,这个对象涉及复制旧数组,然后用新路径改变索引。@drewrese我不这么认为。实际上,第7行,我可以得到最新的contactPaths,但是第9行,回调函数中的contactPaths是旧值。@drewerese你的意思是这样的吗?``updateContactPath(路径,索引){const{contactPath}=this.state;const{setFieldValue}=this.props;const UpdatedContactPath=[…contactPath];UpdatedContactPath[index]=path;this.setState({contactPath,},()=>setFieldValue('contactPath',UpdatedContactPath),);}``不要改变状态,创建一个新副本,编辑它,然后将其设置为新状态。或者直接在
    setState
    调用中创建一个新的。类似于
    this.setState({contactPaths:contactPaths.map((p,i)=>index==i?path:p)})
    最后,在回调日志中
    this.state.contactPaths
    updateContactPath(path, index) {
        const { contactPaths } = this.state;
        const { setFieldValue } = this.props;
        this.setState(
          {
            [...contactPaths, [index]: path],
          },
          () => setFieldValue('contactPaths', this.state.contactPaths),
        );
      }