我正在使用react-admin
(v3.2),并试图创建一个自定义过滤器组件。我的实体具有dateEnd
属性,我想根据dateEnd
是expired
还是not expired
来过滤数据。我设法获得了所有实体的列表:expired
和not expired
。
但是我不知道如何向用户显示此列表。是否可以通过某种方式在URL
中创建查询?
这是我的方法,它返回expired
和not expired
实体的列表:
handleChecked = () => {
if(this._mounted)
{
this.setState({ checked: !this.state.checked, currentDate: new Date()}, () =>
{
const currentDateFormated = this.state.currentDate.toISOString();
if (this.state.msgDates !== null)
{
if (this.state.checked === false)
{
const notExpired = this.state.msgDates.filter(msg => get(msg, ["publish", "dateEnd"], []) > currentDateFormated);
console.log(notExpired, 'NOTEXPIRED');
}
else
{
const expired = this.state.msgDates.filter(msg => get(msg, ["publish", "dateEnd"], []) < currentDateFormated);
console.log(expired, 'EXPIRED');
}
}
});
}
}
然后我在Filter
中初始化我的组件:
const MessageFilter = (props) => (
<Filter {...props}>
<TextInput source="_id" alwaysOn />
<TextInput source="layout.caption" alwaysOn />
<ExpiredFilter alwaysOn />
</Filter>
);
任何想法如何显示已过期或未过期实体的列表?
先谢谢您。
您打算过滤的任何内容都应包含在<List>
中。在您的情况下,您的Resource
/ endpoint
应该返回一个dateEnd
(到期或未到期)。两种设计模式可以在这里工作:
First,您可以使用
filterDefaultValues
属性。tl; dr使用默认查询(status
),切换expired
/not_expired
(可以使用Tabs
呈现)。
这将回答您的两个问题:
<List
{...props}
// Do you want your users to start by seeing "expired" or "not expired"?
// You can place it within `filterDefaultValues`
filterDefaultValues={{ status: 'not_expired' }}
sort={{ field: 'date_added', order: 'DESC' }}
perPage={10}
>{ Children }</List>
例如,获得children
组件以通过使用status
更新该Tabs
字段。那些Tabs
将更新您的state
,可以使用List
或status
将其传播到class methods
的Hooks
道具。
Second,您可以使用
filters
道具。有趣的是,这是您的初衷,但它挫败了您想要的。 tl; dr最初同时返回expired
和not expired
,并留给用户通过filters
查询。
[使用这种方法,通常会同时渲染List
和expired
的not expired
。然后提供filters
道具,以允许用户筛选他们想要看到的内容。
<List
{...props}
// So you'd place your `MessageFilter` within `filters`
filters={<MessageFilter />}
sort={{ field: 'date_added', order: 'DESC' }}
perPage={10}
>{ Children }</List>
即使在这里,您仍然要查询该数据,但没有默认值。因此,用户最初会看到一长串所有您的记录。
根据您的数据,第一种方法效果最好。但实际上,根据您的目的,两个props
实际上可以同时使用。