【问题标题】:React TypeError: Cannot read property 'length' of undefinedReact TypeError:无法读取未定义的属性“长度”
【发布时间】:2020-07-20 02:29:27
【问题描述】:

我正在构建小型反应应用程序。主要任务是使用 PokeApi 创建关于口袋妖怪的应用程序。当我点击 pokeCard 时,我的侧边栏必须显示有关 pokemon 的主要信息。所以,我想显示口袋妖怪的数量。我们怎么知道,所有数字都从#开始。但是在 PokeApi 中,口袋妖怪的数量不是以 # 开头的,也不包含任何 0。例如,Charmander 的数量是 #004,但在 PokeApi 中 Id 是 4。 所以,我用逻辑运算符创建了条件。请看:

  {(pokemon.id.length === 1 && <span>#00{pokemon.id}</span>) ||
      (pokemon.id.length === 2 && <span>#0{pokemon.id}</span>) ||
      (pokemon.id.length === 3 && <span>#{pokemon.id}</span>)}

我希望我的创作是正确的。但是,在我的屏幕上,我看到了 TypeError: Cannot read property 'length' of undefined 。我想,这是因为,在我点击之前,pokemon.id 是未定义的。我尝试创建 typeof(pokemon.id) == "undefined" &amp;&amp; &lt;span&gt;loading&lt;/span&gt; ,但它不起作用。

这是代码,我是如何设置口袋妖怪的。

const [SelectedPokemon, setSelectedPokemon] = useState([]);

 const fetchPokemonDetails = (pokemonId) => {
    fetch(`${API_URL}${pokemonId}`)
      .then((result) => result.json())
      .then((result) => {
        setSelectedPokemon(result);
      }, setLoadingForSelectedPokemon(false))
      .catch((error) => console.log("Error:", error));
  };

你能帮我解决一下吗?

【问题讨论】:

  • 表示 id 未定义....所以听起来你在设置之前渲染了一些东西。
  • @epascarello 我怎么理解,它就像你说的那样工作。但我不知道如何避免它。当我点击按钮时它必须响应。
  • 如果没有看到你的 React 代码很难知道你是如何设置pokemon
  • @epascarello 我正在编辑我的帖子,并添加代码,我如何在底部设置口袋妖怪。

标签: javascript reactjs undefined logical-operators


【解决方案1】:

您正试图在定义之前访问该属性。你可以试试下面的代码 sn-p 吗?

{pokemon.id !== undefined ? 
(pokemon.id.length === 1 && <span>#00{pokemon.id}</span>) ||
      (pokemon.id.length === 2 && <span>#0{pokemon.id}</span>) ||
      (pokemon.id.length === 3 && <span>#{pokemon.id}</span>)
: null}

【讨论】:

  • 我试过了。它没有显示任何错误。它也不显示 pokemon.id。
  • 它正在为您提供解决方案。我只是将 id(数字)的类型格式化为字符串。
  • 太棒了。感谢您的支持。如果您也可以选择此作为答案,那就太酷了。
【解决方案2】:

您应该确保正确调用数据。 这是因为您的数据还没有准备好。

代码应该是这样的

{(pokemon && pokemon.id.length === 1 && <span>#00{pokemon.id} 
 </span>) ||
  (pokemon && pokemon.id.length === 2 && <span>#0{pokemon.id} 
 </span>) ||
  ( pokemon && pokemon.id.length === 3 && <span>#{pokemon.id} 
 </span>)}

【讨论】:

    【解决方案3】:

    主要问题是您在实际定义之前尝试使用pokemon.id。如果喜欢,我建议您将您的陈述放在另一个中:

    { pokemon.id ? this.handleId(pokemon.id) : "" }
    

    在哪里

    handleId = (id) => {
      let holder = "#000";
      let arr = holder.split("");
      id.split("").reverse().map((e, i) => arr[3 - i] = e);
      return arr.reduce((a, b) => a + b);
    }
    

    我相信这可以解决您的问题,handleId 可以与任意长度的 id 一起使用。

    【讨论】:

    • 我试过了。它显示了 - pokemon.id.split is not a function 。也许是因为当我设置口袋妖怪时,我把它设置为对象
    • 记录 pokemon 对象时会得到什么?
    • 这个:{abilities: Array(2), base_experience: 64, forms: Array(1), game_indices: Array(20), height: 7, ...}
    • 好吧,从您的评论看来,这个对象似乎没有id 属性。
    • 那么,如果我点击时只有{pokemon.id},我会看到pokemon id,你将如何解释?
    猜你喜欢
    • 2020-03-07
    • 2021-10-03
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多