Warning: Use the 'defaultValue' or 'value' props on <select> instead of setting 'selected' on

前端 未结 5 996
陌清茗
陌清茗 2020-12-29 18:11

SCENARIO A user has a dropdown and he selects an option. I want to display that dropdown and make that option a default value which was selected by that use

相关标签:
5条回答
  • 2020-12-29 18:18

    In an instance where you want to set a placeholder and not have a default value be selected, you can use this option.

          <select defaultValue={'DEFAULT'} >
            <option value="DEFAULT" disabled>Choose a salutation ...</option>
            <option value="1">Mr</option>
            <option value="2">Mrs</option>
            <option value="3">Ms</option>
            <option value="4">Miss</option>
            <option value="5">Dr</option>
          </select>
    

    Here the user is forced to pick an option!

    EDIT

    If this is a controlled component

    In this case unfortunately you will have to use both defaultValue and value violating React a bit. This is because react by semantics does not allow setting a disabled value as active.

     function TheSelectComponent(props){
         let currentValue = props.curentValue || "DEFAULT";
         return(
          <select value={currentValue} defaultValue={'DEFAULT'} onChange={props.onChange}>
            <option value="DEFAULT" disabled>Choose a salutation ...</option>
            <option value="1">Mr</option>
            <option value="2">Mrs</option>
            <option value="3">Ms</option>
            <option value="4">Miss</option>
            <option value="5">Dr</option>
          </select>
        )
    }
    
    0 讨论(0)
  • 2020-12-29 18:35

    React uses value instead of selected for consistency across the form components. You can use defaultValue to set an initial value. If you're controlling the value, you should set value as well. If not, do not set value and instead handle the onChange event to react to user action.

    Note that value and defaultValue should match the value of the option.

    0 讨论(0)
  • 2020-12-29 18:36

    Thank you all for this thread! My colleague and I just discovered that the default_value property is a Constant, not a Variable.

    In other React forms I've built, the default value for a Select was preset in an associated Context. So the first time the Select was rendered, default_value was set to the correct value.

    But in my latest React form (a small modal), I'm passing the values for the form as props and then using a useEffect to populate the associated Context. So the FIRST time the Select is rendered, default_value is set to null. Then when the Context is populated and the Select is supposed to be re-rendered, default_value cannot be changed and thus the initial default value is not set.

    The solution was ultimately simple: Use the value property instead. But figuring out why default_value didn't work like it did with my other forms took some time.

    I'm posting this to help others in the community.

    0 讨论(0)
  • 2020-12-29 18:43

    What you could do is have the selected attribute on the <select> tag be an attribute of this.state that you set in the constructor. That way, the initial value you set (the default) and when the dropdown changes you need to change your state.

    constructor(){
      this.state = {
        selectedId: selectedOptionId
      }
    }
    
    dropdownChanged(e){
      this.setState({selectedId: e.target.value});
    }
    
    render(){
      return(
        <select value={this.selectedId} onChange={this.dropdownChanged.bind(this)}>
          {option_id.map(id =>
            <option key={id} value={id}>{options[id].name}</option>
          )}
        </select>
      );
    }
    
    0 讨论(0)
  • 2020-12-29 18:43

    With Hooks and useState

    Use defaultValue to select the default value.

        const statusOptions = [
            { value: 1, label: 'Publish' },
            { value: 0, label: 'Unpublish' }
        ];
        const [statusValue, setStatusValue] = useState('');
        const handleStatusChange = e => {
            setStatusValue(e.value);
        }
    
    return(
    <>
    <Select options={statusOptions} 
        defaultValue={[{ value: published, label: published == 1 ? 'Publish' : 'Unpublish' }]} 
        onChange={handleStatusChange} 
        value={statusOptions.find(obj => obj.value === statusValue)} required />
    </>
    )
    
    0 讨论(0)
提交回复
热议问题