【问题标题】:React JSX: selecting “selected” on selected <select> option with default option have issuesReact JSX:使用默认选项在选定的 <select> 选项上选择“selected”有问题
【发布时间】:2025-12-07 16:15:02
【问题描述】:

我知道,* Link 有一个相关问题

  • 但我在设置 defaultValue 时遇到问题。
  • valueonChange 有效
  • 即使使用defaultValue="m"defaultValue="f" 也可以使用
  • 但是在动态设置 defaultValue 时不起作用。
// value of member.gender is 'f' and confirmed from console.log
<div className="col-3">
  <select name="gender" id="id_gender" defaultValue={member.gender}>
    <option value="m" >Male</option>
    <option value="f">Female</option>
  </select>
</div>
  • member.gender 的值是 "f",但始终是 Male,即第一个选项被选中。
  • 尝试使用包含在刻度中的 "${member.gender}" 引用 {member.geder} 不起作用。
  • 我正在使用基于useRef 的方法,让表单表现为不受控制的组件。因此需要为选择元素提供默认值。

【问题讨论】:

  • 如果是不受控制的组件,则不需要提供默认值。 DOM 处理它。这就是为什么我们称它为不受控制的组件
  • 当您选择不同的选项时,DOM 会自动更新 select 的 UI。

标签: reactjs jsx


【解决方案1】:

不用在每个选项上定义defaultValueselected,您可以在选择标签本身上写value={member.gender}

<div className="col-3">
  <select name="gender" id="id_gender" value={member.gender}>
    <option value="m" >Male</option>
    <option value="f">Female</option>
  </select>
</div>

【讨论】:

  • 正如我在问题描述和对另一个答案的评论中提到的,这种方法需要我使用state 和一个函数来处理onChange 事件,我不想这样做。
【解决方案2】:

Reactjs 库提供了两种处理表单元素的选项。

  1. 受控组件 - 如果您需要根据表单值更改 UI 中的某些内容,请使用此选项。
import { Component } from "react";

class App extends Component {
  state = {
    gender: "",
  }; // Step 1 - Create a property related to `select` form element in state object

  onChange = (e) => {
    const val = e.target.value;
    e.preventDefault();
    this.setState(() => ({
      gender: val,
    })); // Step 5 - You can update the value by using `setState` 
  }; // Step 3 - Create a method for `select` form element onChange event

  render() {
    return (
      <div className="col-3">
        <select
          name="gender"
          id="id_gender"
          value={this.state.gender} {/* Step 2 - Set that `select` related state property to value attribute */}
          onChange={this.onChange} {/* Step 4 - Set that method to onChange event */}
        >
          <option value="m">Male</option>
          <option value="f">Female</option>
        </select>
      </div>
    );
  }
}

export default App;
  1. 不受控制的组件 - 如果您只需要形成数据以保存在数据库中,那么您可以使用此选项。
import { Component, createRef } from "react";

class App extends Component {
  constructor(props) {
    super(props);
    this.selectEle = createRef(); // Step 1 - Create the reference
    this.onSubmit = this.onSubmit.bind(this);
  }

  onSubmit = (e) => {
    e.preventDefault();
    alert(this.selectEle.current.value); // Step 3 - You can access to the value like this.
  };

  render() {
    return (
      <div className="col-3">
        <select name="gender" id="id_gender" ref={this.selectEle}> {/* Step 2 - Add the reference to `select` element */}
          <option value="m">Male</option>
          <option value="f">Female</option>
        </select>
        <button type="submit" onClick={this.onSubmit}>
          Submit
        </button>
      </div>
    );
  }
}

export default App;

【讨论】:

  • 但这并不能解决手头的问题。如果我们只使用值,要么我们需要证明onChange,要么我们根本无法更改selected 选项。我正在寻找一种选择 defaultValue 的方法,但你没有给出任何线索。
  • 这些是官方推荐的。因此,如果您可以将代码更新为这些选项之一,那就更好了。
  • 我正在遵循基于不受控制的组件的方法。所以需要设置一个默认值,因为这个表单是用来更新现有模型实例的。如果我提供defaultValue="m"defaultValue="f" 效果很好。但是我需要根据模型实例的当前状态动态设置默认值。使用 JSX 表达式似乎存在一些问题。
  • 查看我对受控和不受控组件的解释。如果你想控制select 元素 UI,那么你必须使用 Controlled Components 选项。不要因为使用错误的选项而使事情变得复杂。始终尝试遵循最佳做法。
  • 如果您使用受控组件选项,您可以如上所述轻松更改selected选项。