Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.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 Redux React:如何将更新后的状态传递给函数onChange?_Javascript_Reactjs_Web_Redux_React Redux - Fatal编程技术网

Javascript Redux React:如何将更新后的状态传递给函数onChange?

Javascript Redux React:如何将更新后的状态传递给函数onChange?,javascript,reactjs,web,redux,react-redux,Javascript,Reactjs,Web,Redux,React Redux,我是一个新的反应和尝试一个简单的事情。我不明白如何修改状态并将其传递给函数。请在下面找到我的代码: 我跳过了多余的代码,只跳过了重点,除了这个功能,其他一切都很好 state = { card: this.props.card // No probelm here , the props are correctly received in my component }; 我正在尝试更新状态onChange,并在我的调度程序中使用此状态值在该事件之后生成一个新状态。请在此处找到此

我是一个新的反应和尝试一个简单的事情。我不明白如何修改状态并将其传递给函数。请在下面找到我的代码: 我跳过了多余的代码,只跳过了重点,除了这个功能,其他一切都很好

 state = {
    card: this.props.card // No probelm here , the props are correctly received in my component 
  };
我正在尝试更新状态onChange,并在我的调度程序中使用此状态值在该事件之后生成一个新状态。请在此处找到此功能的代码段:

<select
          class="form-control m-1"
          value={this.state.card.type}
          onChange={e => {
            let newType = e.target.value;
            this.setState(prevState => ({
              card: {
                ...prevState.card,
                type: newType
              }
            }));
            console.log(this.state.card) // **This gives me the old state, not updated one**
            this.props.updateCard(this.state.card) // Correctly receiving the updateCard Props , 
          }}
        >
          <option value="ABC">Option1</option>
          <option value="DEF">Option2</option>
        </select>
我的减速机:

  case "UPDATE_CARD": {
      console.log("INSIDE REDUCER");
      console.log(action.card);
      return {
        cards: state.cards.map(card=>
          card.id === action.card.id ? action.card: card
        )
      };
    }

请帮忙。我在这里搜索了很多东西,但没有任何帮助。

这是因为
setState
不是同步的:

。。。
onChange={e=>{
设newType=e.target.value;
this.setState(prevState=>({
卡片:{
…prevState.card,
类型:新类型
}
}), () => {
console.log(this.state.card)//将为您提供新值
//您还应该在此处对redux状态进行任何更新以触发
//按正确的顺序重新渲染并防止争用情况
});
console.log(this.state.card)/**这给了我旧的状态,而不是更新的状态**
this.props.updateCard(this.state.card)//正确接收updateCard道具,
}}
...

这是因为
setState
不同步:

。。。
onChange={e=>{
设newType=e.target.value;
this.setState(prevState=>({
卡片:{
…prevState.card,
类型:新类型
}
}), () => {
console.log(this.state.card)//将为您提供新值
//您还应该在此处对redux状态进行任何更新以触发
//按正确的顺序重新渲染并防止争用情况
});
console.log(this.state.card)/**这给了我旧的状态,而不是更新的状态**
this.props.updateCard(this.state.card)//正确接收updateCard道具,
}}
...


在您的代码中,您更新状态并在同一个函数中传递给dispatch,所有内容都在同一范围内,因此为什么您不能将新值直接传递给该dispatch本身?谢谢@RajKumar,但无论何时更新状态,您能帮我传递修改后的状态吗,它将使组件返回更新的值以使用它,这里的问题是您试图在onChange事件触发器内获取更新的状态,因此这就是原因,您没有获取更新的值我很抱歉,当您说:将新值直接传递给dispach,这就是我正在做的。我的新值是修改后的状态。你有什么建议?我提到的新值是你传递给SetState的值。你可以这样试试<代码>this.setState(prevState=>{const updatestate={card:{…prevState.card,type:newType}};this.props.updateCard(updatestate);返回updatestate;})在您的代码中,您更新状态并在同一个函数中传递给dispatch,所有内容都在同一范围内,因此为什么您不能将新值直接传递给该dispatch本身?谢谢@RajKumar,但无论何时更新状态,您能帮我传递修改后的状态吗,它将使组件返回更新的值以使用它,这里的问题是您试图在onChange事件触发器内获取更新的状态,因此这就是原因,您没有获取更新的值我很抱歉,当您说:将新值直接传递给dispach,这就是我正在做的。我的新值是修改后的状态。你有什么建议?我提到的新值是你传递给SetState的值。你可以这样试试<代码>this.setState(prevState=>{const updatestate={card:{…prevState.card,type:newType}};this.props.updateCard(updatestate);返回updatestate;})谢谢,这很有效。如果你不介意的话,你能详细说明一下吗?将有助于学习Simply put
setState
是一个异步函数,这意味着代码不会停止执行并在执行console.log语句之前等待它完成,因此您无法保证在按类似顺序注销状态时它已完成。所以请仔细阅读异步javascript以避免将来出现类似这样的陷阱:)谢谢!我上个月刚开始学习JS,这是一段颠簸的旅程:)哈哈,是的,系好安全带…;)谢谢,这个有用。如果你不介意的话,你能详细说明一下吗?将有助于学习Simply put
setState
是一个异步函数,这意味着代码不会停止执行并在执行console.log语句之前等待它完成,因此您无法保证在按类似顺序注销状态时它已完成。所以请仔细阅读异步javascript以避免将来出现类似这样的陷阱:)谢谢!我上个月刚开始学习JS,这是一段颠簸的旅程:)哈哈,是的,系好安全带…;)
  case "UPDATE_CARD": {
      console.log("INSIDE REDUCER");
      console.log(action.card);
      return {
        cards: state.cards.map(card=>
          card.id === action.card.id ? action.card: card
        )
      };
    }