【问题标题】:useEffect not working with multiple dropdowns in Semantic UI ReactuseEffect 不适用于 Semantic UI React 中的多个下拉菜单
【发布时间】:2020-06-09 17:30:05
【问题描述】:

我正在使用语义 UI React。 以下 JS 代码对我不起作用:

import React, { useState, useEffect } from "react";
import { Dropdown, Form, Button } from "semantic-ui-react";

export const MovieDropdown = () => {
  const [movie, setMovie] = useState("");
  const [person, setPerson] = useState("");
  const [movieOptions, setMovieOptions] = useState([]);
  const [personOptions, setPersonOptions] = useState([]);

  useEffect(() => {
    Promise.all([
      fetch("/people").then(res =>
        res.json()
      ),
      fetch("/movies").then(res =>
        res.json()
      )
    ])
      .then(([res1, res2]) => {
        console.log(res1, res2);
        var make_dd = (rec) => {
            rec.map(x => {
              return {'key': x.name, 'text': x.name, 'value': x.name}
            })
        }
        setPersonOptions(make_dd(res1))
        setMovieOptions(make_dd(res2))

      })
      .catch(err => {
        console.log(err);
      });
  });

  return (
    <Form>
      <Form.Field>
        <Dropdown
          placeholder="Select Movie"
          search
          selection
          options={movieOptions}
          onChange={(e, {value}) => setMovie(value)}
        />
      </Form.Field>
      <Form.Field>
        <Dropdown
          placeholder="Select Person"
          search
          selection
          options={personOptions}
          onChange={(e, {value}) => setPerson(value)}
        />
      </Form.Field>

    </Form>
  );
};
export default MovieDropdown;

问题是我在运行此组件时丢失了数据库连接。我尝试使用 MySQL 和 SQLite,它给出了同样的问题。 如何解决这个问题?我应该对每个组件进行 1 次提取吗? 提前谢谢你。

亲切的问候, 西奥

【问题讨论】:

  • useEffect 可能缺少作为第二个参数的依赖数组 - 现在它在每次组件呈现时都在运行,这意味着它只是不断发送请求。
  • 虽然这会导致数据库连接失败,但您可能需要使用您正在使用的任何数据库库查看连接池。

标签: javascript reactjs semantic-ui-react


【解决方案1】:

好吧,我不知道DB Connetion,但是在useEffect中调用api的推荐方式是这样的:

useEffect({
 // your code here only once
},[])

或者,

useEffect({
 // your code here will run whenever id changes
},[id])

您的 useEffect 将在每次渲染时运行,不推荐使用这种时间/方式进行 api 调用。

【讨论】:

  • 如何解决双重提取问题?
  • 我想你是在问如何知道你的 useEffect 是否被调用了两次。只需在 useEffect 函数中编写 console.log("API CALLED") 即可。此字符串将在您的控制台中打印两次。要检查控制台,请右键单击浏览器中的任意位置 -> 检查元素 -> 控制台选项卡。或者按 F12 或 CTRL+SHIFT+I 如果我误解了您的问题,请告诉我。
  • 您还可以在“网络”选项卡中检查您的 API 是否被调用。但要看到这一点,首先打开开发工具(检查元素),然后进行 api 调用或刷新页面。
  • 不,我需要对我的 REST API 运行 2 个查询。
  • 最初运行 2 个 api,使用 Promise.all() 是正确的。像这样写: Promise.all([ fetch("/people"), fetch("/movies") ]).then(response => { // 你的代码在这里 )
猜你喜欢
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 2018-05-09
相关资源
最近更新 更多