在React v18中,使用Context可以优雅地实现列表的状态管理。可以创建一个Context来存储列表的数据和状态,然后在组件中使用该Context来获取和更新数据。

首先,创建一个Context并定义其初始值:

import { createContext, useState } from 'react';

export const ListContext = createContext();

const ListProvider = ({ children }) => {
  const [list, setList] = useState([]);
  const [itemStatus, setItemStatus] = useState({});

  const fetchList = async () => {
    // 使用fetch获取list数据
    const response = await fetch('api/list');
    const data = await response.json();
    setList(data);

    // 根据list数据去fetch每个list的状态
    const statusData = await Promise.all(data.map(item => fetch(`api/item/${item.id}`)));
    const statusJson = await Promise.all(statusData.map(response => response.json()));
    const statusMap = statusJson.reduce((map, status, index) => {
      map[data[index].id] = status;
      return map;
    }, {});
    setItemStatus(statusMap);
  };

  const addListItem = async (itemData) => {
    // 使用fetch添加新的list item
    const response = await fetch('api/list', {
      method: 'POST',
      body: JSON.stringify(itemData),
      headers: { 'Content-Type': 'application/json' }
    });
    const newItem = await response.json();
    setList([...list, newItem]);
  };

  const updateListItem = async (itemId, updatedData) => {
    // 使用fetch更新list item
    await fetch(`api/list/${itemId}`, {
      method: 'PUT',
      body: JSON.stringify(updatedData),
      headers: { 'Content-Type': 'application/json' }
    });
    setList(list.map(item => (item.id === itemId ? { ...item, ...updatedData } : item)));
  };

  const deleteListItem = async (itemId) => {
    // 使用fetch删除list item
    await fetch(`api/list/${itemId}`, {
      method: 'DELETE'
    });
    setList(list.filter(item => item.id !== itemId));
  };

  return (
    <ListContext.Provider
      value={{
        list,
        itemStatus,
        fetchList,
        addListItem,
        updateListItem,
        deleteListItem
      }}
    >
      {children}
    </ListContext.Provider>
  );
};

export default ListProvider;

然后,在应用的根组件中使用ListProvider提供列表数据和操作方法:

import React, { useEffect, useContext } from 'react';
import { ListContext } from './ListProvider';

const ListComponent = () => {
  const { list, itemStatus, fetchList } = useContext(ListContext);

  useEffect(() => {
    fetchList();
  }, []);

  return (
    <div>
      {list.map(item => (
        <ListItem
          key={item.id}
          item={item}
          status={itemStatus[item.id]}
        />
      ))}
    </div>
  );
};

const ListItem = ({ item, status }) => {
  const { updateListItem, deleteListItem } = useContext(ListContext);

  const handleUpdate = (updatedData) => {
    updateListItem(item.id, updatedData);
  };

  const handleDelete = () => {
    deleteListItem(item.id);
  };

  return (
    <div>
      <span>{item.name}</span>
      <span>{status}</span>
      <button onClick={() => handleUpdate({ name: 'Updated' })}>Update</button>
      <button onClick={handleDelete}>Delete</button>
    </div>
  );
};

const App = () => {
  return (
    <ListProvider>
      <ListComponent />
    </ListProvider>
  );
};

export default App;

在上面的示例中,使用ListProvider提供了list、itemStatus和相应的操作方法给ListContext。ListComponent使用useContext获取list和itemStatus,并通过fetchList方法在组件挂载时获取列表数据。在ListItem组件中,使用useContext获取updateListItem和deleteListItem方法,然后根据需要进行更新和删除操作。

这样,通过使用Context,可以实现对列表数据和状态的优雅管理,并在每个list item上实现CRUD操作

reactjs v18 有一个 List然后fetch 了 list 之后再根据 list 的结果去 fetch 每个 list 的状态然后再展示所有的 list每隔 listItem 都可以 crud如何优雅实现有必要使用useContext吗

原文地址: http://www.cveoy.top/t/topic/iTdn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录