reactjs v18 有一个 List然后fetch 了 list 之后再根据 list 的结果去 fetch 每个 list 的状态然后再展示所有的 list每隔 listItem 都可以 crud如何优雅实现有必要使用useContext吗
在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操作
原文地址: http://www.cveoy.top/t/topic/iTdn 著作权归作者所有。请勿转载和采集!