【问题标题】:How to stop useEffect from reloading my page every time?如何阻止 useEffect 每次都重新加载我的页面?
【发布时间】:2020-12-19 17:36:30
【问题描述】:

由于某种原因,我的整个页面在每次从数据库获取状态后更新状态时都会重新加载。页面闪烁,我最终到达页面顶部。这是为什么呢?

我在 sort() 等其他函数中更新整个状态,无需重新加载即可完美运行。我已经将 event.preventDefault() 放在每个点击处理程序中,所以这不应该是问题。

使用 React 的一大好处是无需重新加载即可获得流畅的 UI,因此这很烦人。

function App() {
  const [contacts, setContacts] = useState({ items: [] });

  useEffect(() => {
    axios
      .get('http://localhost:5000/')
      .then((result) => {       
        setContacts({ items: result.data });
      })
      .catch((err) => console.log(err));
  }, []);

这是被调用的函数:

const handleSubmit = (event) => {
    event.preventDefault();

    if (!id) {
      axios
        .post('http://localhost:5000/add/', input)
        .then(() => {
          setInput(emptyState);
        })
        .catch((err) => console.log(err));
    } else {
      axios
        .post(`http://localhost:5000/update/${id}`, input)
        .then(() => {
          props.updateContact(input);
          setInput(emptyState);
        })
        .catch((err) => console.log(err));
    }
    window.location = '/';
  };

【问题讨论】:

  • 您应该创建一个最小的可重现示例(最好在 codesandbox 上)
  • 我不认为您遇到的问题是由于提供的代码造成的。

标签: reactjs axios use-effect use-state


【解决方案1】:

您需要在 [] 中添加一些内容。 您可以看到我们在第二个参数中将 props.name 传递到了数组中。现在,当名称更改时,这将导致效果始终再次运行。 如果你不传递任何东西,它会一直更新并且毫无用处。

  useEffect(() => {
    document.title = `Page of ${props.name}`
  }, [props.name])

【讨论】:

  • 如果我将 contacts 放在 [] 中,我会创建一个无限循环,不断从数据库中获取数据。如果我使用 axios 而没有 useEffect 我会再次创建无限循环,因此 useEffect 非常重要。您建议我在 [] 中添加什么?
  • 这就是逻辑……如果您在使用效果中添加接触和更改接触,它将是无限的。找到你可以放入的东西,然后它会获取你的数据。
  • “它会一直更新,而且毫无用处”——这不是真的。空数组作为依赖参数将导致效果仅在组件挂载时运行一次。这绝对不是没用的,而且很多时候都是有意的。
  • 没有谈到空数组,而是一个内部有联系人的数组...
猜你喜欢
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 2019-07-13
  • 1970-01-01
  • 2015-08-28
  • 2014-02-05
  • 1970-01-01
相关资源
最近更新 更多