React-admin Массив ввода с массивом строк / чисел

https://marmelab.com/react-admin/Inputs.html#arrayinput Примеры охватывают случаи, когда у вас есть массив объектов:

  backlinks: [
        {
            date: '2012-08-10T00:00:00.000Z',
            url: 'http://example.com/foo/bar.html',
        },
        {
            date: '2012-08-14T00:00:00.000Z',
            url: 'https://blog.johndoe.com/2012/08/12/foobar.html',
        }
   ]

возможно ли заставить его работать только с массивом строк?

backlinks: ['a', 'b', 'c']

Вы пробовали и получили ошибку?

Tholle 22.07.2018 23:08

Да. Дело в том, что я не знаю, что поместить во внутренние поля атрибута «источник». С объектом его <TextField source = "url"/>

yBrodsky 23.07.2018 00:42

Возможно, вам потребуется создать альтернативный ArrayInput. Начните с копии и внесите изменения. Внимательно посмотрите на источник. github.com/marmelab/react-admin/blob/master/packages/… Также обратите внимание на то, что используется массив FieldArray redux.

Christiaan Westerbeek 23.07.2018 12:37

хорошо, я посмотрю туда

yBrodsky 23.07.2018 14:51

@yBrodsky ты что-нибудь придумал? Вы не против поделиться? Я ищу то же самое, у меня есть простой плоский массив писем (строк), который я хочу красиво редактировать, добавлять или удалять. Ваше здоровье!

Vojta Hejda 25.07.2018 12:31

@VojtaHejda нет, я с треском провалился. Пытался создать свой собственный компонент (с блэкджеком и проститутками), используя redux-form, но не смог. У меня нет большого опыта во всем, что касается реакции. Итак, я закончил тем, что использовал marmelab.com/react-admin/Inputs.html#referencearrayinput. Работает нормально и делает то, что задумал, с бонусом, который показывает вам связанные данные модели.

yBrodsky 25.07.2018 15:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
18
6
9 465
3

Ответы 3

Я смог выполнить вариант ввода, в отличие от варианта полей, просто не предоставив атрибут источника для внутреннего TextField и выбрав источник массива в фактическом ArrayField. Тогда, конечно, просто используйте SimpleFormIterator. Очевидно, что React отдает предпочтение использованию ключей, по большей части рассматривая типы массивов как карты.

<ArrayInput source = "my-source">
  <SimpleFormIterator>
    <TextInput />
  </SimpleFormIterator>
</ArrayInput>

Я пытался использовать это решение, но получаю сообщение об ошибке типа «Неудачный тип опоры: недопустимая опора value передана в TextField».

Aswathy Balan 15.02.2019 08:05

@Aswathy - ты решил это? Я получаю еще одну ошибку: Error: Cannot set a numeric property on an object, хотя мой массив содержит URL-адреса, такие как "picsum.photos/800"

Hola 06.06.2020 12:19

@AswathyBalan @Hola Использовать пустую строку для исходного <TextInput source = "" />

Penguin 18.01.2021 04:16

Стоит отметить, что это не работает для ArrayField, но по какой-то причине работает для ArrayInput.

polar 30.05.2021 22:17

Возможно, вы сможете создать свой собственный компонент Field, который сможет принимать исходный код и записывать его в качестве реквизита.

 function populateList(numbers) {
        return numbers.map((number) =>
            <li key = {number.toString()}>
                {number}
            </li>
        );
    }

    const SimpleArray = ({source, record = {}}) =>
        <ul>
            {
                populateList(record[source])
            }
        </ul>;


    SimpleArray.defaultProps = {
        addLabel: true,
        label: 'List'
     };


    SimpleArray.propTypes = {
        label: PropTypes.string,
        record: PropTypes.object,
        source: PropTypes.string
    };

    export default SimpleArray;

И легко использовать его внутри любого элемента формы, например:

  <SimpleShowLayout>
                        <TextField source = "id"/>
                        <TextField label = "Title" source = "title" className = {classes.name}/> 
                        <TextField source = "title"/>
                        <NumberField source = "defaultItemCount"/>
                        <RichTextField source = "description"/>
                        <NumberField source = "priceInNumber"/>
                        <SimpleArray source = "attributeArray" label = "Product Attributes" />




                    </SimpleShowLayout>

Вот мой рабочий код, основанный на сообщении @ fzaninotto в response-admin вопросы:

import Chip from '@material-ui/core/Chip'

const TextArrayField = ({ record, source }) => {
  const array = record[source]
  if (typeof array === 'undefined' || array === null || array.length === 0) {
    return <div/>
  } else {
    return (
      <>
        {array.map(item => <Chip label = {item} key = {item}/>)}
      </>
    )    
  }
}
TextArrayField.defaultProps = { addLabel: true }

Применение:

  <TextArrayField source = "tags">
    <SingleFieldList>
      <ChipField source = "id" />
    </SingleFieldList>
  </TextArrayField>

Похоже, это также должно работать как <TextArrayField source = "tags" />, поскольку пользовательский компонент не использует переданные ему дочерние элементы.

mjomble 04.07.2021 11:08

Другие вопросы по теме