【问题标题】:TypeError: Cannot read property 'firstName' of undefined - using 'props' in reactTypeError:无法读取未定义的属性“firstName”-在反应中使用“props”
【发布时间】:2019-01-25 21:17:07
【问题描述】:

我目前正在学习 React,但遇到了一个问题。

我检索与文档相关的 JSON 信息列表,然后将 json 作为 props 传递到以下 const

const Document = props => {
  console.log(JSON.stringify(props));
  return(
    <div className="row">
      <div className="col-3">{props.dateOnLetter}</div>
      <div className="col-1">{props.personFrom.firstName}</div>
      <div className="col-1">{props.personFrom.lastName}</div>
      <div className="col-1">{props.personTo.firstName}</div>
      <div className="col-1">{props.personTo.lastName}</div>
    </div>
  );
};

JSON 看起来像这样:

{
    "dateOnLetter":"2012-04-23T18:25:43.511+0000",
    "personFrom":{
        "id":"5b637d319e30ed3f8c322c64",
        "firstName":"Georgexxx",
        "lastName":"TheCatxxx"
    }
}

它抱怨 personTo 属性不存在;但是我想包含它的原因是它可能存在于某些行中。

它抱怨这条线:

<div className="col-1">{props.personTo.firstName}</div>

错误是:

TypeError: 无法读取未定义的属性 'firstName' - 在反应中使用 'props'

那么,知道如何优雅地解决这个问题吗?

【问题讨论】:

    标签: javascript json reactjs


    【解决方案1】:

    您需要防止它不存在。有几种方法可以做到这一点。比如条件运算符:

    <div className="col-1">{props.personTo ? props.personTo.firstName : ""}</div>
    <div className="col-1">{props.personTo ? props.personTo.lastName : ""}</div>
    

    现场示例:

    const Document = props => {
      console.log(JSON.stringify(props));
      return(
        <div className="row">
          <div className="col-3">{props.dateOnLetter}</div>
          <div className="col-1">{props.personFrom.firstName}</div>
          <div className="col-1">{props.personFrom.lastName}</div>
          <div className="col-1">{props.personTo ? props.personTo.firstName : ""}</div>
          <div className="col-1">{props.personTo ? props.personTo.lastName : ""}</div>
        </div>
      );
    };
    
    ReactDOM.render(
      <Document dateOnLetter="today" personFrom={{firstName: "Joe", lastName: "Bloggs"}} />,
      document.getElementById("root")
    );
    <div id="root"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

    另一种选择是在收到时解构您的 props 并为 personTo 属性提供默认值:

    const Document = ({dateOnLetter, personFrom, personTo = {firstName: "", lastName: ""}}) => {
      return(
        <div className="row">
          <div className="col-3">{dateOnLetter}</div>
          <div className="col-1">{personFrom.firstName}</div>
          <div className="col-1">{personFrom.lastName}</div>
          <div className="col-1">{personTo.firstName}</div>
          <div className="col-1">{personTo.lastName}</div>
        </div>
      );
    };
    

    现场示例:

    const Document = ({dateOnLetter, personFrom, personTo = {firstName: "", lastName: ""}}) => {
      return(
        <div className="row">
          <div className="col-3">{dateOnLetter}</div>
          <div className="col-1">{personFrom.firstName}</div>
          <div className="col-1">{personFrom.lastName}</div>
          <div className="col-1">{personTo.firstName}</div>
          <div className="col-1">{personTo.lastName}</div>
        </div>
      );
    };
    
    ReactDOM.render(
      <Document dateOnLetter="today" personFrom={{firstName: "Joe", lastName: "Bloggs"}} />,
      document.getElementById("root")
    );
    <div id="root"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

    你不想解构参数列表不用解构,不想解构也不需要全部解构:

    const Document = props => {
      const {personTo = {firstName: "", lastName: ""}} = props;
      return(
        <div className="row">
          <div className="col-3">{props.dateOnLetter}</div>
          <div className="col-1">{props.personFrom.firstName}</div>
          <div className="col-1">{props.personFrom.lastName}</div>
          <div className="col-1">{personTo.firstName}</div>
          <div className="col-1">{personTo.lastName}</div>
        </div>
      );
    };
    

    现场示例:

    const Document = props => {
      const {personTo = {firstName: "", lastName: ""}} = props;
      return(
        <div className="row">
          <div className="col-3">{props.dateOnLetter}</div>
          <div className="col-1">{props.personFrom.firstName}</div>
          <div className="col-1">{props.personFrom.lastName}</div>
          <div className="col-1">{personTo.firstName}</div>
          <div className="col-1">{personTo.lastName}</div>
        </div>
      );
    };
    
    ReactDOM.render(
      <Document dateOnLetter="today" personFrom={{firstName: "Joe", lastName: "Bloggs"}} />,
      document.getElementById("root")
    );
    <div id="root"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

    【讨论】:

    • 确保 props.personTo 有一个默认值。
    • @T.J.Crowder 谢谢你的工作......会接受你的回答,但必须等待 7 分钟 :)
    • @ChrisCousins - 以上是...?
    • 是的。不同之处在于我更喜欢​​在组件传递道具之前应用默认值,而不是条件渲染逻辑。当我为组件编写测试时,我更喜欢这种方法。
    • @ChrisCousins - 啊!你的意思是default props。我以为你的意思是解构中的默认值。 :-) 如果您想发布它,那将是一个很好的答案(在我看来)。
    【解决方案2】:

    作为评论中的Chris Cousins saiddefault props 是另一种选择:

    Document.defaultProps = {
      personTo: {firstName: "", lastName: ""}
    };
    

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 2019-08-25
      • 2022-09-27
      • 2020-09-07
      • 2021-06-22
      • 2021-07-10
      • 2017-01-01
      • 2021-01-16
      • 2021-08-05
      相关资源
      最近更新 更多