ReactJS에서 라디오 버튼을 사용하는 방법?


203

ReactJS를 처음 사용합니다. 소리가 나면 죄송합니다. 수신 된 데이터에 따라 여러 테이블 행을 만드는 구성 요소가 있습니다.

열의 각 셀에는 라디오 확인란이 있습니다. 따라서 사용자는 기존 행에서 site_name하나 address를 선택할 수 있습니다 . 선택은 바닥 글에 표시되어야합니다. 그리고 내가 붙어있는 곳.

var SearchResult = React.createClass({
   render: function(){
       var resultRows = this.props.data.map(function(result){
           return (
               <tbody>
                    <tr>
                        <td><input type="radio" name="site_name" value={result.SITE_NAME}>{result.SITE_NAME}</input></td>
                        <td><input type="radio" name="address" value={result.ADDRESS}>{result.ADDRESS}</input></td>
                    </tr>
               </tbody>
           );
       });
       return (
           <table className="table">
               <thead>
                   <tr>
                       <th>Name</th>
                       <th>Address</th>
                   </tr>
               </thead>
                {resultRows}
               <tfoot>
                   <tr>
                       <td>chosen site name ???? </td>
                       <td>chosen address ????? </td>
                   </tr>
               </tfoot>
           </table>
       );
   }
});

jQuery에서는 $("input[name=site_name]:checked").val()하나의 라디오 확인란 유형을 선택하여 첫 번째 바닥 글 셀에 삽입하는 것과 같은 작업을 수행 할 수 있습니다.

그러나 반드시 완전히 누락 된 Reactjs 방식이 있어야합니까? 많은 감사


3
input요소는 내용이 없습니다. 따라서 <input>content</input>의미가 없으며 유효하지 않습니다. 당신은 원할지도 모릅니다 <label><input />content</label>.
Oriol

1
라디오 버튼이 작동하기 위해 다른 값을 가진 동일한 이름을 가질 필요는 없습니까?
pgee70

답변:


209

렌더링에 대한 모든 변경 사항은 state또는 props( react doc )을 통해 변경해야합니다 .

여기에 입력 이벤트를 등록한 다음을 변경 state하면 바닥 글에 렌더링이 표시됩니다.

var SearchResult = React.createClass({
  getInitialState: function () {
    return {
      site: '',
      address: ''
    };
  },
  onSiteChanged: function (e) {
    this.setState({
      site: e.currentTarget.value
      });
  },

  onAddressChanged: function (e) {
    this.setState({
      address: e.currentTarget.value
      });
  },

  render: function(){
       var resultRows = this.props.data.map(function(result){
           return (
               <tbody>
                    <tr>
                        <td><input type="radio" name="site_name" 
                                   value={result.SITE_NAME} 
                                   checked={this.state.site === result.SITE_NAME} 
                                   onChange={this.onSiteChanged} />{result.SITE_NAME}</td>
                        <td><input type="radio" name="address" 
                                   value={result.ADDRESS}  
                                   checked={this.state.address === result.ADDRESS} 
                                   onChange={this.onAddressChanged} />{result.ADDRESS}</td>
                    </tr>
               </tbody>
           );
       }, this);
       return (
           <table className="table">
               <thead>
                   <tr>
                       <th>Name</th>
                       <th>Address</th>
                   </tr>
               </thead>
                {resultRows}
               <tfoot>
                   <tr>
                       <td>chosen site name {this.state.site} </td>
                       <td>chosen address {this.state.address} </td>
                   </tr>
               </tfoot>
           </table>
       );
  }
});

jsbin


3
매우 유용했습니다. 감사. 내가 이해하지 못하는 것은 }, this);바로 밑에있는 비트 </tbody>입니다. 그것은 무엇이며 무엇을합니까? 코드가 충돌하지 않는 것을 알았습니다.
Houman

3
this받는 전달 상황이다 map기능 . @FakeRainBrigand의 편집이었습니다. 그것은 당신없이 this지도 기능의은을 참조합니다 window(가) 무슨 생각이없는, state
ChinKang

8
이것은 this당신이 ES6 대신 일반 기능의 화살표를 사용하는 경우 트릭은 필요하지 않습니다. 예 : var resultRows = this.props.data.map((result) => { ... });React-ers는 일반적으로 이미 JSX의 경우 일부 형태의 트랜스 필 레이션을 사용하고 있기 때문에 ES6에 쉽게 접근 할 수 있기 때문에 언급합니다.
Tom

