如何将 JSON 对象发送到 React 中的组件?
我是 React 新手,正在学习使用 Poke API( https://pokeapi.co )的教程。
我正在使用 whatwg-fetch 向 API 发出请求。这会将 API 中的数据作为对象保存到状态“selectedPokemon”。
this.state = {
// other states
showModal: false,
selectedPokemon: null
};
我想将这些数据发送到一个组件(在我的情况下是模态框),因此我更新了模态框组件调用以将 selectedPokemon 状态作为道具包含进去:
<PokemonModal pokemon={this.state.selectedPokemon} closeModal={this.handleModalClose} showModal={this.state.showModal} />
我还更新了我的 PokemonModal 组件(在 PokemonModal.js 上)以将
pokemon
作为道具包含进去:
const PokemonModal = ({showModal, closeModal, pokemon}) => {
但是,当我要在
PokemonModal
中使用该道具时,例如:
<Modal.Title>{pokemon.name}</Modal.Title>
我收到错误
Uncaught TypeError: Cannot read property 'name' of null
(这与我尝试使用的对象的其他任何部分都一样,例如
pokemon.order
。 showModal 和 closeModal 属性按预期工作。)
有人知道我如何将 JSON 对象发送并使用到另一个组件吗?
如果重要的话,我的获取函数就是这样设置的。 console.log 返回预期结果,即来自以下对象: https://pokeapi.co/api/v2/pokemon/10125/
handleModalOpen(pokemon) {
if(pokemon.url !== undefined) {
fetch(`${pokemon.url}`)
.then(response => {
return response.json();
})
.then(json => {
this.setState({
selectedPokemon: json,
showModal: true
})
console.log('selected: ' + this.state.selectedPokemon);
})
.catch(ex => {
console.log('pasrsing failed ' + ex);
})
}
}
在对
pokemon.url
的请求完成之前,
selectedPokemon
将处于
undefined
状态。
因此,最初
<PokemonModal .../>
将接收
pokemon
作为
undefined
。因此,您会看到错误。
解决该问题的一种方法是在
PokemonModal
组件中添加一个
if
:
const PokemonModal = ({showModal, closeModal, pokemon}) => {
if(pokemon && Object.keys(pokemon).length !== 0) {
// prepare the view and return it
}
return null;
}
您也可以在父组件中添加一个
if
,但一般来说,我喜欢在子组件中添加
if
,这样父组件就不会被太多
if
弄得乱七八糟
您收到
TypeError
的原因在于您使用
null
初始化状态,并且在等待响应时,模式尝试读取 pokemon 的 name 属性。
您需要处理模式内尚未设置 pokemon 的情况,
渲染时您可以添加
const PokemonModal = ({showModal, closeModal, pokemon}) => {
if (!pokemon) {return "Loading..."}`
}
或一些加载微调器。
在我看来这里不需要使用 JSON
setState
是异步的,这就是您的组件失败的原因,因为您正在打开模式,但状态可能尚未设置并传播给子项。
解决此问题的一种方法是向您的模式添加加载状态。
return (
pokemon&&{
<Modal>
<Modal.Title>{pokemon.name}</Modal.Title>
</Modal>
}
)