Как настроить компоненты поля на основе свойств записи

#react-admin

#реагировать-администратор

Вопрос:

В react-admin, как мне получить доступ к свойствам записи, чтобы отображать только определенные компоненты на основе значения свойства записи?

В следующем коде я хочу показывать токен-носитель только в том случае, если имя записи не «Все»; если имя записи «Все», то показывать только в том случае, если роль пользователя «администратор».

Я получаю «Uncaught TypeError: не удается прочитать свойство ‘name’ неопределенного» в компоненте OrgShow, показанном ниже, который, как я полагаю, говорит о том, что нет «реквизита». Я также пробовал использовать «запись» и «имя», но ни один из них не доступен.

 export const OrgShow = ({ permissions, ...props }) => (
  <Show permissions={permissions} title={<Title />} {...props}>
    <SimpleShowLayout permissions={permissions}>
      <TextField source="id" />
      <TextField source="name" />
      {
        (props.record.name === 'All' amp;amp; permissions === 'admin') || (props.record.name !== 'All' amp;amp; permissions === 'user')
          ? <TextField source="bearer_token" />
          : [
            <FunctionField label='Bearer Token' render={record => obfuscator(record.bearer_token)} />,
            <Alert severity="warning">You are not authorized for this org.</Alert>
          ]
      }
    </SimpleShowLayout>
  </Show>
);
 

Обновить:
В итоге я решил это с помощью компонента FunctionField, который, я думаю, похож на решение user striped; основное отличие заключается в том, что FunctionField, по-видимому, отлично подходит для одноразовой функции, тогда как создание нового компонента кажется целесообразным, если вы собираетесь использовать эту логику для более чем одного источника. В любом случае, вот решение, которое я придумал:

 export const OrgShow = ({ permissions, ...props }) => (
  <Show permissions={permissions} title={<Title />} {...props}>
    <SimpleShowLayout permissions={permissions}>
      <TextField source="id" />
      <TextField source="name" />
      <FunctionField permissions={permissions} label='Bearer Token' render={record => {
        if ((record.name === 'All' amp;amp; permissions === 'admin') || record.name !== 'All') {
          return record.bearer_token
        } else {
          return obfuscator(record.bearer_token)
        }
      }} />
    </SimpleShowLayout>
  </Show>
);
 

Комментарии:

1. Вы также можете использовать компонент <FormDataConsumer>: marmelab.com/react-admin/Inputs.html#linking-two-inputs

Ответ №1:

Я думаю, что вам нужно создать определенный компонент. Запись должна автоматически распространяться на дочерний элемент:

 const MyComponent = (props) => {
  return (props.record.name === 'All' amp;amp; props.permissions === 'admin') || (props.record.name !== 'All' amp;amp; props.permissions === 'user')
    ? <TextField source="bearer_token" record={props.record}/>
    : [
      <FunctionField label='Bearer Token' record={props.record} render={record => obfuscator(record.bearer_token)} />,
      <Alert severity="warning">You are not authorized for this org.</Alert>
    ]
}

export const OrgShow = ({ permissions, ...props }) => (
  <Show permissions={permissions} title={<Title />} {...props}>
    <SimpleShowLayout permissions={permissions}>
      <TextField source="id" />
      <TextField source="name" />
      <MyComponent permission={permissions} />
    </SimpleShowLayout>
  </Show>
);