【发布时间】:2015-12-15 04:07:14
【问题描述】:
我在下面有一个工作组件,它允许所有复选框和复选框。它完美地工作。但是,我讨厌每次想要使用此功能时都被困在携带所有这些代码的想法。我正在寻找一种反应方式来制作这个模块化?这是吗
它不会将“输入检查所有”功能的全部功能模块化在一个地方。我必须在每次使用时移动 getInitialState 变量和 changeHandlers。
我认为如果“输入复选框全部”在功能上是 HTML 中的原生功能,我们将如何使用它?我们只需要为元素提供属性,它们会相互引用,所有的处理程序都会在后台发生,使用起来很简单。我对这个示例的目标是实现 HTML 级别的简单性。我上面展示的代码并没有实现这一点,因为它与函数处理程序和状态初始化程序有关。 react 是否提供了一种抽象方法?
下面是我想要的这个组件的 API。
主要问题有:
- 组件功能与父级无关,这意味着父级不需要存储处理程序和状态的信息。
- 代码目前手动跟踪每个复选框的状态,这意味着如果不说明,就无法动态查找 DOM 中有多少个复选框。
- 整体模块化和易用性。
代码如下:
var InputCheckbox = React.createClass({
getDefaultProps: function () {
return {
checked: false
}
},
render: function () {
return (
<input
checked={this.props.checked}
type='checkbox'
{...this.props}/>
)
}
})
var Test = React.createClass({
getInitialState: function () {
return {
checked: [false, false, false]
}
},
selectAll: function (event) {
// Set all checked states to true
this.setState({
checked: this.state.checked.map(function () {
return event.target.checked
})
})
},
handleChange: function (index, event) {
var checked = this.state.checked
checked[index] = event.target.checked
this.setState({
checked: checked
})
},
render: function () {
var isAllChecked = this.state.checked.filter(function (c) {
return c
}).length === this.state.checked.length
return (
<div>
Select All:
<InputCheckbox onChange={this.selectAll} checked={isAllChecked}/>
<br/>
<InputCheckbox checked={this.state.checked[0]} onChange={this.handleChange.bind(this, 0)}/>
<br/>
<InputCheckbox checked={this.state.checked[1]} onChange={this.handleChange.bind(this, 1)}/>
<br/>
<InputCheckbox checked={this.state.checked[2]} onChange={this.handleChange.bind(this, 2)}/>
<br/>
</div>
)
}
})
React.render(<Test/>, document.body)
理想情况下,我可以像这样使用它:
var Checkbox = require('./Checkbox')
var Test = React.createClass({
render: function () {
return (
<div>
<Checkbox id="alpha"/>
<Checkbox htmlFor="alpha"/>
<Checkbox htmlFor="alpha"/>
<Checkbox htmlFor="alpha"/>
</div>
)
}
})
【问题讨论】:
-
现在你有了测试组件来管理复选框的状态。最好将该逻辑移至 Store。并将每个复选框包装到一个包装器组件中,该组件从存储中读取
checked状态并将其作为道具传递给复选框。 -
@oluckyman 嘿,你能在答案中证明这是什么样子吗?有点困惑你所说的“包装每个复选框”是什么意思。
-
将数据提取到商店中与所要求的相反 - 与商店相关的任何组件都不能在不同的区域或应用程序中重复使用
标签: javascript html checkbox reactjs components