1
라디오 버튼의 값을 얻기 위해 두 가지 기능을 사용하면 모호하고 불필요하게 나타납니다. 당신은 아마도 하나 개의 함수를 정의 할 수 있습니다onInputChange (e) {this.setState({ [e.target.name]: e.target.value }); }
xplorer1

109

반응 js에서 라디오 버튼을 구현하는 가장 간단한 방법은 다음과 같습니다.

class App extends React.Component {
  
  setGender(event) {
    console.log(event.target.value);
  }
  
  render() {
    return ( 
      <div onChange={this.setGender.bind(this)}>
        <input type="radio" value="MALE" name="gender"/> Male
        <input type="radio" value="FEMALE" name="gender"/> Female
      </div>
     )
  }
}

ReactDOM.render(<App/>, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

편집

바인딩 대신 화살표 기능을 사용할 수 있습니다. 위 코드를 다음과 같이 바꾸십시오.

<div onChange={event => this.setGender(event)}>

기본값 defaultChecked은 다음과 같이 사용 하십시오.

<input type="radio" value="MALE" defaultChecked name="gender"/> Male

6
나는 .bind(this)매번 새로운 기능을 만들 것이라고 믿습니다 . 즉, 반응이 가상 DOM에서 변경된 사항이 있는지 확인할 때이 구성 요소는 항상 다르며 항상 다시 렌더링해야합니다.
WoodenKitty

1
각 렌더의 새로운 함수는이 함수를 자식 컴포넌트에 소품으로 전달하는 경우에만 문제가됩니다. 이 경우 소품을받는 자식 구성 요소가 불필요하게 렌더링 될 수 있습니다. 부모 구성 요소가 좋습니다.
마크 맥 켈비

5
나에게 이것은 동일한 이름을 공유하는 모든 라디오를 클릭 할 때 한 번만 작동합니다. 예를 들어, name소품 이 같은 두 개의 라디오가 있습니다 . 그들은 onChange이 답변에 설명 된 것처럼 핸들러 가있는 div에 싸여 있습니다. 첫 번째 라디오를 클릭하면 이벤트가 시작됩니다. 두 번째 라디오를 클릭하면 이벤트가 시작됩니다. 그러나 세 번째 이후로는 이벤트가 발생하지 않습니다. 왜?
Squrler

4
@Saahithyan 모든 라디오에 동일한 이름 속성이 첨부되었습니다. onChange 핸들러 대신 onClick 핸들러를 라디오 입력에 넣어야한다는 것이 밝혀졌습니다. 그 트릭을했다.
Squrler

3
@Squrler에 동의합니다 .onChange를 사용하면 div 아래에 포함 된 각 라디오 버튼에 대해 핸들이 한 번만 발생합니다. onClick을 사용하면 여러 번 작동합니다. 왜 이것이 당신의 스 니펫과 비교되는지 잘 모르겠습니다 ...
JESii

25

React Docs의 말을 바탕으로 :

다중 입력 처리. 여러 개의 제어 된 입력 요소를 처리해야하는 경우 각 요소에 이름 속성을 추가하고 핸들러 함수가 event.target.name 값에 따라 수행 할 작업을 선택하도록 할 수 있습니다.

예를 들면 다음과 같습니다.

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

  handleChange = e => {
    const { name, value } = e.target;

    this.setState({
      [name]: value
    });
  };

  render() {
    return (
      <div className="radio-buttons">
        Windows
        <input
          id="windows"
          value="windows"
          name="platform"
          type="radio"
          onChange={this.handleChange}
        />
        Mac
        <input
          id="mac"
          value="mac"
          name="platform"
          type="radio"
          onChange={this.handleChange}
        />
        Linux
        <input
          id="linux"
          value="linux"
          name="platform"
          type="radio"
          onChange={this.handleChange}
        />
      </div>
    );
  }
}

예 링크 : https://codesandbox.io/s/6l6v9p0qkr

처음에는 라디오 버튼을 선택하지 않았으므로 this.state비어있는 객체이지만 라디오 버튼을 선택할 때마다this.state 입력 이름과 값이 포함 된 새 속성을 가져옵니다. 그런 다음 사용자가 다음과 같은 라디오 버튼을 선택했는지 쉽게 확인할 수 있습니다.

