如何使用 React-Admin 在 List 组件内创建自定义记录操作按钮?

How to create a custom record action button inside a List component with React-Admin?

我是 React 和 React-Admin 的新手。恕我直言,我正在尝试实现许多人必须已经完成的简单操作,但我无法在任何地方找到任何类型的教程。

我想在 <List> 组件的每一行中的操作按钮列表 (show/edit) 中添加另一个按钮。此按钮将存档记录。

我最后一次尝试看起来像下面的代码。

import React from 'react';
import {
  Datagrid,
  EmailField,
  List,
  TextField,
  ShowButton,
  EditButton,
  DeleteButton,
  CloneButton,
} from 'react-admin';
import { makeStyles } from '@material-ui/core/styles';
import ArchiveIcon from '@material-ui/icons/Archive';

const useRowActionToolbarStyles = makeStyles({
    toolbar: {
        alignItems: 'center',
        float: 'right',
        width: '160px',
        marginTop: -1,
        marginBottom: -1,
    },
    icon_action_button: {
      minWidth: '40px;'
    },
});

const ArchiveButton = props => {
  const transform = data => ({
    ...data,
    archived: true
  });

  return <CloneButton {...props} transform={transform} />;
}


const RowActionToolbar = (props) => {
  const classes = useRowActionToolbarStyles();
  return (
      <div className={classes.toolbar}>
        <ShowButton label="" basePath={props.basePath} record={props.record} className={classes.icon_action_button}/>
        <EditButton label="" basePath={props.basePath} record={props.record} className={classes.icon_action_button}/>
        <ArchiveButton {...props} basePath={props.basePath} label="" icon={<ArchiveIcon/>} record={props.record} className={classes.icon_action_button} />
        <DeleteButton basePath={props.basePath} label="" record={props.record} className={classes.icon_action_button}/>
      </div>
  );
};

export const UserList = props => {
  return (
    <List
      {...props}
      sort={{ field: 'first_name', order: 'ASC' }}
    >
      <Datagrid>
        <TextField source="first_name"/>
        <TextField source="last_name"/>
        <EmailField source="email"/>
        <RowActionToolbar/>
      </Datagrid>
    </List>
  )
};

显然,此代码不起作用,因为 <CloneButton> 组件摆脱了 id 记录。此外,除非我做错了什么——这完全有可能——它会向 create 端点发出 GET 请求。 我在我的 dataProvider 中使用不同的路由(后端使用 Django 和 Django rest 框架)。我想将 PATCH 发送到详细信息端点,就像 <Edit> 组件所做的那样。

我也试过 <SaveButton>,但也失败了。

Uncaught TypeError: Cannot read property 'save' of undefined at useSaveContext (SaveContext.js:23)

我猜 <SaveButton> 一定在 <SimpleForm>?

之内

我想要 <DeleteButton> 的保存行为,即更新列表中的记录,显示记录已存档的通知(使用撤消 link),发送请求到后端,刷新列表。

任何指导,方向将不胜感激。

我不知道这是一个完整的答案,但感觉不仅仅是评论...

您正在尝试存档现有记录,而不是创建一个全新的记录,对吗? CloneButton 应该用于创建具有新 ID 的新记录(这就是您的 ID 消失的原因),因此您不想在这里使用它。 请注意,我从未使用过 CloneButton。它没有完整的文档记录,所以我对它的使用可能是错误的。

我认为您应该在存档按钮中使用 useRecordContext 挂钩来提取所有记录的数据,包括 ID;阅读这一小节:https://marmelab.com/react-admin/Architecture.html#context-pull-dont-push

而且我认为转换不是您要查找的内容。您将需要使用 dataProvider 挂钩之一,我假设 useUpdate: https://marmelab.com/react-admin/Actions.html#useupdate