Files
30-seconds-of-code/snippets/MultiselectCheckbox.md
2019-02-27 15:11:21 +02:00

1.8 KiB

MultiselectCheckbox

Renders a checkbox list that uses a callback function to pass its selected value/values to the parent component. .

Use React.setState() to create a data state variable and set its initial value equal to the options prop. Create a function toggle that is used to toggle the checked to update the data state variable and call the onChange callbac passed via the component's props. Render a <ul> element and use Array.prototype.map() to map the data state variable to individual <li> elements with <input> elements as their children. Each <input> element has the type='checkbox' attribute and is marked as readOnly, as its click events are handled by the parent <li> element's onClick handler.

const style = {
  listContainer: {
    listStyle: 'none',
    paddingLeft: 0
  },
  itemStyle: {
    cursor: 'pointer',
    padding: 5
  }
};

function MultiselectCheckbox ({ options, onChange }) {
  const [data, setData] = React.useState(options);

  const toggle = (item) => {
    data.map((_, key) => {
      if (data[key].label === item.label) 
        data[key].checked = !item.checked;
    });
    setData([...data]);
    onChange(data);
  }

  return (
    <ul style={style.listContainer}>
      {data.map(item => {
        return (
          <li
            key={item.label}
            style={style.itemStyle}
            onClick={() => toggle(item)}
          >
            <input readOnly type='checkbox' checked={item.checked || false} />
            {item.label}
          </li>
        );
      })}
    </ul>
  );
}
const options = [{ label: "Item One" }, { label: "Item Two" }];

ReactDOM.render(
  <MultiselectCheckbox
    options={options}
    onChange={data => {
      console.log(data);
    }}
  />,
  document.getElementById("root")
);