react-select에서 기본값을 설정하는 방법


91

react-select를 사용하는 데 문제가 있습니다. 나는 redux 양식을 사용하고 내 react-select 구성 요소를 redux 양식과 호환되도록 만들었습니다. 다음은 코드입니다.

const MySelect = props => (
    <Select
        {...props}
        value={props.input.value}
        onChange={value => props.input.onChange(value)}
        onBlur={() => props.input.onBlur(props.input.value)}
        options={props.options}
        placeholder={props.placeholder}
        selectedValue={props.selectedValue}
    />
);

그리고 여기 렌더링 방법 :

<div className="select-box__container">
    <Field
    id="side"
    name="side"
    component={SelectInput}
    options={sideOptions}
    clearable={false}
    placeholder="Select Side"
    selectedValue={label: 'Any', value: 'Any'}
    />
</div>

그러나 문제는 내 드롭 다운에 내가 원하는 기본값이 없다는 것입니다. 내가 뭘 잘못하고 있니? 어떤 아이디어?


이것은 정확합니다 : value = {props.input.value}. 당신이 직면 한 문제는 무엇입니까?
Ved

내 문제는 내가 처음 렌더링 할 때 내 선택이 defaultValue를 갖기를 원하지만 할 수 없다는 것입니다
user7334203

1
처음 렌더링 할 때 props.input.value의 값은 무엇입니까?
Ved

그게 내 문제입니다. 기본값을 갖도록 설정하는 방법은 무엇입니까?
user7334203

어떤 가치를 원하십니까?
Ved

답변:


69

다음과 같은 것이 필요하다고 생각합니다.

const MySelect = props => (
<Select
    {...props}
    value={props.options.filter(option => option.label === 'Some label')}
    onChange={value => props.input.onChange(value)}
    onBlur={() => props.input.onBlur(props.input.value)}
    options={props.options}
    placeholder={props.placeholder}
  />
);

6
redux / react 바인딩의 요점은 UI가 실시간으로 객체의 값을 반영한다는 것입니다. 이 접근 방식은 해당 바인딩을 분리합니다. 감속기에서 기본값 설정을 고려하십시오.
Joseph Juhnke 2017-08-03

2
@JosephJuhnke 먼저 질문을 확인하십시오. 기본값을 설정하는 방법입니다.
Ved

6
selectedValue로 변경되었습니다 value. 문서 확인 react-select.com/props
transang

11
defaultValue이제 새 버전에 필드 가 있습니다 .
Hongbo Miao

3
까다로운 점은 선택한 개체를 옵션 값 대신 'defaultValue'필드로 설정해야한다는 것입니다. 예 : 0,1,2
andyCao

51

defaultValue 매개 변수를 사용했습니다. 아래는 드롭 다운에서 옵션을 선택할 때 기본값을 업데이트하고 기본값을 얻는 방법에 대한 코드입니다.

<Select
  name="form-dept-select"
  options={depts}
  defaultValue={{ label: "Select Dept", value: 0 }}
  onChange={e => {
              this.setState({
              department: e.label,
              deptId: e.value
              });
           }}
/>

8
감사합니다. 이제 defaultValue가 값 대신 객체를 사용한다는 것을 알고 있습니다.
Dennis Liu

1
React 문서 나 인텔리 센스에 따르면 그렇지 않습니다 : reactjs.org/docs/uncontrol-components.html#default-values
Alex

@Alex-(그리고 2 년 후 여기있는 사람이라면)이 질문은 컴포넌트 라이브러리 인 react-select와 관련이있었습니다. 링크 한 문서는 기본 HTML 선택 요소를 참조합니다.
Rashad Nasir

38

여기에 왔어요 경우 V2-선택 반응, 여전히 문제가 - 버전이 이제 객체로서 받아 value, defaultValue

value={{value: 'one', label: 'One'}}, 대신을 사용해보십시오 value={'one'}.


대단히 감사합니다
조니 Bigoode

불완전한. 당신이 그에게 값을 설정하면, 당신은 더 이상 하나라도 valuie을 변경할 수 없습니다
Toskan

@Toskan-예, 이것은 ReactJS 및 단방향 데이터 바인딩의 원칙 중 하나이며이 라이브러리뿐만 아니라 모든 양식 요소에 영향을줍니다. 제어 된 구성 요소를 선택하는 경우 반응 외부에서 변경 사항을 직접 처리해야합니다. 이 답변은 그것에 대해 이야기하고 React Docs에 연결됩니다. stackoverflow.com/questions/42522515/…
eedrah

괜찮습니다. 그렇다면 어떤 문제를 해결합니까? 즉, 값을 하드 코딩합니까?
Toskan

{value: 'one', label: 'One'}여기 에 주어진 경우 는 단지 예일뿐입니다. 응용 프로그램에서 이것은 동일한 구조를 가진 변수 / 소품입니다.
eedrah

14

비슷한 오류가 발생했습니다. 옵션에 값 속성이 있는지 확인하십시오.

<option key={index} value={item}> {item} </option>

그런 다음 처음에 selects 요소 값을 옵션 값과 일치시킵니다.

<select 
    value={this.value} />

나는 이것이 최고 / 가장 우아한 솔루션이라고 생각합니다. 나는 그것을 생각하는 것이 맞습니까?
user2026178

그렇게한다면 값은 변하지 않을 것입니다. 당신은 쓰기 onChange 함수도 가지고 있습니다. set change
raghul

1
이것은 반응 선택 <Select>가 아니라 바닐라 HTML <select> 요소를위한 것입니다. 모든 차이 :) 할 수 있습니다 케이싱
마이크 Goatly

