【问题标题】:Use spread operator to combine multiple arrays fetching data in React JS使用扩展运算符组合多个数组在 React JS 中获取数据
【发布时间】:2021-02-22 01:29:35
【问题描述】:

我想在我的应用程序上实现类似无限滚动的功能。这是我的代码:

import React, { useState, useEffect } from "react";

import AsyncSelect from "react-select/async";

const WithPromises = () => {
  const [page, setPage] = useState(1);
  const [allData, setAllData] = useState([]); //here should be added all data
  const [scrolll, setScrolll] = useState();
  const filterData = (inputValue) => {
    const req = fetch(
      `https://jsonplaceholder.typicode.com/todos?_limit=15&_page=${page}`
    )
      .then((response) => response.json())
      .then((res) => {
        const fetchedData = res.map(({ title }) => {
          return {
            label: title,
            value: title
          };
        });
        page > 1 && setAllData([...allData, ...fetchedData]);
        return [...fetchedData, allData];
      });
    return req;
  };

  const promiseOptions = (inputValue) => {
    return filterData(inputValue);
  };

  const scroll = (e) => {
    console.log(e);
    setScrolll(e);
    promiseOptions();
  };

  useEffect(() => {
    setPage(page + 1);
  }, [scrolll, page]);

  return (
    <AsyncSelect
      cacheOptions
      onMenuScrollToBottom={scroll}
      isClearable={true}
      isSearchable={true}
      defaultOptions
      loadOptions={promiseOptions}
    />
  );
};

export default WithPromises;

你怎么看,当滚动部分位于底部时,我会增加页面:setPage(page + 1);。这个值是在 apihttps://jsonplaceholder.typicode.com/todos?_limit=15&amp;_page=${page} 中添加的。
我也想在这里连接每个滚动的所有数据:return [...fetchedData, allData]。最后我需要实现这样的目标: 用户向下滚动并在滚动部分添加新值,但以前的值不应消失,因此当滚动条位于底部时,每次滚动时都应在选择的底部添加新数据。
问题:我无法实现上述目标,我不知道问题所在。
问题:如何解决我的情况?
演示:https://codesandbox.io/s/codesandboxer-example-forked-zsj6i?file=/example.js:0-1262

【问题讨论】:

    标签: reactjs


    【解决方案1】:
    import React, { useState, useEffect } from "react";
    
    import AsyncSelect from "react-select/async";
    
    const WithPromises = () => {
      const [page, setPage] = useState(1);
      const [items, onItemsChange] = useState([]);
    
      useEffect(() => {
        fetchData(page);
      }, [page]);
    
      const fetchData = async (pageIdx) => {
        const res = await fetch(
          `https://jsonplaceholder.typicode.com/todos?_limit=15&_page=${pageIdx}`
        ).then((r) => r.json());
        const resItems = res.map(({ title }) => ({
          label: title,
          value: title
        }));
        onItemsChange([...items, ...resItems]);
      };
    
      const loadOptions = () => items;
    
      // for search functionality use something like this:
      // const loadOptions = async (inputStr) => {
      //   const searchRes = await fetch(`${yourUrl}?search=${inputStr}`).then(r => r.json());
      //   return searchRes;
      // };
    
      const handleBottomScroll = () => {
        setPage((prevVal) => prevVal + 1);
      };
    
      return (
        <AsyncSelect
          cacheOptions
          isClearable={true}
          isSearchable={true}
          defaultOptions={items}
          onMenuScrollToBottom={handleBottomScroll}
          loadOptions={loadOptions}
        />
      );
    };
    
    export default WithPromises;
    

    【讨论】:

    • 您的回答很棒。我有一个问题,如果我将在此实现search 功能,选项将根据搜索值更新? PS:我也想保持无限滚动
    • 要添加对“搜索”功能的支持,您需要更新loadOptions 方法。它应该使用搜索参数从 API 获取数据并返回。您不需要将其设置为状态,只需返回即可。
    • 根据 jsonplaceholder 文档,我可以通过 id 搜索项目,如下所示:https://jsonplaceholder.typicode.com/todos?_limit=15&amp;_page=${pageIdx}/${searchedId},但我更改了代码,但它不起作用。你可以看到更新的 sanbox
    • 现在您可以看到,如果我搜索,我不会在下拉列表中得到结果。你能看看为什么搜索不起作用吗?提前致谢。
    • 你怎么看这个问题?
    猜你喜欢
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2021-05-10
    • 2023-01-25
    • 2017-03-17
    • 2022-12-10
    相关资源
    最近更新 更多