Учитывая, что <ForwardPropsWrapper label="User / Role">
предназначен для создания кода DRYer, проблема в том, что он затрагивает только своих собственных потомков.Если есть вложенные или другие элементы, которые не имеют общего прямого родителя, они останутся WET.
В зависимости от случая можно записать как:
const commonProps = { label: 'User / Role' };
...
<Foo {...commonProps} foo={'bar'} />
<Foo {...commonProps} foo={'baz'} />
или какHOC:
const withLabel = (Comp, label) => props => <Comp {...props} label={label}/>
const FooWithUserRoleLabel = withLabel(Foo, 'User / Role');
...
<FooWithUserRoleLabel foo={'bar'} />
<FooWithUserRoleLabel foo={'baz'} />
Или просто оставьте WET, потому что общий атрибут label="User / Role"
не делает код труднее для чтения или более громоздким, чем другие решения.
Что касается ConditionalWrapper
,уже существует троичная оценка и оценка короткого замыкания, используйте их, где это возможно:
{ condition && <Foo /> }
{ condition ? (
<Bar />
) : (
<Baz />
)}
Фактическая проблема здесь заключается в том, что рецепт, который Datagrid
использует для предоставления данных детям, является негибким, пересекающим детей и предоставляющимих с дополнительными опорами.Это делает громоздкие обертки необходимыми в случае обработки реквизита.
Более гибкий и обычно используемый шаблон для достижения той же цели - render prop , или, более конкретно, его особый случай, , выполняющий функцию потомка.Можно использовать оболочку для Datagrid
, чтобы использовать вместо исходного компонента:
const DatagridWrapper = (children, ...props) => {
const render = React.Children.only(children);
const Body = props => render(props);
return <Datagrid {...props}><Body/></Datagrid>;
};
Все данные сетки принимаются в обратном вызове, который может обрабатываться любым способом и возвращать элементы для визуализации.
<DatagridWrapper rowClick="edit">
{gridData => <>
{gridData.record.RoleId && (
<ReferenceField label="User / Role" source="RoleId" reference="role">
<TextField source="name" />
</ReferenceField>
...
</>}
</DatagridWrapper>