6

@ isaac-pak의 답변을 확장하면 기본값을 prop의 구성 요소에 전달하려면 componentDidMount () 수명주기 메서드에 상태로 저장하여 기본값이 처음으로 선택되도록 할 수 있습니다.

다음 코드를 업데이트하여 더 완벽하게 만들고 주석 당 초기 값으로 빈 문자열을 사용했습니다.

export default class MySelect extends Component {

    constructor(props) {
        super(props);
        this.state = {
            selectedValue: '',
        };
        this.handleChange = this.handleChange.bind(this);

        this.options = [
            {value: 'foo', label: 'Foo'},
            {value: 'bar', label: 'Bar'},
            {value: 'baz', label: 'Baz'}
        ];

    }

    componentDidMount() {
        this.setState({
            selectedValue: this.props.defaultValue,
        })
    }

    handleChange(selectedOption) {
        this.setState({selectedValue: selectedOption.target.value});
    }

    render() {
        return (
            <Select
                value={this.options.filter(({value}) => value === this.state.selectedValue)}
                onChange={this.handleChange}
                options={this.options}
            />
        )
    }
}

MySelect.propTypes = {
    defaultValue: PropTypes.string.isRequired
};

나는 이것을 얻는다 : 경고 : valueprop on select은 null이 아니어야한다. 구성 요소를 지우거나 undefined제어되지 않는 구성 요소의 경우 빈 문자열을 사용하는 것이 좋습니다.
Jason Rice

나는 같은 일을 그리고 난이 경고를 받고 있어요 :Warning: A component is changing a controlled input of type hidden to be uncontrolled. Input elements should not switch from controlled to uncontrolled (or vice versa).
alexventuraio

@AlexVentura 코드를 좀 더 완벽하게 만들고 시스템에서 테스트했습니다. 제어 된 입력에 대한 경고가 표시되지 않습니다. 편집 한 응답을 기반으로 코드를 업데이트하고 찾은 내용을 다시 게시하십시오.
Dan Meigs


2

나는 이것을 직접 살펴보고 감속기 INIT 기능에서 기본값을 설정하기로 결정했습니다.

선택을 redux로 바인딩하는 경우 실제 값을 나타내지 않는 선택 기본값으로 '디 바인딩'하지 말고 대신 개체를 초기화 할 때 값을 설정하십시오.


1

redux-form을 사용하지 않고 변경을 위해 로컬 상태를 사용하는 경우 react-select 구성 요소는 다음과 같습니다.

class MySelect extends Component {

constructor() {
    super()
}

state = {
     selectedValue: 'default' // your default value goes here
}

render() {
  <Select
       ...
       value={this.state.selectedValue}
       ...
  />
)}

1

옵션에서 그룹을 사용하는 경우 심층 검색을 수행해야합니다.

options={[
  { value: 'all', label: 'All' },
  {
    label: 'Specific',
    options: [
      { value: 'one', label: 'One' },
      { value: 'two', label: 'Two' },
      { value: 'three', label: 'Three' },
    ],
  },
]}
const deepSearch = (options, value, tempObj = {}) => {
  if (options && value != null) {
    options.find((node) => {
      if (node.value === value) {
        tempObj.found = node;
        return node;
      }
      return deepSearch(node.options, value, tempObj);
    });
    if (tempObj.found) {
      return tempObj.found;
    }
  }
  return undefined;
};

0

옵션이 이렇다면

var options = [
  { value: 'one', label: 'One' },
  { value: 'two', label: 'Two' }
];

귀하 {props.input.value}의 하나와 일치해야합니다 'value'{props.options}

의미 props.input.value'one'또는'two'


0

in select의 값을 자동 선택합니다.

여기에 이미지 설명 입력

<div className="form-group">
    <label htmlFor="contactmethod">Contact Method</label>
    <select id="contactmethod" className="form-control"  value={this.state.contactmethod || ''} onChange={this.handleChange} name="contactmethod">
    <option value='Email'>URL</option>
    <option value='Phone'>Phone</option>
    <option value="SMS">SMS</option>
    </select>
</div>

선택 태그에서 값 속성 사용

value={this.state.contactmethod || ''}

솔루션이 저에게 효과적입니다.


0
  1. 생성자에서 기본 옵션 텍스트에 대한 상태 속성을 만듭니다.
    • 기본 옵션 값에 대해 걱정하지 마십시오
  2. render 함수에 옵션 태그를 추가합니다. 상태 및 삼항 표현식 사용 만 표시
  3. 옵션이 선택되었을 때 처리 할 함수 만들기
  4. 이 이벤트 처리기 함수의 기본 옵션 값 상태를 null로 변경합니다.

    Class MySelect extends React.Component
    {
        constructor()
        {
            super()
            this.handleChange = this.handleChange.bind(this);
            this.state = {
                selectDefault: "Select An Option"
            }
        }
        handleChange(event)
        {
            const selectedValue = event.target.value;
            //do something with selectedValue
            this.setState({
                selectDefault: null
            });
        }
        render()
        {
            return (
            <select name="selectInput" id="selectInput" onChange={this.handleChange} value= 
                {this.selectedValue}>
             {this.state.selectDefault ? <option>{this.state.selectDefault}</option> : ''}
                {'map list or static list of options here'}
            </select>
            )
        }
    }
    

0

나는 이와 같은 것을 자주 사용하고 있습니다.

이 예에서 props의 기본값

if(Defaultvalue ===item.value) {
    return <option key={item.key} defaultValue value={item.value}>{plantel.value} </option>   
} else {
    return <option key={item.key} value={item.value}>{plantel.value} </option> 
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.