Reactjs Redux存储更新不够快
我有一个非常恼人的问题,我的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 {
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;
}
}