gpt4 book ai didi

ReactJS:来自 State 的动态复选框

转载 作者:行者123 更新时间:2023-12-03 13:21:25 24 4
gpt4 key购买 nike

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

我在状态设置方面遇到了困难。我正在考虑以下内容,我想通过 API 调用在 ComponentWillMount 期间设置初始状态:

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,output

希望这有帮助!

关于ReactJS:来自 State 的动态复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38081586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com