const isSelected = this.state.platform ? true : false;

편집하다:

반작용의 버전 16.7 알파로이 제안이다 라는 뭔가가hooks 이런 종류의 작업을 더 쉽게 수행 할 수 이 있습니다.

아래 예에서는 기능 구성 요소에 두 개의 라디오 버튼 그룹이 있습니다. 여전히, 그들은 제어 된 입력을 가지고 있습니다 :

function App() {
  const [platformValue, plaftormInputProps] = useRadioButtons("platform");
  const [genderValue, genderInputProps] = useRadioButtons("gender");
  return (
    <div>
      <form>
        <fieldset>
          Windows
          <input
            value="windows"
            checked={platformValue === "windows"}
            {...plaftormInputProps}
          />
          Mac
          <input
            value="mac"
            checked={platformValue === "mac"}
            {...plaftormInputProps}
          />
          Linux
          <input
            value="linux"
            checked={platformValue === "linux"}
            {...plaftormInputProps}
          />
        </fieldset>
        <fieldset>
          Male
          <input
            value="male"
            checked={genderValue === "male"}
            {...genderInputProps}
          />
          Female
          <input
            value="female"
            checked={genderValue === "female"}
            {...genderInputProps}
          />
        </fieldset>
      </form>
    </div>
  );
}

function useRadioButtons(name) {
  const [value, setState] = useState(null);

  const handleChange = e => {
    setState(e.target.value);
  };

  const inputProps = {
    name,
    type: "radio",
    onChange: handleChange
  };

  return [value, inputProps];
}

작업 예 : https://codesandbox.io/s/6l6v9p0qkr


20

라디오 구성 요소를 바보 구성 요소로 만들고 소품을 부모로부터 전달하십시오.

import React from "react";

const Radiocomponent = ({ value, setGender }) => ( 
  <div onChange={setGender.bind(this)}>
    <input type="radio" value="MALE" name="gender" defaultChecked={value ==="MALE"} /> Male
    <input type="radio" value="FEMALE" name="gender" defaultChecked={value ==="FEMALE"}/> Female
  </div>
);

export default Radiocomponent;

2
덤프 구성 요소는 순수한 기능이므로 테스트하기 쉽습니다.
Khalid Azam

7

여기에 아이디어가 있습니다 : React의 라디오 입력과 관련하여 나는 보통 이전 답변에서 언급 한 것과 다른 방식으로 모든 것을 렌더링합니다.

이것이 많은 라디오 버튼을 렌더링 해야하는 사람에게 도움이된다면 :

import React from "react"
import ReactDOM from "react-dom"

// This Component should obviously be a class if you want it to work ;)

const RadioInputs = (props) => {
  /*
    [[Label, associated value], ...]
  */
  
  const inputs = [["Male", "M"], ["Female", "F"], ["Other", "O"]]
  
  return (
    <div>
      {
        inputs.map(([text, value], i) => (
	  <div key={ i }>
	    <input type="radio"
              checked={ this.state.gender === value } 
	      onChange={ /* You'll need an event function here */ } 
	      value={ value } /> 
    	    { text }
          </div>
        ))
      }
    </div>
  )
}

ReactDOM.render(
  <RadioInputs />,
  document.getElementById("root")
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="root"></div>


1
대단하다. 매우 건조하고 물건을 좋게 만듭니다. 각 옵션마다 객체를 사용하지만 선호하는 문제입니다.
nbkhope

@nbkhope 다시 작성 해야하는 경우 대신 객체를 사용합니다! :)
Arnaud

이 줄을 확인하십시오 : checked={ this.state.gender === value }. 기능적 구성 요소에는이 없습니다 this.
Abraham Hernandez

6
import React, { Component } from "react";

class RadionButtons extends Component {
  constructor(props) {
    super(props);

    this.state = {
      // gender : "" , // use this one if you don't wanna any default value for gender
      gender: "male" // we are using this state to store the value of the radio button and also use to display the active radio button
    };

    this.handleRadioChange = this.handleRadioChange.bind(this);  // we require access to the state of component so we have to bind our function 
  }

  // this function is called whenever you change the radion button 
  handleRadioChange(event) {
      // set the new value of checked radion button to state using setState function which is async funtion
    this.setState({
      gender: event.target.value
    });
  }


