在 <select>
菜单的React组件中,我需要在反映应用程序状态的选项上设置 selected
属性 .
在 render()
中, optionState
从状态所有者传递到SortMenu组件 . 选项值作为 props
从JSON传入 .
render: function() {
var options = [],
optionState = this.props.optionState;
this.props.options.forEach(function(option) {
var selected = (optionState === option.value) ? ' selected' : '';
options.push(
<option value={option.value}{selected}>{option.label}</option>
);
});
// pass {options} to the select menu jsx
但是,这会在JSX编译时触发语法错误 .
这样做可以消除语法错误,但显然无法解决问题:
var selected = (optionState === option.value) ? 'selected' : 'false';
<option value={option.value} selected={selected}>{option.label}</option>
我也试过这个:
var selected = (optionState === option.value) ? true : false;
<option value={option.value} {selected ? 'selected' : ''}>{option.label}</option>
有没有推荐的解决方法?
10 回答
当你尝试设置
<option>
的"selected"属性时,你可以做React警告你的事情:因此,您可以在选择的
defaultValue
上使用options.value
只需添加选择标记的第一个选项:
这将成为默认值,当您选择有效选项时,将在您的州设置
当状态发生变化时,
<select>
标签没有更新到正确的<option>
时出现问题 . 我的问题似乎是,如果你快速连续渲染两次,第一次没有预先选择<option>
但第二次有一次,那么<select>
标签不会在第二次渲染时更新,而是保持默认优先 .我找到了一个使用refs的解决方案 . 您需要获取对
<select>
标记节点的引用(可能嵌套在某个组件中),然后在componentDidUpdate
钩子中手动更新其上的value
属性 .我有一个简单的解决方案是遵循HTML基础 .
.text-hide
是一个bootstrap的类,如果你不使用bootstrap,你在这里:React自动为此目的理解布尔值,所以你可以简单地写 (note: not recommended)
它会适当地输出'选中' .
但是,React让您更轻松 . 而不是在每个选项上定义
selected
, you can (and should) simply write value= on the select tag itself :有关详细信息,请参阅the React select tag doc .
我通过设置defaultProps解决了类似的问题:
<select value="this.props.propName" ...
因此,如果我的道具在安装之前不存在,我现在可以避免编译错误 .
这是一个完整的解决方案,其中包含了最佳答案和下面的评论(这可能有助于某些人努力拼凑起来):
在主要组成部分:
包含组件(现在是无状态功能):
主要组件维护水果的选定值(处于状态),包含的组件显示select元素,更新被传递回主组件以更新其状态(然后循环回包含的组件以更改所选值) .
请注意使用名称prop,它允许您为同一表单上的其他字段声明单个handleChange方法,而不管其类型如何 .
为MULTISELECT / optgroups发布类似的答案:
这是如何做到的最新例子 . 从react docs开始,加上自动绑定"fat-arrow"方法语法 .