我正在使用React和websocket编写一个实时应用程序,有一个问题,我从websocket获取数据,这里没有问题,但是当它滚动时,我写了下面的代码来获取更多代码,它工作了,但这一次它一遍又一遍地呈现相同的数据,即使db中有10个数据.这是什么原因?([... J. prev] struct ,我在字符串中组合了新数据和旧数据,如果我删除它,问题继续不变,如果我删除它,我的意思是只给post变量,这次它不添加旧数据,并完全呈现页面.我用dotnet websocket signalr写背景.

import React, { useEffect, useState, useRef } from "react";
import { PostLayout } from "../Components/PostLayout";
import { Post } from "../Components/Post";
import { Loading } from "../Components/Loading";
import { HubConnectionBuilder, HttpTransportType } from "@microsoft/signalr";

export const Home = () => {
  const [post, setPost] = useState([]);
  const page = useRef(0);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    const connection = new HubConnectionBuilder()
      .withUrl("http://localhost:5226/posts", {
        transport: HttpTransportType.WebSockets,
      })
      .build();
    const loader = () => {
      connection.on("ReceivePosts", (post) => {
        setPost((prevPosts) => [...prevPosts, ...post]);
        setLoading(false);
      });

      connection.on("SendPost", (post) => {
        setPost((prev) => [...prev, ...post]);
        setLoading(false);
      });

      connection
        .start()
        .then(() => {
          connection.invoke("GetPosts", page.current, 5).then((res) => {
            console.log(res);
          });
        })
        .catch((err) => console.log("Error: ", err.toString()));
    };
    loader();
    const handleScroll = () => {
      if (window.innerHeight + window.scrollY >= document.body.offsetHeight && !loading) {
          page.current += 1;
          connection.invoke("GetPosts", page.current, 3)
              .then((res) => {
                  console.log(res);
                  setLoading(false);
              })
              .catch((err) => {
                  console.log("Error: ", err.toString());
                  setLoading(false);
              });
      }
    };
    window.addEventListener("scroll", handleScroll);
    return () => {
      window.removeEventListener("scroll", handleScroll);
    };
  }, [loading]);

  return (
    <>
      <div className={"grid columns-10 justify-center row-auto gap-8 top-5"}>
        <div className={"w-full "}>
          <PostLayout>
            <div className={"w-full flex flex-col gap-8 "}>
              {loading ? (
                <div className="relative top-32">
                  <Loading />
                </div>
              ) : (
                post.map((prop, index) => {
                  return (
                    <Post
                      key={index}
                      author={prop.author}
                      text={prop.content}
                      url={prop.url}
                      image={prop.image}
                    />
                  );
                })
              )}
            </div>
          </PostLayout>
        </div>
      </div>
    </>
  );
};

推荐答案

我不熟悉@microsoft/signalr库,但我的猜测是,滚动会导致调用GetPosts并通过ReceivePosts收集数据并将其添加到状态的无休止循环.

准确地说,您的handleScroll个函数调用connection.invoke("GetPosts", page.current, 3),(我假设)您的connection.on("ReceivePosts")侦听器将一遍遍一遍地从DB接收相同的post,并将它们添加到状态中.

Typescript相关问答推荐

在角形加载组件之前无法获取最新令牌

在Switch陈述中输入保护类

Angular 17 Select 错误core.mjs:6531错误错误:NG 05105:发现意外合成监听器@transformPanel.done

JS Redux Devtools扩展不工作

基于平台的重定向,Angular 为16

如何通过TypeScript中的工厂函数将区分的联合映射到具体的类型(如类)?

如何键入函数以只接受映射到其他一些特定类型的参数类型?

TypeScrip界面属性依赖于以前的属性-针对多种可能情况的简明解决方案

限制返回联合的TS函数的返回类型

如何创建由空格连接的多个字符串的类型

S,为什么我的T扩展未定义的条件在属性的上下文中不起作用?

TypeScrip-如何自动推断UNION变量的类型

作为函数参数的联合类型的键

具有匹配功能的TS通用事件处理程序

TypeScrip:使用Cypress测试包含插槽的Vue3组件

顶点堆叠的图表条形图未在正确的x轴上显示

埃斯林特警告危险使用&as";

Typescript泛型调用对象';s方法

换行TypeScript';s具有泛型类型的推断数据类型

元素隐式具有any类型,因为string类型的表达式不能用于索引类型{Categories: Element;管理员:元素; }'