【问题标题】:Having problems mapping json data in react在反应中映射json数据时遇到问题
【发布时间】:2021-01-04 05:31:03
【问题描述】:

嘿伙计们,我不知道为什么我的 setPlaceId 有效,但我的 setPlaceName 无效 当有一些应该打印的数据时,placeName 不打印任何东西有人可以帮忙吗?所以是的,我添加了更多代码,如果您需要更多内容,请发布,提前感谢大家的帮助,我希望我能尽快解决这个问题。

tldr:setPlaceId 粘贴文本,但 setPlaceName 在有应粘贴的信息时不粘贴文本。

顺便说一句,我从代码中删除了一些东西,所以它不会太长,所以不要担心我没有我调用的一些东西

function ConvertPlaces() {
  const [placeName, setPlaceName] = useState("");
  const [placeId, setPlaceId] = useState("");

  useEffect(() => {
    convert();
  }, []);

  const convert = () => {
    fetch(
      `https://skyscanner-skyscanner-flight-search-v1.p.rapidapi.com/apiservices/autosuggest/v1.0/UK/GBP/en-GB/?query=${userInput}`,
      {
        method: "GET",
        headers: {
          //deleted api keys
        },
      }
    )
      .then((res) => res.json())
      .then((response) => {
        console.log(response);
        setPlaceName(response.Places.map((airport) => airport.PlaceName));
        setPlaceId(response.Places.map((airport) => airport.PlaceId));
      })
      .catch((err) => {
        console.log(err);
      });
  };
  const handleChange = (event) => {
    setInputField(event.target.value);
    setUserInput(event.target.value);
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    setSavedInput(inputField);
    setInputField("");
    convert();
  };

  return (
    <div>
      <SearchPlaces
        run={convert}
        handleChange={handleChange}
        handleSubmit={handleSubmit}
        inputField={inputField}
        userInput={userInput}
        savedInput={savedInput}
      />
      <p>sfdajfp</p>
      <p>{placeId}</p>
      <p>{placeName}</p>
    </div>
  );
}

export default ConvertPlaces;

【问题讨论】:

  • setPlaceName 的代码在哪里?
  • 请分享您的整个组件代码
  • 没什么了,我只是在 p 标签中使用它

    {placeId}

    {placeName}

  • 你能解释一下你想做什么吗?从您的代码中,您似乎有一个数组类型的状态“PlaceId”,这真的是您需要的解决方案吗?如果您能告诉我们您期望的结果,我们可能会帮助您找到更好的解决方案
  • 你说setPlaceName不起作用是什么意思?

标签: javascript html css arrays reactjs


【解决方案1】:

我不确定这是否能解决您的问题,因为您确实应该显示更多代码,但无论如何,我可以建议您只循环一次响应吗?

// ...
fetch([API endpoint])
  .then(res => res.json())
  .then(response => {
    const setPlaceData = response.reduce((outObj, airport) => {
      outObj.PlaceNames.push(airport.PlaceName);
      outObj.PlaceIds.push(airport.PlaceId);
      return outObj;
    }, { PlaceNames: [], PlaceIds: [] });
    
    /*
     * I am assuming that you are using 'useState()' hook and
     * you are willingly replacing whatever content is already
     * present in your state variables rather than adding to it.
     * E.g.
     * setPlaceName([...placeName, ...setPlaceData.PlaceNames]);
     */
    setPlaceName(setPlaceData.PlaceNames);
    setPlaceId(setPlaceData.PlaceIds);
  });
// ...

【讨论】:

  • 好吧,我刚刚添加了我所有的代码,我试过了,但它仍然不起作用:(
  • 当然不行;您从后端获得的内容(一个位置数组)与您用作状态变量的内容(两个字符串)之间存在类型不匹配。你应该更新你的代码来处理数组(例如,&lt;p&gt;{placeId}&lt;/p&gt; 应该替换为 &lt;p&gt;{placeId[0]}&lt;/p&gt; - 如果你只想要第一个 - 或 {placeId.map((item, index) =&gt; &lt;p key={placeid-${index}}&gt;{item}&lt;/p&gt;)} - 如果你想要查看完整的 ID 列表)。
  • 我刚刚刷新了应用程序,它开始工作了哈哈哈抱歉,无论如何我会按照你说的让它看起来井井有条,但即使我没有这样做,它仍然会打印所有内容
  • @joshk98,请注意我在reduce() 函数中忘记了return outObj。我现在修改了代码,如果你还没有修改,请务必添加return语句。
猜你喜欢
  • 2019-11-05
  • 2013-02-09
  • 2021-09-06
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
相关资源
最近更新 更多