开发者问题收集

为什么 props 渲染为未定义?

2017-12-14
875

我有一个名为 PersonCard 的 React 组件:

class PersonCard extends Component {

  constructor(props) {
    super(props);
    console.log(JSON.stringify(props));
    this.state = props;
  }

  render() {
    return (
      <div>
            <MuiThemeProvider muiTheme={Mui} >
                <Card>
                    <CardHeader
                    title={this.props.firstName}
                    />
                </Card>
            </MuiThemeProvider>
      </div>
    );
  }
}

export default PersonCard;

视图有多个 PersonCard,它们从其父组件 SearchResults 中的数组映射,如下所示:

class SearchResults extends Component {

    constructor() {
        super()
        this.state = {
          data: [],
        }
      }
    componentDidMount() {
        return fetch('http://localhost:3005/persons')
          .then((response) => response.json())
          .then((responseJson) => {
            this.setState({
              data:responseJson
            })
          })
        }
    render() {
        return (
            <div>
            {
              this.state.data.map( (person)=>
                <PersonCard key={person.id} personProp = {person} />
              )

            }
          </div>
        )
    }
}

export default SearchResults;

构造函数中的记录器正确显示了 person 对象及其属性,因此它应该在那里。

但是 props 值(this.props.firstName)没有显示在 render 方法中,因为它们在视图上呈现为“未定义”。为什么?

2个回答

您没有在此处定义名为 firstName 的 prop:

<PersonCard key={person.id} personProp = {person} />

也许您想通过 this.props.personProp.firstname 来访问它?

ChrisR
2017-12-14

在您的代码中,您将“key”和“personProp”属性传递给“PersonCard”组件。因此,在“PersonCard”组件的渲染函数中,您可以通过“this.pops.key”和“this.props.personProp”访问这些属性。

因此,如果您的 personProp 包含 firstName,那么您将能够通过“this.prps.personProp.firstName”访问它。因此,您应该尝试以下代码

class PersonCard extends Component {

constructor(props) {
  super(props);
  console.log(JSON.stringify(props));
  this.state = props;
}

render() {
  return (
      <div>
        <MuiThemeProvider muiTheme={Mui} >
            <Card>
                <CardHeader
                title={this.props.personProp.firstName}
                />
            </Card>
        </MuiThemeProvider>
      </div>
   );
  }
}

export default PersonCard;
Eshu
2017-12-14