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>
)
看一下这个问题,我认为它会帮助您理解差异。
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