为啥 React 说不要在 <option> 元素上设置 'selected' 属性?

Posted

技术标签:

【中文标题】为啥 React 说不要在 <option> 元素上设置 \'selected\' 属性?【英文标题】:Why does React say not to set 'selected' property on <option> elements?为什么 React 说不要在 <option> 元素上设置 'selected' 属性? 【发布时间】:2016-08-10 19:00:54 【问题描述】:

[edit] 这是由于我自己的困惑,道歉。

在 JSX 中为 &lt;option&gt; 元素设置 selected 属性效果很好,但它会导致 React 抛出警告:

Warning: Use the 'defaultValue' or 'value' props on &lt;select&gt; instead of setting 'selected' on &lt;option&gt;.

在父 &lt;select&gt; 元素上设置 defaultValue 会导致 &lt;select&gt;value 默认为该设置,但不会设置默认选中的 &lt;option&gt;。因此,这会使用户看到的内容与实际选择的内容不同步。

在父 &lt;select&gt; 元素上设置 value 属性迫使我添加一个 onChange 处理程序,将值设置为组件状态,并编写一堆额外的代码来完成简单地设置 selected &lt;option&gt; elements 只用一个词。

有人知道为什么 React 会抛出这个警告吗?我不想编写一堆额外的代码来删除似乎与现实不相符的警告。据我所知,它工作得很好,那我为什么不使用它呢?

【问题讨论】:

你说defaultValue 没有“设置默认选择&lt;option&gt;”对我来说似乎是什么意思? &lt;select defaultValue="B"&gt; &lt;option&gt;"A"&lt;/option&gt; &lt;option&gt;"B"&lt;/option&gt; &lt;option&gt;"C"&lt;/option&gt; &lt;/select&gt; 在该代码示例中,当组件首次呈现时,选择元素的值是“B”,但用户看到的“默认选择”是 A,因为它会是如果我没有设置 defaultValue 道具。 嗯?但事实并非如此.. jsfiddle.net/69z2wepo/39163 是的,你是对的,对不起。我恳求暂时的精神错乱。我试图将 defaultValue 匹配到选项的内容而不是选项的值(在我的用例中是不同的)。很抱歉造成混乱。 @rodwa4: “我试图将 defaultValue 匹配到选项的内容而不是选项的值(在我的用例中是不同的)” ,这不是select 元素的工作方式。值是 ,而不是文本,它们不同。 【参考方案1】:

以下是伴随该警告的 React 文档: https://facebook.github.io/react/docs/forms.html

如果您按照他们建议的方式进行操作,您可以使用“值”属性渲染您的 &lt;SELECT&gt; 组件。然后,您需要为 onChange 事件编写一个处理函数,以确保组件重新渲染以反映用户更改的选择。

如果您尝试在单个 &lt;OPTION&gt; 元素级别管理此信息流,我认为您将面临相同的挑战,然后是一些挑战。例如,假设在页面加载时选择了选项 A。然后用户选择选项 B。选项 B 需要重新渲染才能显示为选中,选项 A 需要重新渲染才能显示为未选中。要使选项 B 上的 onClick 事件触发选项 A 的更改,必须将信息从选项 B 传递到父 Select 元素,然后再传递到选项 A 元素。

React 文档还谈到了一个“不受控制的”&lt;SELECT&gt; 元素,我认为这意味着它最初会渲染一次(您可以为其指定一个 defaultValue,但 React 不会继续实时重新渲染它.

【讨论】:

嗯,我想我明白你在说什么,但它似乎与实际发生的情况不一致。这是我的代码:&lt;select&gt; &lt;option key=1&gt;Option A&lt;/option&gt; &lt;option key=2 selected&gt;Option B&lt;/option&gt; &lt;option key=3&gt;Option C&lt;/option&gt; &lt;/select&gt; 该代码根本不像您描述的那样。它最初以“选项 B”和“选项 B”的值呈现。当用户单击并选择“选项 C”或“选项 A”时,相应的选定选项现在既被选中,又被选中。它只是简单地工作,无需额外的跑腿。

以上是关于为啥 React 说不要在 <option> 元素上设置 'selected' 属性?的主要内容,如果未能解决你的问题,请参考以下文章

为啥说,信号处理函数里面不要用printf等库函数

react和vue区别以及为啥会说react适合大型项目

<select> <option>里头为啥不能放<img src='imagePath' />

为啥使用 Optional.of 而不是 Optional.ofNullable?

为啥 std::optional<int> 的构造比 std::pair<int, bool> 更昂贵?

为啥错误:重新渲染太多。 React 限制了渲染的数量以防止无限循环。?