Отображение элементов API по одному в зависимости от продолжительности проблемы

#javascript #reactjs

Вопрос:

ПОЖАЛУЙСТА, ПОМОГИТЕ! Моя проблема, с которой я сталкиваюсь, заключается в том, что у меня здесь есть два файла, один из которых выполняет вызов API и получает данные (названия должностей), и я отправляю это в другой файл, который использует setInterval для отображения по одному за раз. Когда я устанавливаю элементы в введенный массив следующим образом: [{ name: "Job One" }, { name: "Job Two" }, { name: "Job Three" } он работает так, как ожидалось, и отображается один за другим в зависимости от введенной продолжительности. Но когда я пытаюсь отправить массив фактических названий заданий из моего вызова API, все они появляются сразу (всего 50), а не по одному за раз. Может кто-нибудь сказать мне, что я здесь делаю не так?

Примеры данных API

   "data": [
    {
      "6": {
        "value": "2220 Three Kings "
      },
      "40": {
        "value": "In Progress"
      }
    },
    {
      "6": {
        "value": "529 Woodsview"
      },
      "40": {
        "value": "In Progress"
      }
    }
  ]
 

Вызов API

 import { Component, React } from "react";

let headers = {
  "QB-Realm-Hostname": "XXXXXXXXXXX.quickbase.com",
  "User-Agent": "FileService_Integration_V2.1",
  "Authorization": "QB-USER-TOKEN XXXX_XXXX_XXXXXXXXXXXX",
  "Content-Type": "application/json"
};

class Title extends Component {
    state = {
      data: null
    };
  
  componentDidMount() {
    this.fetchData();
  }

  fetchData = () => {
    let body = {
      from: "bpz99ram7",
      select: [3, 6],
      where: "{40.CT. 'In Progress'}",
      sortBy: [{ fieldId: 6, order: "ASC" }],
      groupBy: [{ fieldId: 40, grouping: "equal-values" }],
      options: { skip: 0, top: 0, compareWithAppLocalTime: false }
    };

    fetch("https://api.quickbase.com/v1/records/query", {
      method: "POST",
      headers: headers,
      body: JSON.stringify(body)
    })
      .then((response) => response.json())
      .then((data) => this.setState({ data }));
  };

  render() {
    const { data } = this.state;
    if (data === null) return "Loading Job Data...";

    return (
      <div className="Title">
        {Object.keys(data["data"]).map((item) => (
          <div key={item}>
            <div>{data["data"][item]["6"].value}</div>
          </div>
        ))}
      </div>
    );
  }
}

export default Title;
 

NOTE: I’m only pulling ID «6» which is the Job Name

App.js to render data, with setInterval

 import React from "react";
import "./styles.css";
import Title from "./components/TitleAPI";

const items = [
  <Title />
];

export default function App() {
  const [titleData, setTitleData] = React.useState(items[0]);
  const [index, setIndex] = React.useState(0);

  // Set Timer and Interval based on Index
  React.useEffect(() => {
    const timerId = setInterval(
      () => setIndex((i) => (i   1) % items.length),
      2000 // 2 seconds.
    );
    return () => clearInterval(timerId);
  }, []);

  // Set TitleData with Index
  React.useEffect(() => {
    setTitleData(items[index]);
  }, [index]);

  return (
    <div className="App">
      <h4>{titleData}</h4>
      {/* <Title /> */}
    </div>
  );
}
 

Current Result

 Job Name One
Job Name Two
Job Name Three
Job Name Four
Job Name ...Fifty
 

Expected Result

 import React from "react";
import "./styles.css";

const items = [{ name: "Job Name One" }, { name: "Job Name Two" }, { name: "Job Name Three" }, { name: "Job Name Four, etc..."}];

export default function App() {
  const [mediaItem, setMediaItem] = React.useState(items[0]);
  const [index, setIndex] = React.useState(0);

  React.useEffect(() => {
    const timerId = setInterval(
      () => setIndex((i) => (i   1) % items.length),
      2000
    );
    return () => clearInterval(timerId);
  }, []);

  React.useEffect(() => {
    setMediaItem(items[index]);
  }, [index]);

  return (
    <div className="App">
      <div>{mediaItem.name}</div>
    </div>
  );
}
 

Скопируйте и вставьте в песочницу кода (React) для демонстрации того, как я пытаюсь заставить каждое имя задания отображаться по одному (в настоящее время просто отображаются все).

Хотел отметить, что он появляется <Title /> как объект, когда я console.log(элементы.длина) it = 1, поэтому я не уверен, как преобразовать это в то, чтобы вместо того, чтобы отображать объект из нескольких элементов одновременно, переходить в виде массива, чтобы перебирать каждый из них за раз…