开发者问题收集

获取 TypeError:无法读取 null 的属性“id”(使用 redux)

2019-10-22
857

因此,我有以下方法,该方法接受对象“x”。对象“x”具有一个名为“id”的属性。我可以在 4 行中记录 id,但不能在 5 行中记录。

onOpenDeleteServiceModal=(x)=> {
    this.props.setReduxShowDeleteServiceModal(true);
    this.props.setReduxTargetedService(x); //save the object to reducer (using mapDispatchToProps)
    console.log(x.id); //works fine
    console.log(this.props.getReduxTargetedService.id); //error here
}

3 行中,我将对象分派到我的 Reducer 并将其保存在那里(使用 redux),然后在 5 行中,我尝试从 Reducer 记录对象 id,但我得到 “TypeError:无法读取 null 的属性“id”

mapStateToProps

const mapStateToProps = (state) => ({
    getReduxTargetedService: state.servicesState.targetedService,
})

mapDispatchToProps

const mapDispatchToProps = dispatch => ({
setReduxTargetedService: (x) =>
    dispatch({ type: 'SET_TARGETED_SERVICE', x}),
})

servicesReducer

const INITIAL_STATE = {
targetedService: null,
};



function servicesReducer(state = INITIAL_STATE, action) {
  switch(action.type) {
    case 'SET_TARGETED_SERVICE': return { 
        ...state,
        targetedService: action.x
    }


    default:
        return state;
  }
}
3个回答

我认为这里有 2 个误解。

1 - redux store 是异步更新的,这意味着在调度操作后立即调用 this.props.getReduxTargetedService.id 将不起作用。

2 - 这不是 react + redux 的工作方式。每当您调度操作并更新 store 时,您只会在重新渲染组件后看到更新的值。发生这种情况是因为组件已收到某些 props 已更新的通知。例如,这也取决于您如何使用 setState 更新组件状态。

对于您的情况,您可以在 componentDidUpdate 生命周期方法中检查 this.props.getReduxTargetedService.id 值。您应该能够看到新的值

React 生命周期如下所示: http://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/

在这里您可以更深入地了解 redux https://css-tricks.com/learning-react-redux/

Carlos Crespo
2019-10-22

getReduxTargetedService 似乎是一种方法,因此您需要这样调用它,即 this.props.getReduxTargetedService().id

Jacobdo
2019-10-22

我发现一篇 文章 帮助我解决了使用 redux 时“无法读取属性...”的问题:

不要从 Redux 返回 Null ...”

就我而言,我只是默认返回一个 空字符串 而不是 null ,问题就解决了。

M_droid
2019-11-26