将组件链接到商店时遇到错误。
TypeError:无法读取未定义的属性'errorMessage'
Function.mapStateToProps [as mapToProps]
37 | const mapStateToProps = (state: AppState) => ({
> 38 | errorMessage: state.errorRedux.errorMessage,
39 | error: state.errorRedux.error,
40 | })
我无法确定问题所在。它不应该监听错误,因为我选择有条件地呈现消息。
errorMessage: string | undefined | null
设置为失败。errorMessage: "[INTERFACE"]
失败了。errorMessage?: string
我认为问题可能在于扩展ErrorHandlerProps接口,但是我已经扩展了mapStateToProps?import { Dispatch, Action } from "redux"
import { connect } from "react-redux"
import { AppState } from "reducers"
import { showError } from "data/error_handler"
class ErrorHandler extends React.Component<
ReturnType<typeof mapStateToProps> & ReturnType<typeof mapDispatchToProps>
> {
public render() {
const { onShowError, error, errorMessage } = this.props
let showTheError =
this.props.error === true ? (
<Snackbar
open={error}
message={errorMessage}
autoHideDuration={5000}
/>
) : null
return (
<div>
<RaisedButton onClick={onShowError} label="Toggle ErrorHandler" />
{showTheError}
</div>
)
}
}
const mapStateToProps = (state: AppState) => ({
errorMessage: state.errorRedux.errorMessage,
error: state.errorRedux.error,
})
const mapDispatchToProps = (dispatch: Dispatch<Action>) => {
return {
onShowError: () => dispatch(showError()),
}
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(ErrorHandler)
data/interfaces.ts
export interface ErrorHandlerProps {
error: boolean
errorMessage: string
}
data/reducer.ts
import { ErrorHandlerProps, ActionTypes } from "./"
const initialState: ErrorHandlerProps = {
error: false,
errorMessage: "",
}
export default (
state: ErrorHandlerProps = initialState,
action: ActionTypes
) => {
switch (action.type) {
case "SHOW_ERROR":
return {
...state,
}
default:
return state
}
}
reducers.ts
import { reducer as errorHandler, ErrorHandlerProps } from "data/error_handler"
const appReducer = combineReducers({
errorHandler
} as any)
export type AppState = {
errorRedux: ErrorHandlerProps
}
store.ts
import { createStore, applyMiddleware, compose } from "redux"
import { routerMiddleware } from "react-router-redux"
import thunk from "redux-thunk"
import rootReducer, { AppState } from "reducers"
const initialState = {}
const middleware = [thunk, routerMiddleware(history)]
const composedEnhancers = compose(applyMiddleware(...middleware), ...enhancers)
const store = createStore(rootReducer, initialState, composedEnhancers)
export default store
export const getState = () => store.getState() as AppState
答案 0 :(得分:2)
如果我们能看到您如何创建商店,这将变得更加容易。
通常,当您使用combineReducers
时会发生此问题,因为它创建了reducer的对象,而mapStateToProps
却收到了该对象,而不是状态。
import { createStore, combineReducers } from "redux";
import testReducer from "./reducer";
import testReducer2 from "./reducer2";
// ----
// using combine reducers will make the state in mapStateToProps to be an object of all the reducers combined, so you have to access it like state.testReducer.value or state.testReducer2.value
const rootReducer = combineReducers({
testReducer,
testReducer2
});
// ----
// ----
// while passing a reducer directly will not have the same effect and the state will be accessible like state.value in mapStateToProps
const rootReducer = testReducer;
// ----
const store = createStore(rootReducer);
export default store;
答案 1 :(得分:0)
尝试将其更改为此:
const mapStateToProps = (state: AppState) => ({
errorMessage: state.getIn(['errorRedux', 'errorMessage'], 'default value here'),
error: state.getIn(['errorRedux', 'error'], ], 'default value here'),
})