无法读取未定义的属性“参数”(React Router 4)

Posted

技术标签:

【中文标题】无法读取未定义的属性“参数”(React Router 4)【英文标题】:Cannot read property ‘params’ of undefined (React Router 4) 【发布时间】:2018-02-22 03:26:56 【问题描述】:

我设置了一个路由来渲染组件:

<Route exact path="/page/:id" location=this.props.location key=this.props.location.key render=( location ) => (
    <PageStart key=this.props.location.key />
) />

然后在那个组件(PageStart)里面我有:

this.props.match.params.id

但是它会抛出一个错误:

Cannot read property 'params' of undefined

在简单地调用component= 时传递道具似乎可以正常工作,但不能在渲染函数中。为什么?

【问题讨论】:

【参考方案1】:

因为render 不会将路由器传递的默认道具传递给组件,例如匹配、历史记录等。

当你写这个时:

<PageStart key=this.props.location.key />

这意味着PageStart 组件中没有props 值。

这样写:

render = props => <PageStart ...props key=this.props.location.key />  />

现在...props 会将所有值传递给PageStart 组件。

【讨论】:

当你解释它时,它就变得显而易见了。谢谢! 为什么要通过-this.props.location.key? @Hussain 不确定,我从 ques 复制了那部分 :) 终于有人解释了它的类用法! @Hussain 我认为添加键为组件提供了唯一标识符,因此 React 可以知道识别其虚拟 dom 中的每个组件以快速重新渲染。据我了解,只有列表需要它,但通用组件的键的使用也可以扩展。请参阅reactjs.org/docs/lists-and-keys.html 了解更多信息。【参考方案2】:

因为您没有将任何 match 属性传递给 PageStart。你给它一个key,但没有match。 尝试这个:

<Route 
    exact 
    path="/page/:id" 
    location=this.props.location 
    key=this.props.location.key 
    render=( 
        location, 
        match 
    ) => (
        <PageStart key=this.props.location.key match=match />
    ) 
/>

【讨论】:

【参考方案3】:

在我的例子中,我发现路由器道具中不再是match,现在是computedMatch

即:this.props.computedMatch.params.id

希望这对某人有所帮助!

【讨论】:

【参考方案4】:

错误提示 match 属性未定义。没错,这里没有 match 道具:

<PageStart key=this.props.location.key />

所以我们需要传入它。render 函数从 react-router 接收到一堆 props,所有这些都需要进一步向下传递。所以,先传播它们,然后添加你自己的道具:

<Route
  exact
  path="/page/:id"
  location=this.props.location
  key=this.props.location.key
  render=(props) => (
    <PageStart ...props key=this.props.location.key />
  )
/>

【讨论】:

【参考方案5】:

请检查提供的路线名称

const AuthNavigattor = createStackNavigator(
  
    logins: screen: LoginScreen,
    splash: screen: SplashScreen,
    register: screen: RegisterScreen,
    forgetPassword: screen: ForgetPasswordScreen,
    mobileNumber: screen: MobileNumberScreen,
    codeEnter: screen: CodeEnterScreen,
    changePassword: screen: ChangePasswordScreen,
    // dashboard:  screen: Drawer 
  ,
  
    // initialRouteName: "splash",
    headerMode: 'none',
  ,
);
const ProfileNavigattor = createStackNavigator(
  
    logins: screen: LoginScreen,
    splash: screen: SplashScreen,
    register: screen: RegisterScreen,
    forgetPassword: screen: ForgetPasswordScreen,
    mobileNumber: screen: MobileNumberScreen,
    codeEnter: screen: CodeEnterScreen,
    changePassword: screen: ChangePasswordScreen,
    // dashboard:  screen: Drawer 
  ,
  
    // initialRouteName: "splash",
    headerMode: 'none',
  ,
);

这里有相同的路由名称,如登录、启动等,这可能是导致此错误的原因。重命名这个唯一的将解决您的问题。

【讨论】:

【参考方案6】:

请试试这个。希望能解决问题。

render = props => <PageStart ...props key=this.props.location.key />  />

【讨论】:

以上是关于无法读取未定义的属性“参数”(React Router 4)的主要内容,如果未能解决你的问题,请参考以下文章

REACT JS:TypeError:无法读取未定义的属性“参数”

无法读取未定义的属性“参数”(React Router 4)

如何使用 Apollo Graphql 客户端和 React 解决“TypeError:无法读取未定义的属性“参数”?

带有可选路径参数的简单 React 路由器给出“TypeError:无法读取未定义的属性“过滤器”

无法在 useParams 读取未定义的属性“匹配” - React Hooks

React-无法读取未定义的属性“setState”