Reactjs Redux存储更新不够快

Reactjs Redux存储更新不够快,reactjs,typescript,redux,react-redux,Reactjs,Typescript,Redux,React Redux,我有一个非常恼人的问题,我的redux商店(似乎)没有及时更新,因为我猜这是一种反应先发制人的优化。这是我的应用程序组件 function mapStateToProps(store: FoAppState): AppState { return { isCurrentlySelectingARoad: store.isSelectingRoad, }; } function mapDispatchToProps(dispatch: Dispatch) { return {

我有一个非常恼人的问题,我的redux商店(似乎)没有及时更新,因为我猜这是一种反应先发制人的优化。这是我的应用程序组件

function mapStateToProps(store: FoAppState): AppState {
  return {
    isCurrentlySelectingARoad: store.isSelectingRoad,
  };
}

function mapDispatchToProps(dispatch: Dispatch) {
  return {
    activateRoadSelects: (s: boolean) => {
      return dispatch(activateRoadSelection(s));
    },
  };
}

const connector = connect(mapStateToProps, mapDispatchToProps);

type AppProps = ConnectedProps<typeof connector>;

class App extends React.Component<AppProps, {}> {
 evaluateEndTurnEligibility() {
    const { isCurrentlySelectingARoad } = this.props
    // ** PROBLEM **
    console.log(isCurrentlySelectingARoad);

    if (
      !isCurrentlySelectingARoad
    ) {
      this.setState({
        ...this.state,
        canEndTurn: true,
      });
    }
  }

selectRoadSpotCB() {
    this.props.activateRoadSelects(false);

    const millisecondsToWait = 1000;
    setTimeout(() => {
        this.evaluateEndTurnEligibility();
    }, millisecondsToWait);
  }
}

render(){
    <Road cb={selectRoadCB} />
}

问题在于,当有人单击“Road”时,它最终会到达回调并转到“evaluteturnqualification”,尽管
if
前面的控制台日志显示为false,但if实际上没有通过。出于某种原因,在evaluateLG方法中添加等待一秒钟的超时实际上解决了这个问题。分派是同步的,所以有什么我只是忽略了,或者这是React试图为我优化东西的问题吗?

我会调用
this.evaluateEndTurnQualifiety()
componentDidUpdate
生命周期中(请记住验证前一个道具是否与下一个道具不同)


试图访问预先更改状态的给定函数的道具/状态通常会导致混乱。即使发送是同步的,react也会收到新的更改道具,重新播放,所有这些都可能导致您在需要的时候没有下一个道具

我觉得奇怪的是,在你的mapStateToProps你经过
商店。isSelectingRoad
,而
isSelectingRoad
不是你所在州的一部分。当它查看您的状态(您称之为存储)时,实际上是一个布尔值,因此
store.isSelectingRoad
将是未定义的。@buzatto这是我的错,我应该澄清这一点,但是
isSelectingRoad
是状态的一部分(或者应该是)。减速器的名称相同,因为在rootReducer中,我可以使用
combinereducer
import*from./reducers'
这是一个非常好的主意,谢谢!是的,不幸的是,我想我可能不得不从另一个角度来尝试。很高兴有了一个更干净的解决方案,但仍然为我不知道是什么首先破坏了它而烦恼
type Props = {
  cb: Function;

};

type HPProps = {
  tiles: Array<TileModel>;
};

function mapStateToProps(store: FoAppState): HPProps {
  return {
    tiles: store.boardToBePlayed.listOfTiles,
  };
}

const connector = connect(mapStateToProps);

type ReduxProps = ConnectedProps<typeof connector>;

};

type HPProps = {
  tiles: Array<TileModel>;
};

function mapStateToProps(store: FoAppState): HPProps {
  return {
    tiles: store.boardToBePlayed.listOfTiles,
  };
}

const connector = connect(mapStateToProps);

type ReduxProps = ConnectedProps<typeof connector>;

type HighlightProps = ReduxProps & Props;

class Road extends Component<HighlightProps, {}> {
  constructor(props: HighlightProps) {
    super(props);
  }

  selectedARoadSpot(): void {
    socket.emit(
      "addRoad",
      "1",
    );
    this.props.finishedSelectingCallback();
  }

  render() {
    return (
      <circle
        onClick={this.selectedARoadSpot}
      />
    );
  }
}

export default connector(Road);
import { SelectingRoadAction, SELECTING_ROAD } from "../Actions";

export default function isSelectingRoad(
  state: boolean = false,
  action: SelectingRoadAction
): boolean {
  switch (action.type) {
    case SELECTING_ROAD:
      console.log(action.isSelecting);
      return action.isSelecting;
    default:
      return state;
  }
}