Передача массива объектов в useHook (downshift-js) создает ошибку

#reactjs #downshift

#reactjs #понижающая передача

Вопрос:

Я следовал базовому использованию в downshift-examples, но изменил массив элементов для отображения в раскрывающемся списке с starwars (массив строк) на массив объектов (например, Id: 1, Description:’item’) в shared.js .

Я также зарегистрировал пару вещей и вставил их в приведенный ниже код, которому предшествует «==>».

Когда я запускаю приложение, появляется выпадающий список. Но в тот момент, когда я нажимаю на стрелку выпадающего списка в правой части выпадающего списка, отображается следующая ошибка.

Неперехваченная ошибка: объекты недопустимы в качестве дочернего элемента React (найдено: объект с ключами {Id, Description}). Если вы хотели отобразить коллекцию дочерних элементов, вместо этого используйте массив.

Есть идеи о том, что я делаю неправильно?

 import { items, menuStyles, comboboxStyles, itemToString } from "../../shared";

function DropdownCombobox() {
  const [inputItems, setInputItems] = useState(items);
  console.log(items);      // ==> Array(127)
  console.log(itemToString); // ==> i => i ? i.Description : ""
  console.log(items[1]); // ==> {Id: 38, Description: "001 - RAB"}
  const {
    isOpen,
    getToggleButtonProps,
    getLabelProps,
    getMenuProps,
    getInputProps,
    getComboboxProps,
    highlightedIndex,
    getItemProps,
  } = useCombobox({
    items: inputItems,
    itemToString,
    onInputValueChange: ({ inputValue }) => {
      setInputItems(
        items.filter((item) =>
          itemToString(item).toLowerCase().startsWith(inputValue.toLowerCase())
        )
      );
    },
  });```
  

Ответ №1:

Список элементов для массива объектов ({Id:0, Description:’abc’} должен быть

 <ul {...getMenuProps()} style={menuStyles}>
  {isOpen amp;amp;
    inputItems.map((item, index) => (
      <li
        style={highlightedIndex === index ? { backgroundColor: '#bde4ff' } : {}}
        key={item.Id}
        {...getItemProps({ item, index })}
      >
        {item.Description}
      </li>
    ))}
</ul>
  

И следующий обработчик должен быть изменен

 onInputValueChange: ({ inputValue }) => {
  setInputItems(
    items.filter((item) => item.Description.toLowerCase().startsWith(inputValue.toLowerCase()))
  );
},