开发者问题收集

如何将 JSON 对象发送到 React 中的组件?

2018-11-26
2339

我是 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);
        })
    }
  }
3个回答

在对 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 弄得乱七八糟

Anand Undavia
2018-11-26

您收到 TypeError 的原因在于您使用 null 初始化状态,并且在等待响应时,模式尝试读取 pokemon 的 name 属性。 您需要处理模式内尚未设置 pokemon 的情况, 渲染时您可以添加 const PokemonModal = ({showModal, closeModal, pokemon}) => { if (!pokemon) {return "Loading..."}` } 或一些加载微调器。

在我看来这里不需要使用 JSON

Eliran
2018-11-26

setState 是异步的,这就是您的组件失败的原因,因为您正在打开模式,但状态可能尚未设置并传播给子项。 解决此问题的一种方法是向您的模式添加加载状态。

return (
pokemon&&{
    <Modal>
      <Modal.Title>{pokemon.name}</Modal.Title>
    </Modal>
}

)
Fawzi
2018-11-26