我仍然是使用ReactJS的初学者,我不理解我遇到的问题.

我的useEffect是一个数据列表,然后我做filter.

但是当我保存这个过滤器的数据值时,我try 用console.log()来查看我的过滤器的返回值,有一个无限循环的数据被加载,我不明白为什么会发生这种情况.

有人能帮我吗?

这是我的代码,更容易理解我的意思:

我把我的密码输入codesandbox

print of console.log()

import React, { useRef } from "react";
import { Map, TileLayer } from "react-leaflet";

import { getAccommodations } from "./data";

import "./styles.css";

const App = () => {
  const center = [-27.592495455704718, -48.484572875610034];

  const mapRef = useRef();
  const [thing, setThing] = React.useState(0);
  const [accommodationData, setAccommodationData] = React.useState([]);

  React.useEffect(() => {
    if (mapRef.current) {
      const response = getAccommodations();

      const _response = response.filter((accommodation) => {
        return mapRef.current.leafletElement
          .getBounds()
          .contains([accommodation.listing.lat, accommodation.listing.lng]);
      });

      setAccommodationData(_response);
    }
  }, [center, thing, accommodationData]);

  // I commented this line to avoid too many re-renders
  // console.log("accommodationData: ", accommodationData);

  return (
    <Map
      ref={mapRef}
      style={{ width: "100%", height: "100vh" }}
      center={center}
      zoom={13}
      onmoveend={() => {
        setThing(thing + 1);
      }}
    >
      <TileLayer
        url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
        attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
      />
      {/* I'll add some <Markers> here with the accommodationData array */}
    </Map>
  );
};

export default App;

非常感谢

推荐答案

useEffect钩子保留触发器,因为您正在更改状态accommodationData,它是useEffect的依赖项之一.因此,您只需将其从依赖项中删除,或添加另一个状态response,然后在有response时更改accommodationData,例如:

  const center = [-27.592495455704718, -48.484572875610034];

  const mapRef = useRef();
  const [thing, setThing] = React.useState(0);
  const [accommodationData, setAccommodationData] = React.useState([]);
  const [response, setResponse] = React.useState(null);

  React.useEffect(() => {
    if (mapRef.current && !response) {
      const response = getAccommodations();

      const _response = response.filter((accommodation) => {
        return mapRef.current.leafletElement
          .getBounds()
          .contains([accommodation.listing.lat, accommodation.listing.lng]);
      });

      setResponse(_response);
    }
  }, [center, thing, accommodationData]);
  
  React.useEffect(() => {
    if (response) setAccommodationData(_response);
  }, [response]);
  

Javascript相关问答推荐

我无法在NightWatch.js测试中获取完整的Chrome浏览器控制台日志(log)

如何避免移动设备中出现虚假调整大小事件?

使用复选框在d3.js多折线图中添加或删除线条

成功完成Reducers后不更新状态

无法访问Vue 3深度监视器中对象数组的特定对象值'

在286之后恢复轮询

如何解决useState错误—setSelect Image不是函数''

Chart.js-显示值应该在其中的引用区域

JavaScript是否有多个`unfined`?

在开发期间,Web浏览器如何运行&qot;.jsx&qot;文件?

Clip-Path在网页浏览器(Mozilla、Edge、Chrome)上不能正常工作,但在预览版Visual Code Studio HTML、CSS、JS上却能很好地工作

在Java脚本中构建接口的对象

rxjs在每次迭代后更新数组的可观察值

JavaScript:多个图像错误处理程序

如何检测当前是否没有按下键盘上的键?

由于http.get,*ngIf的延迟很大

Reaction路由v6.4+数据API:重试加载程序而不显示错误

调试jQuery代码以获取所有行的总和(票证类型)

webpack 5和mini-css-extract-plugin在将scss保存到css文件后不加载css

如何使用属性访问器定义循环的for...的局部变量