- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我提出了一个基于 JSON 数据的预检查单选按钮的解决方案,但我认为代码可以改进。或者应该有更好的实现方式。数据结构如下:
{
radioA: 'Radio A',
radioB: 'Radio B',
radioC: 'Radio C',
selected: 'Radio A'
}
不确定这是否是最好的方法。如果需要,可以修改数据结构。
根据提供的数据,我正在渲染单选按钮,其中一个是预选的。以下是我的。
var App = React.createClass({
getInitialState: function(){
return {
radioA: 'Radio A',
radioB: 'Radio B',
radioC: 'Radio C',
selected: 'Radio A'
}
},
render: function(){
return(
<div>
{Object.keys(this.state).map(function(key) {
// Not displaying the selected data
if(key !== 'selected'){
// Checked radio button
if(this.state[key] == this.state['selected']){
return(
<div>
<label className="radio-inline" key={key} htmlFor={key}>
<input id={key} type="radio" checked value={key} /> {this.state[key]}
</label>
</div>
);
}
else{
return(
<div>
<label className="radio-inline" key={key} htmlFor={key}>
<input id={key} type="radio" value={key} /> {this.state[key]}
</label>
</div>
);
}
}
}, this)}
</div>
);
}
});
React.render(<App />, document.getElementById('container'));
代码设置如下jsfiddle.com https://jsfiddle.net/rexonms/2x7ey2L5/
有没有更好的解决方案来实现这个?提前致谢
最佳答案
确实有更好的办法。在你的render
方法,你的两个分支里面的 JSX if
语句是相同的,除了一个有 checked
而另一个则没有。像这样的重复可以——而且应该——几乎总是被清理干净。
Note: This answer was written with React 0.14 in mind. To see the code as written with more modern React idioms, see this revision.
在像 checked
这样的 bool 属性的情况下在 JSX 中,您可以给它们一个 truthy 或 falsy 值来控制渲染的 HTML 元素是否具有该属性。换句话说,如果你有 <input checked={10 > 1}/>
,你会得到 <input checked/>
.如果你有 <input checked={10 > 100}/>
,你会得到 <input/>
.
考虑到这一点,我们可以将您的代码简化为如下内容:
var App = React.createClass({
getInitialState: function() {
return {
radios: {
radioA: 'Radio A',
radioB: 'Radio B',
radioC: 'Radio C'
},
selected: 'radioA'
}
},
renderRadioWithLabel: function(key) {
var isChecked = key === this.state.selected;
return (
<label className="radio-inline" key={key} htmlFor={key}>
<input id={key} type="radio" checked={isChecked} value={key} />
{this.state.radios[key]}
</label>
);
},
render: function() {
return (
<div>
{Object.keys(this.state.radios).map(function(key) {
return this.renderRadioWithLabel(key);
}, this)}
</div>
);
}
});
React.render(<App />, document.getElementById('container'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react-dom.min.js"></script>
<div id="container"></div>
如您所见,我将呈现单选按钮及其标签的逻辑分解为它自己的函数。你不必这样做,但我发现它使 render
具有内部循环的函数更易于阅读,并使您的意图更清晰。
有些人,包括我自己,会提倡将逻辑分解成它自己的组件,这样您就可以拥有一个有状态的容器组件和无状态的子组件,这使得整个事情更容易测试。 Here's a good article on the topic.您可能还想做的另一件事是在数组中创建键和标签列表,因为对象属性的顺序在 JavaScript 中无法保证。如果您想知道这些更改会是什么样子,请查看此代码段:
var Radio = React.createClass({
render: function() {
var key = this.props.key;
return (
<label className="radio-inline" key={key} htmlFor={key}>
<input id={key} type="radio" checked={this.props.selected} value={key} />
{this.props.label}
</label>
);
}
});
var RadiosContainer = React.createClass({
getInitialState: function() {
return { selected: this.props.initialSelected };
},
render: function() {
return (
<div>
{this.props.radios.map(function(radioProps) {
var selected = this.state.selected === radioProps.key;
return <Radio {...radioProps} selected={selected} />;
}, this)}
</div>
);
}
});
var radios = [
{ key: 'radioA', label: 'Radio A' },
{ key: 'radioB', label: 'Radio B' },
{ key: 'radioC', label: 'Radio C' }
];
var selectedRadio = 'radioB';
React.render(
<RadiosContainer radios={radios} initialSelected={selectedRadio} />,
document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.8/react-dom.min.js"></script>
<div id="container"></div>
关于javascript - 如何在 React 中呈现选中的单选按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30579763/
HTML 部分,只是我代码的一部分: HP: SP: EA: ED: PA: PD:
我有这个简单的脚本。我正在尝试获取选中的值并将它们添加到禁用输入框中的运行总计中。我知道它正在被选中,但它没有更新到输入框,我不确定为什么。谁能帮帮我? function updateF
我在使用自定义背景的单选按钮/复选框时遇到了问题。我在这里设计了它们的样式:Quick Tip: Easy CSS3 Checkboxes and Radio Buttons .主要部分是input在
我可以预见地读取 jQueryUI 单选按钮的值,但是,我无法以编程方式设置它。无论我使用哪种方法更改单选按钮的值,jQueryUI 界面都不会更新其界面。 Yes No
没有展开时 点击展开之后 <div class="flashread_item_box_time"> <span class="
这里是 JQuery 新手。 我有一个大约有 16 个字段的搜索表单,其中大部分是文本框。其余的都是下拉菜单。我在这些字段下方有 3 个单选按钮。当选择第一个时,表单中的某些字段应被禁用。当选择第二个
我目前正在构建一个 Fiori 应用程序用于查看事件(票证)。我必须创建一个饼图,其中包含票证的所有不同状态。当我单击图表的一部分时,它会将我带到包含该状态的所有票证的列表。我可以选择饼图的多个状态,
此代码将在使用 reloadData 刷新 UITableView 后恢复单元格选择: NSIndexPath *selectedIndexPath = [self.tableView indexPa
我正在尝试对 UITableView 单元格进行自定义选择。为此,我在我的单元格上方创建了 UIView,它现在在触摸时出现/消失。但问题是当我按下单元格选择时出现。如果那时我选择任何其他行,它也会被
我所有的复选框、单选框和文本输入都在 ID 的末尾附加了“_boom”。我想抓取这些 id 的页面,检测更改以查看其中是否有任何一个与其原始状态不同,如果是,则将 CSS 应用于页面上名为“保存”的按
我正在寻找一种方法,使多选列表框应显示为普通的单选组合框,但在单击时它应作为允许多选的列表框,如下所示,如电子表格中所示。我正在寻找 CSS HTML 和 javascript 而非 Jquery 中
我有一个 HTML 我想显示为“列表框”(一个同时显示多个元素的框,而不是下拉框)。但是,我只想允许选择一个元素。我还想将盒子的高度(通过 CSS)设置为其容器大小的 100%。 这三件事似乎是相互排
我有一个包含三个部分的付款表格。基本上,第一个是带有乘数的“单选”列表,第二个是带有设置值的“复选框”列表,第三个是带有乘数的下拉列表 ==> (jsfiddle) .为清楚起见,我插入了一个文本框来
我想删除单选按钮,只显示是或否标签。为此,我隐藏了 radio 输入并使用 css3 选择器 (:checked + label) 根据选择更改背景颜色。但由于某种原因,这不起作用。 HTML(来自
我正在使用这个插件http://www.erichynds.com/examples/jquery-ui-multiselect-widget/demos/#single对于多选,并且希望也可以在同一
我收到了这段代码,但我似乎无法正常工作,我查看了之前的问题,但找不到任何与之完全相同的代码。也许这完全是错误的,应该重新开始? 我想要做的是在选择单选按钮时显示一个 div。这是我的代码: jQue
我试图在用户点击输入(单选、复选框或选择)时移除焦点背景,但它不起作用。这些是我放在元素上的样式: .form-holder input[type="radio"]:focus, .form-
我正在使用 Bootstrap 4 并想使用单选按钮和复选框按钮组,但按钮显示的是实际的单选按钮和复选框 UI 元素,如下所示: 上面的例子直接摘自文档。我试过删除并重新安装 Bootstrap 4,
我正在使用 Collection View 进行水平滚动。它工作得很好。现在我想为选择任何单元格设置任何效果。所以,我写了这段代码” func collectionView(collectionVi
我有一个按钮组,其中包含必须充当单选按钮的几个项目。我还需要将它们分成几行并跨越容器的整个宽度。 为此,我使用了 Bootstrap 的类 btn-group-justified ,然后我拆分 元素分
我是一名优秀的程序员,十分优秀!