ReactJS:状态中的动态复选框

我有一个动态的元素集合,所以我不预先知道该集合的内容是什么。我想动态呈现这些复选框,并在默认情况下将其全部选中。您应该能够取消选中这些框,这将触发渲染中的另一个贴图功能。(所以基本上是我的过滤器)

我正在努力进行状态设置。我在考虑以下问题,我想在其中通过API调用在ComponentWillMount期间设置initialState:

scenario 1 (arrays):

this.state {

checkboxes: [value1, value2, value3],

checkedcheckboxes: [value1, value2]

}

然后,我可以使用react.addons.update函数来更改复选框状态。缺点是,在渲染复选框期间,我必须遍历每个复选框上带有indexOf的checkcheckboxes数组,以查看是否应对其进行检查。

scenario 2 (object):

this.state {

checkboxes: {

value1: true,

value2: true,

value3: false

}

这样,我就有了动态键,这使工作变得更加困难(我想),因为我必须在setState中使用计算字段。我还对这可能会对我的表现产生负面影响的印象。

有没有关于这种模式的最佳实践?

谢谢!

回答:

我可能会将您的状态设置为包含一个对象数组(代表您的复选框)和一个代表过滤器的字符串。每个复选框对象将包含两个属性,即标签的文本和复选框的值。

对于初始状态,您希望此数组为空,然后在componentDidMount生命周期内执行API调用,并将状态设置为包括收到的信息。

constructor(props) {

super(props);

this.state = {

checkboxes: [],

filter: 'ALL'

};

//each checkbox would take the form of {label: 'some label', checked: true}

}

componentDidMount() {

getData(response => { //some API call

this.setState({

checkboxes: response.body

});

});

}

为了使您的组件呈现这些复选框,它需要了解处于状态的复选框对象与实际DOM元素的关系。您可以创建一个辅助函数.map来实现此目的。您还可以利用.filter将过滤器应用于状态中的每个对象,并摆脱与过滤器不匹配的对象。

function renderCheckboxes() {

const {checkboxes, filter} = this.state;

return checkboxes

.filter(checkbox =>

filter === 'ALL' ||

filter === 'CHECKED' && checkbox.checked ||

filter === 'UNCHECKED' && !checkbox.checked

)

.map((checkbox, index) =>

<div>

<label>

<input

type="checkbox"

checked={checkbox.checked}

onChange={toggleCheckbox.bind(this, index)}

/>

{checkbox.label}

</label>

</div>

);

}

注意每个复选框如何将onChange属性映射到某个函数?您需要将其提供给使用该checked属性呈现的每个复选框,因为您将创建一个Controlled

Component,并且您的状态将控制是否检查每个单独的组件。您的toggleCheckbox函数可能看起来像这样:

function toggleCheckbox(index) {

const {checkboxes} = this.state;

checkboxes[index].checked = !checkboxes[index].checked;

this.setState({

checkboxes

});

}

创建将过滤器设置为其他字符串的函数可能也很有用:

function updateFilter(filter) {

this.setState({

filter

});

}

最后,您可以在函数中使用以下功能render来显示复选框以及用于更新过滤器状态的链接(我还添加了一些不间断的空格来分隔每个过滤器链接):

render() {

return (

<div>

{renderCheckboxes.call(this)}

<div>

<h4>Filters ({this.state.filter})</h4>

<a href="#" onClick={updateFilter.bind(this, 'ALL')}>ALL</a>

&nbsp;|&nbsp;

<a href="#" onClick={updateFilter.bind(this, 'CHECKED')}>CHECKED</a>

&nbsp;|&nbsp;

<a href="#" onClick={updateFilter.bind(this, 'UNCHECKED')}>UNCHECKED</a>

</div>

</div>

);

}

这是此工作的示例-减去API调用:

https://jsbin.com/bageyudaqe/edit?js,输出

希望这可以帮助!

以上是 ReactJS:状态中的动态复选框 的全部内容, 来源链接: utcz.com/qa/423027.html

回到顶部