Флаги внутри опции выбора React Bootstrap отображаются как [объект, объект] - PullRequest
0 голосов
/ 23 марта 2020

Я хочу отображать значки флагов внутри опции выбора React Bootstrap. Я пытался сделать это на основе библиотек CSS и React, и в каждом случае я получаю только [object object]

enter image description here

, которые я пробовал с https://github.com/lipis/flag-icon-css CSS библиотека

<Form.Control as="select">
         <option><span className="flag-icon flag-icon-gr"></span></option>
</Form.Control>

, которая выдает мне предупреждение и тот же [объект объекта]

Warning: Only strings and numbers are supported as <option> children.

Я также пытался использовать оболочку React для той же библиотеки https://www.npmjs.com/package/react-flag-icon-css

<Form.Control as="select">
        <option><FlagIcon className="countryIcon" code="us" size="lg"/></option>
</Form.Control>

Который не генерирует предупреждение, но также не дает результатов

Кто-нибудь знает, как я могу получить что-то еще, кроме строки или числа в Option или другой способ включить иконку?

Ответы [ 2 ]

0 голосов
/ 26 марта 2020
Тег

Option HTML принимает только текст, он не может принимать любые другие HTML, он удаляет его. Вы можете проверить эту опцию React Issue [bug] [16.5.0], которая возвращает [object Object] вместо строки и прочитать комментарий Dan Abramov :

Я не думаю, что это была строго регрессия. Это своего рода тернистый район. Это никогда не было намеренно поддержано. Он случайно работал при первоначальном монтировании, но затем падал при обновлении ( # 13261 ). Исправление сбоя было более важным, поэтому мы исправили его, чтобы он воспринимался как текстовое содержимое (как и должно быть). К сожалению, это означает, что размещение пользовательских компонентов в середине не поддерживается. Это согласуется с тем, как работают textarea и подобные элементы.

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

В качестве альтернативы, вы можете использовать Bootstrap Раскрывающиеся списки для создания раскрывающейся кнопки со списком стран с использованием приведенного ниже кода:

App.js:

...
import Dropdown from 'react-bootstrap/Dropdown';
import FlagIcon from './FlagIcon.js'

function App() {
  const [countries] = useState([
    { code: 'gr', title: 'Greece'},
    { code: 'gb', title: 'United Kingdom'},
    { code: 'us', title: 'United States'}
  ]);
  const [toggleContents, setToggleContents] = useState("Select a country");
  const [selectedCountry, setSelectedCountry] = useState();

  return (
    <div className="App">
      <Form>
        <Dropdown
          onSelect={eventKey => {
            const { code, title } = countries.find(({ code }) => eventKey === code);

            setSelectedCountry(eventKey);
            setToggleContents(<><FlagIcon code={code}/> {title}</>);
          }}
        >
          <Dropdown.Toggle variant="secondary" id="dropdown-flags" className="text-left" style={{ width: 300 }}>
            {toggleContents}
          </Dropdown.Toggle>

          <Dropdown.Menu>
            {countries.map(({ code, title }) => (
              <Dropdown.Item key={code} eventKey={code}><FlagIcon code={code}/> {title}</Dropdown.Item>
            ))}
          </Dropdown.Menu>
        </Dropdown>
      </Form>
    </div>
  );
}

FlagIcon.js:

import React from 'react';
import FlagIconFactory from 'react-flag-icon-css';

// const FlagIcon = FlagIconFactory(React);
// If you are not using css modules, write the following:
const FlagIcon = FlagIconFactory(React, { useCssModules: false })

export default FlagIcon;

Вы получите раскрывающуюся кнопку, подобную этой:

Bootstrap Dropdown Button Menu

Вы также можете проверить этот рабочий Stackblitz: https://stackblitz.com/edit/react-bootstrap-flags-dropdown-menu

0 голосов
/ 23 марта 2020

Закрываете ли вы тег

 <Form.Control as="select">

[объект объекта] отображается, например, когда вы объединяете строку с объектом, например:

console.log(""+{})
...