React에서 여러 옵션을 사용하여 <select>에서 값 검색


81

선택 상자에 대해 선택된 옵션을 설정하는 React 방법은 선택 하려는 요소 의 속성에 해당 하는 특수 value소품을 <select>자체 에 설정하는 것입니다. A의 선택이 소품 대신 배열을 받아 들일 수 있습니다.value<option>multiple

이제 이것은 특별한 속성이기 때문에 사용자가 항목을 변경할 때 동일한 옵션 값 구조에서 선택한 옵션 을 검색 하는 표준 방법이 무엇인지 궁금합니다 (콜백을 통해 아마도 valueDOM 요소 에서 동일한 속성을 사용할 수 없기 때문입니다.

예제를 사용하려면 텍스트 필드를 사용하여 다음과 같은 작업을 수행합니다 (JSX).

var TextComponent = React.createClass({
  handleChange: function(e) {
    var newText = e.target.value;
    this.props.someCallbackFromParent(newText);
  },
  render: function() {
    return <input type="text" value={this.props.someText} onChange={this.handleChange} />;
  }
});

???이 다중 선택 구성 요소 를 대체하는 것과 동등한 것은 무엇입니까 ?

var MultiSelectComponent = React.createClass({
  handleChange: function(e) {
    var newArrayOfSelectedOptionValues = ???;
    this.props.someCallbackFromParent(newArrayOfSelectedOptionValues);
  },
  render: function() {
    return (
      <select multiple={true} value={this.props.arrayOfOptionValues} onChange={this.handleChange}>
        <option value={1}>First option</option>
        <option value={2}>Second option</option>
        <option value={3}>Third option</option>
      </select>
    );
  }
});

답변:


22

Array.from()e.target.selectedOptions당신은 제어 선택 - 다중을 수행 할 수 있습니다 :

handleChange = (e) => {
  let value = Array.from(e.target.selectedOptions, option => option.value);
  this.setState({values: value});
}

target.selectedOptions는 HTMLCollection을 반환합니다.

https://codepen.io/papawa/pen/XExeZY


여러 옵션에서 선택한 옵션 select을 하나의 배열로 결합하는 방법에 대한 아이디어가 있습니까? 을 통해 모두 잡은 후 말 document.querySelectorAll('select')합니까?
Casimir

이 질문을 받았을 때 selectedOptions호환성이 좋지 않았으며 IE에서 여전히 지원되지 않습니다. 그래도 이것은 현대적인 방법입니다.
Inkling 2010 년

107

변경 이벤트의 대상으로 실제 DOM 노드를 사용하고 있기 때문에 다른 곳에서도 동일한 방식으로 수행합니다.

handleChange: function(e) {
  var options = e.target.options;
  var value = [];
  for (var i = 0, l = options.length; i < l; i++) {
    if (options[i].selected) {
      value.push(options[i].value);
    }
  }
  this.props.someCallback(value);
}

4
CoffeeScript 버전 :(option.value for option in e.target.options when option.selected)
1j01

64
ES6 버전 : [... event.target.options] .filter (o => o.selected) .map (o => o.value)
svachalek

4
ES6 화살표를 분해 할 수도 있습니다.[...e.target.options].filter(({selected}) => selected).map(({value}) => value)
Mathieu M-Gosselin

6
RE : ES6 버전, 그 동안 외모가 제대로하지 않는 일. event.target.options은 (는 HTMLOptionsCollection) 배열이 아니라입니다.
TrueWill

3
@zrisher 네거티브, 고스트 라이더. HTMLOptionsCollection반복 할 수 없습니다. 그러나 Array.from여전히 작동합니다. Array.from(event.target.options).filter(o => o.selected).map(o => o.value)
Bondolin 19


11

사용하려는 경우 다음 ref과 같이 선택한 값을 얻을 수 있습니다.

var select = React.findDOMNode(this.refs.selectRef); 
var values = [].filter.call(select.options, function (o) {
      return o.selected;
    }).map(function (o) {
      return o.value;
    });

2018 ES6 업데이트

  let select = this.refs.selectRef;
  let values = [].filter.call(select.options, o => o.selected).map(o => o.value);

1
이후,뿐만 아니라 내 대답을 대체하기 위해 사용됩니다 selectedOptionsIE에서 지원되지 않습니다
rambossa

여기에 훨씬 더 깔끔한 es6 방법이 있습니다. :) [] .filter.call (this.refs.selectRef.options, o => o.selected) .map (o => o.value);
Dg Jacquard

7

양식을 작성하는 동안 선택한 옵션을 추적하려는 경우 :

handleChange(e) {
    // assuming you initialized the default state to hold selected values
    this.setState({
        selected:[].slice.call(e.target.selectedOptions).map(o => {
            return o.value;
        });
    });
}

selectedOptionsDOM과 관련된 배열과 같은 컬렉션 / 요소 목록입니다. 옵션 값을 선택할 때 이벤트 대상 개체에서 액세스 할 수 있습니다. Array.prototype.slice그리고 call우리가 새로운 상태에 대한 복사본을 만들 수 있습니다. 질문에 대한 또 다른 대답 인 ref (이벤트를 캡처하지 않는 경우)를 사용하여 이러한 방식으로 값에 액세스 할 수도 있습니다.


2
내 다른 의견 중 하나에서 언급했듯이에 대한 브라우저 지원 selectedOptions은 꽤 개략적으로 보입니다. 그러나 지원이 있다면 이상적인 솔루션 일 것입니다.
Inkling

1
사실 아,이 지원하지 않는 여전히 IE처럼 보인다
rambossa

6

실제로 selectedOptions타겟 내부를 찾을 수 있습니다. 모든 옵션을 반복 할 필요가 없습니다. onChange컴포넌트에 props로 전달 된 함수에 값을 보내고 싶다고 가정 해 봅시다 onChange. 다중 선택 에서 다음 함수를 사용할 수 있습니다 .

onSelectChange = (e) => {
    const values = [...e.target.selectedOptions].map(opt => opt.value);
    this.props.onChange(values);
  };

이 질문을 받았을 때 selectedOptions호환성이 좋지 않았습니다. Internet Explorer에서 여전히 지원되지 않으므로 IE 지원을 원하는 경우 (적어도 폴리 필없이) 실제로 사용할 수 없습니다.
암시

3

다음은 나를 위해 일했습니다.

var selectBoxObj = React.findDOMNode(this.refs.selectBox)
var values = $(selectBoxObj).val()

1
맞습니다. JQuery를 사용하여 여러 값을 검색했습니다.
mantish

react dom 또는 jQuery가 필요하지 않습니다. 그냥 OnChange 이벤트에서 값 검색
jamesmfriedman

1

이를 수행하는 또 다른 방법 :

handleChange({ target }) {
    this.props.someCallback(
       Array.prototype.slice.call(target.selectedOptions).map(o => o.value)
    )
}

0

이걸로 해봐:

dropdownChanged = (event) => {
    let obj = JSON.parse(event.target.value);
    this.setState(
        {
            key: obj.key,
            selectedName: obj.name,
            type: obj.type
        });
}


<select onChange={this.dropdownChanged} >
<option value={JSON.stringify({ name: 'name', key: 'key', type: "ALL" })} >All Projetcs and Spaces</option></select>

솔루션에 대한 설명을 더 추가하십시오.
Manmohan_singh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.