当前位置: 首页 > 知识库问答 >
问题:

如何使用useEffect和for循环生成多个JSX元素

赵飞雨
2023-03-14

我想使用useEffect和for-loop生成多个JSX元素,但在本例中没有呈现任何内容。

警告代码:“React Hook useEffect缺少依赖项:”Render InfoCard“。请包含它或删除依赖项数组React-Hooks/EXEXTIVE-DEPS”

import React, { useState, useEffect } from 'react';
import InfoCard from '../components/InfoCard.jsx';
import { getScenicSpotRequest } from '../request test.js';

function MainScreen() {

  const [renderInfoCard, setRenderInfoCard] = useState(null);
  const [renderInfoCardArray, setRenderInfoCardArray] = useState([]);

  useEffect(() => {
    //data recieve from axios request
    getScenicSpotRequest().then(result => {
    //want to use useEffect and for loop to generate multiple JSX elements 
      for (let i = 0; i < result.length; i++) {
        setRenderInfoCard(<InfoCard Name={result[i].Name} Description={result[i].Description} Picture={result[i].Picture.PictureUrl1} />);
        setRenderInfoCardArray[i] += renderInfoCard;
      }
    });
  }, []);

  return (
    <div className="App">
      <header className="App-header">
        <Navbar NavbarTitle="ScenicSpot" />
        {renderInfoCardArray}
      </header>
    </div>
  );
}

export default MainScreen;

共有2个答案

轩辕翰
2023-03-14

不要使用状态来存储元素,使用状态来存储请求值,然后map通过这些值来呈现

import React, { useState, useEffect } from 'react';
import InfoCard from '../components/InfoCard.jsx';
import { getScenicSpotRequest } from '../request test.js';

function MainScreen() {

  const [infoCards, setInfoCards] = useState();

  useEffect(() => {
    //data recieve from axios request
    getScenicSpotRequest().then(setInfoCards);
  }, []);

  return (
    <div className="App">
      <header className="App-header">
        <Navbar NavbarTitle="ScenicSpot" />
        {infoCards.map(infoCard => (<InfoCard Name={infoCard.Name} Description={infoCard.Description} Picture={infoCard.Picture.PictureUrl1} />))}
      </header>
    </div>
  );
}

export default MainScreen;
申屠乐池
2023-03-14

我不会将组件放在状态中(您也真的不应该改变状态)。相反,等待所有结果返回,然后用所有结果一次设置状态。当返回JSX时,您可以通过映射结果(如果存在的话)来创建组件。

function MainScreen() {
  const [sceneResults, setSceneResults] = useState([]);
  useEffect(() => {
    getScenicSpotRequest()
      .then(setSceneResults);
      // .catch(handleErrors); // don't forget this - don't want unhandled rejections
  }, [setSceneResults]); // this will not change, so it's safe to put in the dependency array
  return (
    <div className="App">
      <header className="App-header">
        <Navbar NavbarTitle="ScenicSpot" />
        {sceneResults.map(result => (
          <InfoCard Name={result.Name} Description={result.Description} Picture={result.Picture.PictureUrl1} />)
        )}
      </header>
    </div>
  );
}

我将setsceneResults放入effect依赖项数组以满足linter,但这没关系,对状态setter的引用是稳定的,因此它只在mount上运行。

 类似资料:
  • 您能像这样在JSX中使用循环吗? 或者更确切地说,像这样编写的最佳方法是什么?

  • 我是C#的新手,我正在尝试制作一个程序来提示用户输入关于8个vocalist.genre输入的信息,然后根据vocalist.genre输入的内容将这些信息分类到文本文件中。但是,当我尝试使用for循环来处理用户的输入时,我遇到了一个问题。我该怎么办? }

  • 问题内容: 所以我有一个生成器函数,看起来像这样。 在加载此函数并多次调用“ next”之后,我希望它会产生值 但是相反,它总是一直产生0。这是为什么? 问题答案: 初始化新的生成器对象: 然后从新创建的生成器对象获取第一个值(在您的情况下为 0 )。 您应该致电一次: 注意 :已从Python 3(PEP 3114)中删除- 改为使用该函数:

  • 所以我试图写一个代码,在顶部生成从0,0到0,5的坐标,在侧面生成从0,0到5,0的坐标,然后生成到5,5的坐标。这就是我想看到的: (2,0)(2,1)(2,2)(2,3)(2,4)(2,5) (3,0)(3,1)(3,2)(3,3)(3,4)(3,5) (4,0)(4,1)(4,2)(4,3)(4,4)(4,5)

  • 我如何比较用户输入的这些数组呢?

  • 问题内容: 我无法实现有两个嵌套: 这给出一个。 您如何在JSX中嵌套调用? 问题答案: 您需要将其包装在一个元素内。 像这样(由于表元素的规则,我添加了一个额外的东西): 运行示例(无表):