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

我想停止在反应钩子中渲染

司马高明
2023-03-14

它还在继续被渲染。我想阻止它。

由于这个问题,从Api接收到的照片和文本一直在随机变化。

我认为使用效果是问题所在。请让我知道,因为我是初学者。

这是useFetch.jsx

import { useState, useEffect } from "react";

function useFetch(url) {
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(true);
  async function fetchUrl() {
    const response = await fetch(url);
    const json = await response.json();
    setData(json);
    setLoading(false);
  }
  useEffect(() => {
    fetchUrl();
  });
  return [data, loading];
}
export default useFetch;

这是Main.jsx

import React from "react";
import styled from "styled-components";
import useFetch from "./useFetch";
import "./font.css";

const url = "https://www.thecocktaildb.com/api/json/v1/1/random.php";
const Main = () => {
  const [data, loading] = useFetch(url);
  return (
    <Wrapper>
      <Header>My Cocktail Recipe</Header>
      {loading ? (
        "Loading..."
      ) : (
        <>
          {data.drinks.map(
            ({ idDrink, strDrink, strAlcoholic, strGlass, strDrinkThumb }) => (
              <Container>
                <img src={`${strDrinkThumb}`} alt="" />
                <div key={`${idDrink}`}>{`${strDrink}`}</div>
              </Container>
            )
          )}
        </>
      )}
      <Search type="text" placeholder="검색하세요" val />
    </Wrapper>
  );
};
export default Main;

共有2个答案

元嘉木
2023-03-14
useEffect(() => {
    fetchUrl();
  }, []);
  return [data, loading];
}

添加数组谢谢Nick Parsons

相诚
2023-03-14

您必须更新useFetch.jsx:

import { useState, useEffect } from "react";

function useFetch(url) {
  const [data, setData] = useState([]);
  const [loading, setLoading] = useState(true);

  async function fetchUrl() {
    const response = await fetch(url);
    const json = await response.json();
    setData(json);
    setLoading(false);
  }

  useEffect(() => {
    fetchUrl();
  }, []); //<--- Here

  return [data, loading];
}
export default useFetch;
 类似资料:
  • 我无法理解为什么我的AppReact组件呈现两次,如下面的gif所示。 我插入了一个控制台。在返回组件之前记录日志,查看组件渲染的次数。 每当我移除useState钩子时,我的应用程序只会呈现一次我认为应该呈现的效果。任何关于为什么会发生这种情况的指导都是受欢迎的

  • 我通常使用getBoundingClientRect()。宽度当开发一个Swiper组件使用反应挂钩,但在一些例子getBoundingClientRect()。宽度返回0。 我在useEffect函数中使用了setTimeout,效果很好; 下面是简单的swiper代码演示: 简单swiper演示代码

  • 问题内容: 我怎么知道我的Vaadin 7 Web应用程序何时首次启动/启动,这样我才能进行一些初始设置? 同样,我怎么知道我的Web应用程序何时结束,关闭/退出? 问题答案: Vaadin建立在Java Servlet 技术之上。“上下文”是Servlet术语中Web应用程序的技术术语。因此,这里的答案不是特定于Vaadin的,它适用于任何Servlet- 归根结底,Vaadin只是一个大型Se

  • 我正在尝试使用react钩子创建一个悬停以显示div,我遇到了以下问题: 第69:31行:在函数“renderHideOptionalClauseTrigger”中调用React钩子“useState”,该函数既不是React函数组件,也不是自定义React钩子函数React钩子/钩子规则 搜索关键字以了解有关每个错误的更多信息。 以下是我的代码库:

  • 我有问题与使用useReucer与输入。我试图在这里使用受控输入,但我一直收到错误;受控输入是不受控制的 从“React”导入React,{useReducer,useffect}; 从“axios”导入axios; 常量初始状态={ }const reducer=(状态、操作)= }Const ReucerFetchdata = () = } 导出默认值

  • 据我所知,useState钩子的更新函数应该在批处理中运行,而不是在每次调用组件时重新呈现它。我创建了以下自定义挂钩: 但当我多次使用它时,每次发射都会导致重新渲染: 有没有办法优化这个?我是不是误解了什么?