我有一个在其他组件中重用的组件,但有一个问题是,处理操作事件的代码(例如:onDelete)重复了太多次.我必须处理onDelete在所有使用明信片的地方,即使逻辑代码没有什么不同,除了在主页.那么,有什么方法可以避免HandleDelete的重复吗?尊重任何 idea .我是React.js的新手,希望你们能帮助我!

明信片组件:

 function PostCard ({ item, onDelete }) => {
    return (
      <div onClick={() => onDelete(item.id)}>{item.title}</div>
    )
 }

主页中使用的明信片:

 const HomePage = () => {

   function handleDelete() {
      // only mutate array to re-render list (not redirect)
   }

   return (
      <>
        {postList.map(post => (
           <PostCard item={post} onDelete={handleDelete} />
        ))}
      </>
   )
  
 }

在详细页面中使用的明信片:

 const DetailPage = () => {
   function handleDelete() {
      // redirect to home page after delete
   }

   return (        
      <PostCard item={post} onDelete={handleDelete} />
   )
  
 }

另一页使用的明信片:

 const AnotherPage = () => {
   function handleDelete() {
      // redirect to home page after delete
   }

   return (        
      <PostCard item={post} onDelete={handleDelete} />
   )
  
 }

推荐答案

您可以在比这些组件更高的级别上创建上下文,以便可以将postList状态和handleDelete函数作为上下文传递给它们,例如:

const App = () => {
  export const PostContext = createContext();
  const [postList, setPostList] = useState([]);
  const handleDelete = (postId) => {
    // delete logic
  };
//...
  return (
    <PostContext.Provider value={{ postList, handleDelete }}>
      //..
    </PostContext.Provider>
  );
};

从您的组件中:

const PostCard = ({ item }) => {
  const { handleDelete } = useContext(PostContext); // you have to import it from App
  return (
    <div onClick={() => handleDelete(item.id)}>{item.title}</div>
  );
};

当它是您要从中导航的组件时,只需添加重定向代码:

onClick={() => {
 handleDelete(item.id)
 // navigation
}}

了解更多关于useContexthere

Javascript相关问答推荐

如何将剧作家请求对象转换为字符串,因为它只提供promise ?

如何将特定的字符串类型转换为TypScript中的字符串?

在JavaScript中逐一播放随机生成的音频文件数组

React:如何将表格收件箱正确渲染为表格主体内的组件?

如何在dataTables PDF输出中正确渲染字形?

我的YouTube视频没有以html形式显示,以获取免费加密信号

使用CDO时如何将Vue组件存储在html之外?

函数返回与输入对象具有相同键的对象

Mongoose post hook在使用await保存时不返回Postman响应

如何根据当前打开的BottomTab Screeb动态加载React组件?

JSDoc创建并从另一个文件导入类型

从包含数百行的表中获取更改后的值(以表单形式发送到后端)的正确方法是什么?

Next.js服务器端组件请求,如何发送我的cookie token?

Angular 形式,从DOM中删除不会删除指定索引处的内容,但会删除最后一项

触发异步函数后不能显示数据

AddEventListner,按键事件不工作

FileReader()不能处理Firefox和GiB文件

Next.js无法从外部本地主机获取图像

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色

如果我的列有条件,我如何呈现图标?