【问题标题】:How to render and add similar item to the list of items from the api in React.js?如何在 React.js 中的 api 中渲染和添加类似的项目到项目列表中?
【发布时间】:2021-01-13 11:57:51
【问题描述】:

我有一个名为 ListItem 的组件,它有 7 个字段(组件)忽略图表它只有 4 个,所有都是反应选择组件,它还有每个 ListItem 的保存和删除图标。我正在使用上下文,在那里我设置了 lists=[] ,在 useEffect 上我已经将列表设置为我从 api 获得的对象数组。我有一个组件 Lists,它使用 map 函数呈现这个 ListItem 组件。现在我想在第一个 ListItem 的前面添加另一个列表,我可以这样做并且在数据库中创建了一条记录。我已经实现了分页,并且在分页时,我将所有处于状态的列表项与从 api 返回的项一起添加,因为我添加的产品被插入到数据库中,所以在最后一页的 api 调用中,我也得到了我在顶部添加的数据,所以我看到两次相同的数据。 1)当我单击添加产品时 2)作为记录添加到数据库以来的最后一个 ListItem。处理这种场景的正确方法是什么。如果我无法理解,请忽略,因为这是我的第一个问题。

【问题讨论】:

    标签: javascript reactjs web react-context


    【解决方案1】:

    没有看到你的代码很难给出具体的建议,但我想我理解这个问题。您需要将添加的项目与从数据库中检索的项目分开。您还需要将任何 UI 状态与数据分开。

    就用户体验而言,我认为将他们刚刚添加的项目显示在顶部是很好的,即使它实际上并不属于该页面。我会采用不同的样式(可能是较暗的背景颜色)以表明这是一个添加的项目,而不是列表的真正元素。

    当他们导航到列表的不同页面时,不应再将添加的项目放在前面。他们只会在列表中的实际位置看到添加的项目,该位置可能在该页面上,也可能不在该页面上。

    这里有一些我将如何处理的伪代码。

    const List = () => {
      
      // store the current page (or possibly store it in the context)
      const [page, setPage] = useState(1);
    
      // some hook which accesses API data via context
      // should refresh the API fetch when the page changes
      const items = useListPage(page);
    
      // store items which were added while on this page
      const [addedItems, setAddedItems] = useState([]);
    
      // clear added items on page change
      useEffect(() => {
        setAddedItems([]);
      }, [page]);
    
      return (
        <div>
          <AddForm
            // AddForm component would handle the POST request
            // if successful, add that item to the List state via onSuccess callback
            onSuccess={(object) => setAddedItems([object, ...addedItems])}
          />
          {addedItems.map((item) => (
            <ListItem
              {...item}
              key={item.id}
              temporary={true} // some sort of flag to control styling
            />
          ))}
          {items.map((item) => (
            <ListItem
              {...item} 
              key={item.id} 
              temporary={false}
            />
          ))}
          <Pagination 
            page={page}
            setPage={page}
          />
        </div>
      );
    };
    
    

    【讨论】:

    • 感谢您的建议,但我还有另一个要求,即当我将鼠标悬停在每个项目的边缘时,我需要在单击按钮时添加项目,就像在 JIRA 软件中一样,我们可以在其中创建问题使用悬停的积压页面(完全相同)。
    • 我假设虚拟组件 AddForm(我还没有实现)会处理这个问题。该组件将具有状态属性,如 isClicked、字段、isPosting 等。您将首先呈现一个按钮。单击(或悬停)按钮会将 isClicked 设置为 true,并基于此隐藏按钮并显示一个表单,您可以在其中输入新项目的属性。您将提交表单并从服务器获得响应,然后通过我们提供给 AddForm 组件的 onSuccess 属性回调父 List 组件。
    • 关注点分离总是好的。在添加项目的部分和查看项目列表的部分之间需要进行的唯一通信是列表需要知道添加的项目才能显示。
    猜你喜欢
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2020-01-07
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    相关资源
    最近更新 更多