Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add an icon to the options in react-select?

Attempts to add an icon to option in react-select. I imported svg icons from the files england.svg, germany.svg. I created customSingleValue and put it in

<Select components={{ SingleValue: customSingleValue }} />

Labels are displayed, but the icons are not.

Demo here: https://stackblitz.com/edit/react-q19sor

import Select from 'react-select'
import { ReactComponent as IconFlagEngland } from "./england.svg";
import { ReactComponent as IconFlagGermany } from "./germany.svg";

const options = [
  { value: 'England', label: 'England', icon: <IconFlagEngland/> },
  { value: 'Germany', label: 'Germany', icon: <IconFlagGermany/> }
]

const customSingleValue = ({ options }) => (
    <div className="input-select">
        <div className="input-select__single-value">
            { options.icon && <span className="input-select__icon">{ options.icon }</span> }
            <span>{ options.label }</span>
        </div>
    </div>
);

class App extends Component {
  constructor() {
    super();
    this.state = {
      name: 'React'
    };
  }

  render() {
    return (
       <Select
            defaultValue={ options [0] }
            options={ options }
            /*styles={ selectCustomStyles }*/
            /*onChange={ changeSelectHandler }*/
            components={ {SingleValue: customSingleValue } }
        />
    );
  }
}

render(<App />, document.getElementById('root'));
like image 865
Umbro Avatar asked Oct 18 '19 10:10

Umbro


People also ask

How do I show icon in select option?

To add icons in select option text we have to use the bootstrap-select plugin, which is a great plugin for customizing plain HTML select with some great customization options using bootstrap style. With this plugin, we can style the select element with only simple data attributes or initialize with Javascript.

How do I add icons to my react app?

In App.js, paste the import code at the top of the file after the React import code Go back to the React icons page and choose any icon from the Font Awesome icons Click on the icon to copy it Go back to your import code in the App.js file

How do I use React-icons?

With React-icons, you only need to run one command to use any icons you want from a certain library. You just need to pick the correct import code and your icon is set. React-icons works with a bunch of different icon libraries like Font Awesome, Material UI, Bootstrap icons, and many others.

How to import icons from other libraries into react?

React-icons uses ES6 features to import the icons into your React app. And it makes it so that only the icons you actually use from each library get imported. With React-icons, you only need to run one command to use any icons you want from a certain library. You just need to pick the correct import code and your icon is set.

How to add icons in the Select option in HTML?

We will use the font-awesome library to add icons in the select option. The <select> tag is similar in functionality to unordered list <ul> or ordered list <ol> used in HTML to define a list and <option> tag is similar to the list item <li> which specifies the list item in a list. The select and option tags are used to create drop-down menus.


3 Answers

I found a workaround how to solve it. My technique is similar to @canda:

import React, { Component } from "react";
import { render } from "react-dom";
import "./style.css";
import Select, { components } from "react-select";

const options = [
  { value: "England", label: "England", icon: "england.svg" },
  { value: "Germany", label: "Germany", icon: "germany.svg" }
];

const { Option } = components;
const IconOption = props => (
  <Option {...props}>
    <img
      src={require('./' + props.data.icon)}
      style={{ width: 36 }}
      alt={props.data.label}
    />
    {props.data.label}
  </Option>
);

class App extends Component {
  constructor() {
    super();
    this.state = {
      name: "React"
    };
  }

  render() {
    return (
      <Select
        defaultValue={options[0]}
        options={options}
        components={{ Option: IconOption }}
      />
    );
  }
}

render(<App />, document.getElementById("root"));
like image 126
Penny Liu Avatar answered Oct 24 '22 06:10

Penny Liu


Just in case anybody want to use icons with multiple selection in react-select, below code can be used:

const { MultiValue } = components;

const MultiValueOption = (props) => {
  return (
    <MultiValue {...props}>
      <img
        src={require("./" + props.data.icon)}
        style={{ width: 36 }}
        alt={props.data.label}
      />
      <span>{props.data.value}</span>
    </MultiValue>
  );
};

<Select
  options={options}
  components={{
    Option: IconOption,
    MultiValue: MultiValueOption,
  }}
  isMulti={true}
></Select>;
like image 5
Saket Kumar Avatar answered Oct 24 '22 07:10

Saket Kumar


I think the problem is that you are not actually importing the SVGs. If you try to use <IconFlagGermany/> directly in your code anywhere, it will crash hard with this message :

Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.

It is currently not crashing because I think your customSingleValue function is not working as you intend it to (have not looked into it, but pretty sure it is bugged).

If you want to be able to import SVGs in this manner, you need to setup an appropriate loader in Webpack (or your chosen bundler). Maybe something like this : https://www.npmjs.com/package/react-svg-loader

However, another solution is to properly export your SVGs as components, like in this demo forked from your code : https://stackblitz.com/edit/react-5gvytm

like image 2
Mathieu Avatar answered Oct 24 '22 06:10

Mathieu