【发布时间】:2023-08-16 03:57:01
【问题描述】:
你好!
通过mapStateToProps 访问存储变量,我遇到了一些以前从未遇到过的问题。也就是说,它们永远不会改变,并且总是在以任何方式更改它们之前在商店中设置它们的默认值。如果我通过store.getState().reducer.x 给他们打电话,我的代码就可以工作!
这是我的商店:
export const initialState = {
isKeyManagementWindowOpen: false
};
const rootReducer = combineReducers({
some: someReducer,
settings: settingsComponentReducer
)};
const store = createStore(rootReducer, compose(applyMiddleware(thunk), window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__() : variable => variable));
export default store;
settingsComponentActions.js
export const TOGGLE_KEY_MANAGEMENT_WINDOW = 'TOGGLE_KEY_MANAGEMENT_WINDOW';
export const toggleKeyManagementWindow = isKeyManagementWindowOpen => {
return { type: TOGGLE_KEY_MANAGEMENT_WINDOW, isKeyManagementWindowOpen};
}
settingsComponentReducer.js
export const settingsComponentReducer = (state = initialState, action) => {
console.log(action);
switch (action.type) {
case Actions.TOGGLE_KEY_MANAGEMENT_WINDOW:
return Object.assign({}, state, {
isKeyManagementWindowOpen: action.isKeyManagementWindowOpen
});
default: return state;
}
};
可能导致问题的一件事是我在 websocket's subscribe 方法中调用了 this.props。
Key.js
connectToWebsocket = ip => {
const stompClient = Stomp.client(`url/receivekey`);
stompClient.heartbeat.outgoing = 0;
stompClient.heartbeat.incoming = 0;
stompClient.debug = () => null;
stompClient.connect({ name: ip }, frame => this.stompSuccessCallBack(frame, stompClient), err => this.stompFailureCallBack(err, ip));
}
stompSuccessCallBack = (frame, stompClient) => {
stompClient.subscribe(KEY_READER_NODE, keyData => {
if (!this.props.isKeyManagementWindowOpen) {
this.loginWithKey(keyData.body);
} else {
this.addToKeyList(keyData.body);
}
});
}
即使我事先将isKeyManagementWindowOpen 设置为true,它仍然解析为false。如果我将!this.props.isKeyManagementWindowOpen 与!store.getState().settings.isKeyManagementWindowOpen 交换,则代码可以工作并进入this.addToKeyList(keyData.body)。
所以,如果我交换这些,但将 this.addToKeyList 中的每个商店调用保留为 this.props.,那么这些也是默认值,这没有任何意义。仅当我将每个 this.props. 行与 store.getState()... 交换时才有效。
const mapStateToProps = state => ({
...
...
isKeyManagementWindowOpen: state.settings.isKeyManagementWindowOpen,
});
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Key));
到目前为止,我的代码有效,但我想将 props 称为 this.props...,而不是通过 store.getState()...。知道为什么会发生这种情况吗?
谢谢!
【问题讨论】:
标签: javascript reactjs redux websocket stomp