  render() {
    return (
      <div>
        <div check>
          <input
            type="radio"
            value="male" // this is te value which will be picked up after radio button change
            checked={this.state.gender === "male"} // when this is true it show the male radio button in checked 
            onChange={this.handleRadioChange} // whenever it changes from checked to uncheck or via-versa it goes to the handleRadioChange function
          />
          <span
           style={{ marginLeft: "5px" }} // inline style in reactjs 
          >Male</span>
        </div>
        <div check>
          <input
            type="radio"
            value="female"
            checked={this.state.gender === "female"}
            onChange={this.handleRadioChange}
          />
          <span style={{ marginLeft: "5px" }}>Female</span>
        </div>
      </div>
    );
  }
}
export default RadionButtons;

1
코드는 작동하지만 약간 설명해야합니다
Rahul Sharma

참고 : DOM 구성 요소에 체크 된 설정을 방지하기 때문에 onChange 핸들러에서 preventDefault 를 사용 하지
마십시오

2

라디오 버튼을 클릭하면 다음 중 하나의 이벤트가 트리거됩니다.

  1. 선택 지식 만 로컬로 설정하려는 경우 setState를 호출하거나
  2. 위에서 전달 된 콜백을 호출합니다. self.props.selectionChanged(...)

첫 번째 경우, 변경 상태는 다시 렌더링을 트리거하고 수행 할 수 있습니다
<td>chosen site name {this.state.chosenSiteName} </td>

두 번째 경우 콜백 소스는 항목을 업데이트하여 SearchDown 인스턴스가 props에 selectedSiteName 및 selectedAddress를 설정하도록합니다.


2

ChinKang을 기반으로 그의 대답에 따르면, 나는 더 건조한 접근 방식과 es6에서 관심있는 사람들을 위해 말했다.

class RadioExample extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      selectedRadio: 'public'
    };
  }

  handleRadioChange = (event) => {
    this.setState({
      selectedRadio: event.currentTarget.value
    })
  };

  render() {
    return (
      <div className="radio-row">
        <div className="input-row">
          <input
            type="radio"
            name="public"
            value="public"
            checked={this.state.selectedRadio === 'public'}
            onChange={this.handleRadioChange}
          />
          <label htmlFor="public">Public</label>
        </div>
        <div className="input-row">
          <input
            type="radio"
            name="private"
            value="private"
            checked={this.state.selectedRadio === 'private'}
            onChange={this.handleRadioChange}
          />
          <label htmlFor="private">Private</label>
        </div>
      </div>
    )
  }
}

이것을 제외하고는 기본값으로 확인 된 값이 있습니다.


1

라디오, 확인란 구현에 혼란스러워했습니다. 우리가 필요한 것은 라디오의 변경 이벤트를 듣고 상태를 설정하는 것입니다. 나는 성별 선택의 작은 예를 만들었습니다.

/*
 * A simple React component
 */
class App extends React.Component {
  constructor(params) {
     super(params) 
     // initial gender state set from props
     this.state = {
       gender: this.props.gender
     }
     this.setGender = this.setGender.bind(this)
  }
  
  setGender(e) {
    this.setState({
      gender: e.target.value
    })
  }
  
  render() {
    const {gender} = this.state
    return  <div>
        Gender:
        <div>
          <input type="radio" checked={gender == "male"} 
onClick={this.setGender} value="male" /> Male
          <input type="radio" checked={gender == "female"} 
onClick={this.setGender} value="female"  /> Female
        </div>
        { "Select Gender: " } {gender}
      </div>;
  }
}

/*
 * Render the above component into the div#app
 */
ReactDOM.render(<App gender="male" />, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>


0

부트 스트랩 녀석, 우리는 다음과 같이합니다 :


export default function RadioButton({ onChange, option }) {
    const handleChange = event => {
        onChange(event.target.value)
    }

    return (
        <>
            <div className="custom-control custom-radio">
                <input
                    type="radio"
                    id={ option.option }
                    name="customRadio"
                    className="custom-control-input"
                    onChange={ handleChange }
                    value = { option.id }
                    />
                    <label
                        className="custom-control-label"
                        htmlFor={ option.option }
                        >
                        { option.option }
                    </label>
            </div>
        </>
    )
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.