【问题标题】:Unable to read prop in a React functional component passed via Redux无法读取通过 Redux 传递的 React 功能组件中的 prop
【发布时间】:2021-01-11 13:26:51
【问题描述】:

这里是示例反应功能组件

const GreetingPage = (props) => {
  console.log("console log", props)

  return (
    <div>
      <h1>Hello </h1>;
    </div>
  )
}

const mapStatetoProps = (state) => ({
  user: getUser(state)
});


export default connect(mapStatetoProps)(GreetingsPage)

当我执行console.log(props) 时,它会显示以下内容

如果你看到那里有一个用户对象。

我使用以下方法从道具中检索该用户

 const { user } = props
  console.log("second log", user)

我会看到用户数据

    props.user: {
  "uuid": "7dd2sdfs2-c48f-40bb-98d2-251215911d4b",
  "created_at": "2019-11-08T10:03:36.838000Z",
  "username": "joe012",
  "email": "email@gmail.com",
  "name": "Joe",
  "phone_number": null,
  "do_refresh": false,
  "plan": null,
}

最后,当我想获取用户名console.log(user.name)

它说

TypeError: Cannot read property 'username' of null

出了什么问题?

【问题讨论】:

  • 你能附上getUser的代码吗?
  • 尝试这样记录:console.log('props.user:',JSON.stringify(props.user,undefined,2))
  • @HMR 按照你说的方式更新了输出。
  • @whatf 您的问题中缺少某些内容,您无法记录 props 并让 props.user 成为对象,但在下一行尝试记录 props.user.name 时,props.user 为空,除非你改变状态,但 JSON.stringify 将记录为空。你能举出一个最小的例子来演示这种行为吗?

标签: javascript reactjs redux react-functional-component


【解决方案1】:

你可以试试这个:1.Destructuring props

const GreetingPage = ({user}) => {
console.log(user)
  return (
    <div>
      <h1>Hello </h1>;
    </div>
  )
}

const mapStatetoProps = (state) => ({
  user: getUser(state)
});


export default connect(mapStatetoProps)(GreetingsPage)

或者2.解构子元素

const GreetingPage = ({user:{username}}) => {
console.log(user)
  return (
    <div>
      <h1>Hello </h1>;
    </div>
  )
}

const mapStatetoProps = (state) => ({
  user: getUser(state)
});


export default connect(mapStatetoProps)(GreetingsPage)

或 3.在将其作为 porps 发送之前解析对象

const GreetingPage = ({user}) => {
console.log(user)
  return (
    <div>
      <h1>Hello </h1>;
    </div>
  )
}

const mapStatetoProps = (state) => ({
  user: JSON.parse(getUser(state))
});


export default connect(mapStatetoProps)(GreetingsPage)

【讨论】:

    【解决方案2】:

    在您的问题中,您提到您正在调用console.log(user.name),但您似乎应该调用console.log(user.username)。我认为这只是一个打字错误,可能不是问题的原因,但请仔细检查以确保。

    假设这不是导致问题的原因,另一种可能性是用户对象是异步检索的。如果您的组件多次渲染,并且第一次渲染的用户对象是 null,然后一旦检索到用户对象,该组件就会重新渲染用户对象附加到道具,那么这肯定是正在发生的事情。当你打电话时

    const { user } = props
    console.log("second log", user)
    

    如果 props.user 一开始为空,它不会抛出错误。但是当您调用user.username 时,确实会引发错误,因为您不能调用 null 或 undefined 的属性。要解决此问题,您必须在调用user.username 之前检查user 不是null。例如:

    if(user) {
      console.log(user.username)
    }
    

    或者,如果您使用 ES2020 或 TS 3.7+,您可以使用可选链: user?.username 这样如果用户是虚假的,那么它只会记录 undefined 而不是抛出错误。

    第三种可能性是 lodash 中的 get 方法,您可以在其中放置 _.get(user, 'username') 以确保在调用其属性之前用户对象不为空。

    【讨论】:

    • 用户和用户名都存在。调用任何用户/用户名都会引发错误。
    • 渲染组件时能否发布 console.log 调用的全部输出?
    • 另外,您是否在否决之前尝试过我的建议,因为尝试一下看看它是否有效......
    猜你喜欢
    • 2020-05-23
    • 2020-09-19
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2019-10-08
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多