开发者问题收集

React:父子之间未捕获的 TypeError

2017-08-24
141

我将组件拆分为父元素和子元素。我通过状态将数据从父元素传递给子元素,但收到 Uncaught TypeError:无法读取 null 的属性“imageSource” ,这很奇怪,因为我遵循与应用程序的另一个元素相同的过程。我也遵循了组件和 Props 文档,但仍然有点困惑。

如果我已定义状态、设置状态并将其作为属性添加到子元素,为什么状态仍为 null

class Parent extends React.Component {

 constructor(){
   super();
   this.state = {
     imageSource: [],
     imageTitles: [],
   }
 }

 componentDidMount(){

 ...
 ...
 // grabbing stuff from Dropbox API
 ...
 ...

  .then(function(){
    that.setState({

      imageSource: sources,
      imageTitles: titles,

    });
   });



 render(){
   return(
      <Child imageSource={this.state.imageSource} imageTitles=
      {this.state.imageTitles} />
   );
 }
}



class Child extends React.Component{

 render(){
    if(!this.state.imageSource.length)
      return null;

      let titles = this.state.imageTitles.map((el, i) => <p>{el}</p>)

      let images = this.state.imageSource.map((el, i) =>

        <div className="imageContainer">
           <img key={i} className='images' src={el}/>
           <div className="imageTitle">{titles[i]}</div>
        </div>
       )

    return (
      <div className="ChildWrapper">
         {images}
      </div>
    );
  }
}
2个回答

在子级中,您将以 props(而非 state)的形式接收变量。

在您的情况下,此代码应该可以工作

if(!this.props.imageSource.length)
  return null;

  let titles = this.props.imageTitles.map((el, i) => <p>{el}</p>)

  let images = this.props.imageSource.map((el, i) =>

    <div className="imageContainer">
       <img key={i} className='images' src={el}/>
       <div className="imageTitle">{titles[i]}</div>
    </div>
   )

看一下这个问题,我认为它会帮助您理解差异。

React 中 state 和 props 之间有什么区别?

Javier Suero Santos
2017-08-24

有几件事很突出。这一段代码:

class Child extends React.Component{

 render(){
    if(!this.state.imageSource.length)
      return null;

是错误的,因为您的 Child 组件 没有状态 。您没有在 Child 组件中声明任何状态,您可能也不应该这样做。它所拥有的是从 Parent 组件传递下来的 props 。这是学习 React 的关键部分。您在这里要检查的是 if(!this.props.imageSource.length) ,并编辑调用 this.state 的附加代码并将其替换为 this.props

我注意到的另一件事是:

 that.setState({

      imageSource: sources,
      imageTitles: titles,

    });

为什么是 that.setState({...}) ?这很令人困惑,您真的没有理由调用它。它应该始终是 this.setState({...}) 如果您对 this 进行重新绑定,那么您做错了,因为情况不应该如此,而且很容易导致错误。

Christopher Messer
2017-08-24