Language/React

React/RadioButton Component 만들기

건담아빠 2022. 12. 1. 10:15

 

Radio component가 마땅한게 없어서 급조해 봤다.

 

Parent Component

import React, { Component } from 'react';
...

class UnitViews extends Component {
  ...

  render() {
    ...
    
    return (
      <div className="inner-content box-list-wrap">
        <div className="header">
          <RadioButton
            // className="status"
            name="unit_status"
            init={[
              { value: '', text: '전체', icon: '' },
              { value: 'OCCUPY', text: '입실', icon: 'green' },
              { value: 'WAIT', text: '예약', icon: 'orange' },
              { value: 'EMPTY', text: '공실', icon: 'pebble' },
            ]}
            value={this.state.unitStatus}
            required
            onChange={(value) => {
              const checked_unit_status = value === '' ? null : [value];
              this.setState({ unitStatus: value }, this.props.onUpdate({ UNIT_STATUS: checked_unit_status }));
            }}
          />
          ...
        </div>
        ...
      </div>
    );
  }
}

export default wrapWithBase(UnitViews);

 

RadioButton Component

import React, { Component } from 'react';

class RadioButton extends Component {
  render() {
    const init = this.props.init;
    let value = this.props.value;

    if (value == null) value = '';

    if (init == null) {
      return false;
    }

    return (
      <div className={'wrap-button-radio' + (this.props.className ? ' ' + this.props.className : '')}>
        {init.map((item, idx) => (
          <div className="button-radio" key={idx}>
            {idx !== 0 && <div className="divider"></div>}

            <input
              name={this.props.name}
              id={this.props.name + '-' + idx}
              type="radio"
              value={item.value}
              checked={value === item.value}
              onChange={(e) => {
                this.props.onChange(e.target.value);
              }}
            />

            <label htmlFor={this.props.name + '-' + idx}>
              {item.icon !== undefined && item.icon !== null && item.icon !== '' && <span className={'button-radio-icon ' + item.icon}></span>}
              <span>{item.text}</span>
            </label>
          </div>
        ))}
      </div>
    );
  }
}

export default RadioButton;

 

css

.wrap-button-radio { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; width: max-content; height: 32px; padding: 5px 16px; border: 1px solid #D9D9D9; border-radius: 2px; background: #FFFFFF; box-sizing: border-box; gap: 12px; }
.wrap-button-radio > .button-radio { display: flex; flex-direction: row; align-items: center; height: 22px; padding: 0px; gap: 8px; }
.wrap-button-radio > .button-radio > .divider { width: 1px; height: 16px; background: rgba(0, 0, 0, 0.06); }
.wrap-button-radio > .button-radio > input[type="radio"] { display: none; }
.wrap-button-radio > .button-radio > input[type="radio"]:checked + label { color: rgba(0, 0, 0, 0.85); }
.wrap-button-radio > .button-radio > input[type="radio"]:checked + label > .green { background: #52C41A; }
.wrap-button-radio > .button-radio > input[type="radio"]:checked + label > .orange { background: #FAAD14; }
.wrap-button-radio > .button-radio > input[type="radio"]:checked + label > .pebble { background: #595959; }
.wrap-button-radio > .button-radio > input[type="radio"]:checked + label > .red { background: #FF4D4F; }
.wrap-button-radio > .button-radio > label {display: flex; flex-direction: row; justify-content: center; align-items: center; color: rgba(0, 0, 0, 0.25); font-weight: 400; font-size: 14px; line-height: 22px; cursor: pointer; gap: 8px; }
.wrap-button-radio > .button-radio > label > .button-radio-icon { width: 6px; height: 6px; padding: 0px; border-radius: 10px; background: #D9D9D9; }