【问题标题】:PrimeReact Select Item is empty after loading data from API从 API 加载数据后 PrimeReact Select Item 为空
【发布时间】:2021-05-15 21:55:30
【问题描述】:

我的功能组件如下:

const Scratch = () => {

 const [isLoaded, setIsLoaded] = useState(false);
 const colorSelectItems=[];
 const [selectedColor, setSelectedColor] = useState("fffff");

 useEffect(() => {
    fetch(
           `http://localhost:8765/fetchData?userId=1`
         )
      .then((response) => response.json())
      .then((data) => {
       createDropDown(data));
       setIsLoaded(true);
      });
  }, []);

 const createDropDown= (data) => {
    data.map((color) => {
      colorSelectItems.push({
        label: color.colorName,
        value: color.hexValue,
      });
    });

 return (
     <div className="commonMargin">
         {!isLoaded&& <p>Loading..</p>}
         {isLoaded&& (
           <Dropdown
            value={selectedColor}
            optionLabel="label"
            options={colorSelectItems}
            onChange={(e) => setSelectedColor(e.target.value);}
           />
          )}
     </div>
  );
};

export default Scratch;

问题是,它一直显示 Loading... 直到 API 调用完成,然后才呈现 DropDown。但是API调用完成后,DropDown还是空的!

我在这里错过了什么?

PS:如果我将从 API 获取数据替换为从本地 json 文件获取数据,则此 DropDown 可以完美运行

【问题讨论】:

  • 您需要设置状态才能重新渲染组件。
  • @YashJoshi 我为 colorSelectItems 尝试了useState([])。但它将bound dispatchAction 渲染为选择项之一
  • 您能否创建一个 CodeSandbox 应用程序来复制问题。只需转到react.new 来创建问题。

标签: reactjs fetch jsx use-effect primereact


【解决方案1】:

试试这个。如果有任何问题请回复

const Scratch = () => {

 const [isLoaded, setIsLoaded] = useState(false);
 const colorSelectItems=[];
 const [selectedColor, setSelectedColor] = useState("fffff");

 useEffect(() => {
    fetch(
           `http://localhost:8765/fetchData?userId=1`
         )
      .then((response) => response.json())
      .then((data) => {
       var temp=data?.map((item)=>({label: item?.colorName,
        value: item?.hexValue }));
       colorSelectItems=temp;
       setIsLoaded(true);
      });
  }, []);
     
 return (
     <div className="commonMargin">
         {!isLoaded&& <p>Loading..</p>}
         {isLoaded&& (
           <Dropdown
            value={selectedColor}
            optionLabel="label"
            options={colorSelectItems}
            onChange={(e) => setSelectedColor(e.target.value);}
           />
          )}
     </div>
  );
};

export default Scratch;

【讨论】:

  • 是的,我以类似的方式解决了这个问题;一个变化。 const [colorSelectItems,setColorSelectItems]=useState([]); 然后我用 colorSelectItems=temp; 代替 setColorSelectItems(temp)
  • @Harihara_K 好的兄弟,感谢回复和支持
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多