如何在react-select中设置默认值


86

我在使用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 '17

您想要什么价值?
Ved

Answers:


62

我猜你需要这样的东西:

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}
  />
);

5
与redux / react绑定的重点是ui可以实时反映对象的值。这种方法解脱了这种约束。考虑在减速器中设置默认值。
约瑟夫·尤克

2
@JosephJuhnke首先检查问题。设置默认值的方法。
Ved

5
selectedValue已更改为value。检查文档react-select.com/props
Transang

9
defaultValue新版本中现在有字段。
苗洪波

3
棘手的事情是您需要将所选对象设置为“ defaultValue”字段,而不是选项的值。例如0,1,2
andyCao

46

我使用了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接受对象而不只是值。
丹尼斯·刘

1
不是根据React docs或intelisense的说法,它不是:reactjs.org/docs/uncontrol-components.html#default-values
Alex

38

如果你来这里是为了反应选V2,以及仍然存在问题-第2版现在只接受一个对象作为valuedefaultValue等等。

也就是说,尝试使用value={{value: 'one', label: 'One'}}而不是value={'one'}


非常感谢
Johnny Bigoode

不完整。如果您为此设置值,就不能再更改其值
Toskan

@Toskan-是的,这是ReactJS和单向数据绑定的原理之一,不仅会影响此库,还会影响所有表单元素。如果选择具有受控组件,则需要在react之外自己处理更改。通过对关于它和链接这个答案的谈判阵营文档:stackoverflow.com/questions/42522515/...
eedrah

好吧,那么您解决的问题是什么?也就是说,硬编码一个值?
托斯坎

{value: 'one', label: 'One'}这里给出的情况仅是示例。在您的应用程序中,这将是具有相同结构的变量/ prop。
eedrah

13

我有一个类似的错误。确保您的选项具有值属性。

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

然后,将选择元素值最初与选项值匹配。

<select 
    value={this.value} />

我认为这是最好/最优雅的解决方案。我认为正确吗?
user2026178

如果这样做的话,值将不会更改,您也已经写了onChange函数来设置更改
raghul

1
这是针对普通HTML <select>元素的,而不是对react-select <Select>的回答,这是要解决的问题。套管可以起到所有作用:)
Mike Goatly

5

扩展@ 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 onselect不应该为null。考虑使用空字符串清除组件或undefined不受控制的组件。
杰森·赖斯

我正在做同样的事情,并且收到以下警告: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

我自己亲自检查了一下,并选择在reducer 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}
       ...
  />
)}


0

如果您的选择是这样的

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

{props.input.value}应该匹配的一个'value'{props.options}

含义,props.input.value应为'one''two'


0

要自动选择in的值。

在此处输入图片说明

<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属性

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

解决方案对我有用。


0
  1. 在构造函数中为默认选项文本创建一个state属性
    • 不用担心默认选项值
  2. 将选项标签添加到渲染功能。仅显示使用状态和三元表达式
  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

我经常使用这样的东西。

此示例中道具的默认值

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> 
}

0

如果在选项中使用组,则需要进行深度搜索:

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;
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.