Reactjs 如何在react admin自定义批量操作按钮中取消选择列表项
我有一个react admin项目,并为传递到Reactjs 如何在react admin自定义批量操作按钮中取消选择列表项,reactjs,material-ui,react-admin,Reactjs,Material Ui,React Admin,我有一个react admin项目,并为传递到bulkActionButtons属性的列表视图实现了一个自定义按钮,如以下文档所述: 每次单击复选框时设置一些元数据,以便将true或false注入数组,如: listData = { ... isChecked : true } 然后在处理批量操作的函数中,添加一个[listData].filter(),(lodash filter更快),以检查并查看哪个isChecked===true,然后将它们设置为false,并更新check
bulkActionButtons
属性的列表视图实现了一个自定义按钮,如以下文档所述:
每次单击复选框时设置一些元数据,以便将true或false注入数组,如:
listData = {
...
isChecked : true
}
然后在处理批量操作的函数中,添加一个
[listData].filter()
,(lodash filter更快),以检查并查看哪个isChecked===true
,然后将它们设置为false,并更新checkbox输入标记上的value={bool}
属性 解决方案是从react admin调用批量助手函数:
class MakeAdminButton extends React.Component {
handleAction = () => {
const { basePath, crudUpdateMany, resource, selectedIds } = this.props;
//custom code goes in here...
//calling this function triggers the unset and closes the toolbar
crudUpdateMany(resource, selectedIds, { isAdmin: true }, basePath);
};
render () {
return <Button label="Make Admin" onClick={this.handleAction}>
<AdminIcon/>
</Button>;
}
};
const BulkUserActions = connect(undefined, { crudUpdateMany })(MakeAdminButton);
const UserList = props => (
<List {...props} bulkActionButtons={<BulkUserActions/>}>
<Datagrid>
<TextField source="id"/>
<EmailField source="email"/>
<BooleanField source="isAdmin" label="Admin" />
</Datagrid>
</List>
);
类MakeAdminButton扩展React.Component{
手工过滤=()=>{
const{basePath,crudUpdateMany,resource,selectedIds}=this.props;
//自定义代码放在这里。。。
//调用此函数将触发取消设置并关闭工具栏
crudUpdateMany(资源,selectedId,{isAdmin:true},basePath);
};
渲染(){
返回
React Admin提供了执行此操作的方法。在v3上,直接使用useUnselectAll或在useMutation、useUpdateMany和useDataProvider钩子的onSuccess回调上。在v2上,使用dataProvider的第四个参数withDataProvider decorator或将meta.onSuccess.unselectAll设置为true以执行自定义redux操作,或自动使用crudUpdateMany或options突变成分的性质
对于带有crudUpdateMany的v2,goto
Mike Miller回答
工作实例:
v3:
V2示例也适用于v3,但由于v3上的dataProvider api发生了变化,所以在直接使用dataProvider时只做了一点小小的更改,而Variation和withDataProvider是遗留的
v2:
withDataProvider:
const UnmakeAdminButtonWithWithDataProvider = withDataProvider(
class extends React.Component {
handleClick = () => {
this.props.dataProvider(
UPDATE_MANY,
"users",
{ ids: this.props.selectedIds, data: { isAdmin: false } },
{ onSuccess: { unselectAll: true, refresh: true } }
);
};
render() {
return (
<Button onClick={this.handleClick}>
Unmake Admin with withDataProvider
</Button>
);
}
}
);
const unmakeAdminButtonWithDataProvider=withDataProvider(
类扩展了React.Component{
handleClick=()=>{
this.props.dataProvider(
更新了很多,
“用户”,
{ids:this.props.selectedIds,数据:{isAdmin:false},
{onSuccess:{unselectAll:true,refresh:true}
);
};
render(){
返回(
使用withDataProvider取消管理
);
}
}
);
自定义重复操作:
import { connect } from 'react-redux';
const MAKE_ADMIN = "MAKE_ADMIN";
const makeAdmin = ids => ({
type: MAKE_ADMIN,
payload: { ids, data: { isAdmin: true } },
meta: {
fetch: UPDATE_MANY,
resource: "users",
onSuccess: { unselectAll: true, refresh: true }
}
});
const MakeAdminButtonWithCustomAction = connect(
null,
{ makeAdmin }
)(
class extends React.Component {
handleClick = () => {
this.props.makeAdmin(this.props.selectedIds);
};
render() {
return (
<Button onClick={this.handleClick}>
Make Admin With Custom Redux Action
</Button>
);
}
}
);
从'react redux'导入{connect};
const MAKE_ADMIN=“MAKE_ADMIN”;
const makeAdmin=ids=>({
类型:MAKE_ADMIN,
有效负载:{id,数据:{isAdmin:true}},
元:{
获取:更新\u许多,
资源:“用户”,
onSuccess:{unselectAll:true,refresh:true}
}
});
const MakeAdminButtonWithCustomAction=connect(
无效的
{makeAdmin}
)(
类扩展了React.Component{
handleClick=()=>{
this.props.makeAdmin(this.props.selectedIds);
};
render(){
返回(
使用自定义Redux操作进行管理
);
}
}
);
突变成分:
const MakeAdminMutationV2 = props => (
<Mutation
type="updateMany" //{UPDATE_MANY}
resource={props.resource}
payload={{ ids: props.selectedIds, data: { isAdmin: true } }}
options={{
onSuccess: {
unselectAll: true,
refresh: true
}
}}
>
{approve => <Button onClick={approve}>Make admin with Mutation</Button>}
</Mutation>
);
const MakeAdminMutationV2=props=>(
{approve=>Make admin with Mutation}
);
谢谢Joe,但在react admin中,我不负责设置选中的数组,这是由该组件处理的。自定义操作接收选定的EDID数组,但无权取消设置。我正在查看react admin List.bulkActionButtons的API。我发现了这一点,需要调用帮助函数crudUpdateMany
执行更新。这会触发对redux存储的更改并取消程序。抱歉,但愿我能帮上忙……我至少给了它上大学的机会。感谢你的帮助-比我从react管理员那里得到的帮助要多。如果你找到了,请小心,我会在这里为你留心的。
const MakeAdminButtonV3 = props => {
const refresh = useRefresh();
const unselectAll = useUnselectAll();
const [makeAdmin, { loading }] = useUpdateMany(
props.resource,
props.selectedIds,
{ isAdmin: true },
{
onSuccess: () => {
unselectAll(props.resource);
refresh();
}
}
);
//OR
const dataProvider = useDataProvider();
const makeAdmin2 = () => {
dataProvider.updateMany(
props.resource,
{ ids: props.selectedIds, data: { isAdmin: true } },
{
onSuccess: () => {
unselectAll(props.resource);
refresh();
}
}
);
};
//OR
const [makeAdmin3, { loading3 }] = useMutation(
{
type: "updateMany",
resource: props.resource,
payload: { ids: props.selectedIds, data: { isAdmin: true } }
},
{
onSuccess: () => {
unselectAll(props.resource);
refresh();
}
}
);
return (
<Button onClick={makeAdmin3} disabled={loading3}>
Make Admin with V3 dataProvider hooks
</Button>
);
};
const UnmakeAdminButtonWithWithDataProvider = withDataProvider(
class extends React.Component {
handleClick = () => {
this.props.dataProvider(
UPDATE_MANY,
"users",
{ ids: this.props.selectedIds, data: { isAdmin: false } },
{ onSuccess: { unselectAll: true, refresh: true } }
);
};
render() {
return (
<Button onClick={this.handleClick}>
Unmake Admin with withDataProvider
</Button>
);
}
}
);
import { connect } from 'react-redux';
const MAKE_ADMIN = "MAKE_ADMIN";
const makeAdmin = ids => ({
type: MAKE_ADMIN,
payload: { ids, data: { isAdmin: true } },
meta: {
fetch: UPDATE_MANY,
resource: "users",
onSuccess: { unselectAll: true, refresh: true }
}
});
const MakeAdminButtonWithCustomAction = connect(
null,
{ makeAdmin }
)(
class extends React.Component {
handleClick = () => {
this.props.makeAdmin(this.props.selectedIds);
};
render() {
return (
<Button onClick={this.handleClick}>
Make Admin With Custom Redux Action
</Button>
);
}
}
);
const MakeAdminMutationV2 = props => (
<Mutation
type="updateMany" //{UPDATE_MANY}
resource={props.resource}
payload={{ ids: props.selectedIds, data: { isAdmin: true } }}
options={{
onSuccess: {
unselectAll: true,
refresh: true
}
}}
>
{approve => <Button onClick={approve}>Make admin with Mutation</Button>}
</Mutation>
);