Laf*_*flm 17 javascript mapping checkbox ecmascript-6 reactjs
我有一个函数,一旦选中主复选框,就会触发子复选框,所有这些复选框都是从JSON映射的。单击时会显示主要复选框(最高级别)及其下的所有子级复选框(第二级),并且效果很好,我要显示的是单击时主要复选框(第3级)的那些子级的子级第二级项目。
基本上是在检查时将所有三个订单都显示在彼此的下面,并将第三个订单添加到当前代码中,因此选项组显示Options,而Options下是我要显示的内容,分别是Option 1,Option 2,Option 3等等。上..
复选框值作为道具从Checkbox.js传递到发生提取/映射的Itemlist.js。
(PS我对每个部分都有选择限制,以防万一有人对选择过程感到困惑,这与这个问题无关,可以忽略)
主代码段:https ://codesandbox.io/embed/6jykwp3x6n ? fontsize =14
仅用于演示的第三级目标框:https : //codesandbox.io/embed/o932z4yr6y?fontsize=14,
Checkbox.js
import React from "react";
import "./Checkbox.css";
class Checkboxes extends React.Component {
constructor(props) {
super(props);
this.state = {
currentData: 0,
limit: 2,
checked: false
};
}
selectData(id, event) {
let isSelected = event.currentTarget.checked;
if (isSelected) {
if (this.state.currentData < this.props.max) {
this.setState({ currentData: this.state.currentData + 1 });
} else {
event.preventDefault();
event.currentTarget.checked = false;
}
} else {
if (this.state.currentData >= this.props.min) {
this.setState({ currentData: this.state.currentData - 1 });
} else {
event.preventDefault();
event.currentTarget.checked = true;
}
}
}
render() {
const input2Checkboxes =
this.props.options &&
this.props.options.map(item => {
return (
<div className="inputGroup2">
{" "}
<div className="inputGroup">
<input
id={this.props.childk + (item.name || item.description)}
name="checkbox"
type="checkbox"
onChange={this.selectData.bind(
this,
this.props.childk + (item.name || item.description)
)}
/>
<label
htmlFor={this.props.childk + (item.name || item.description)}
>
{item.name || item.description}{" "}
</label>
</div>
</div>
);
});
return (
<form className="form">
<div>
{/** <h2>{this.props.title}</h2>*/}
<div className="inputGroup">
<input
id={this.props.childk + this.props.name}
name="checkbox"
type="checkbox"
checked={this.state.checked}
onChange={this.selectData.bind(
this,
this.props.childk + this.props.uniq
)}
onChange={() => {
this.setState({
checked: !this.state.checked,
currentData: 0
});
}}
/>
<label htmlFor={this.props.childk + this.props.name}>
{this.props.name}{" "}
</label>
</div>{" "}
{this.state.checked ? input2Checkboxes : undefined}
</div>
</form>
);
}
}
export default Checkboxes;
Run Code Online (Sandbox Code Playgroud)
Itemlist.js发生映射功能的位置
...
const selectedItem =
selectedChild.children && selectedChild.children.length
? selectedChild.children[this.state.itemSelected]
: null;
...
<div>
{selectedItem &&
selectedItem.children &&
selectedItem.children.map((item, index) => (
<Checkboxes
key={index}
name={item.name || item.description}
myKey={index}
options={item.children}
childk={item.id}
max={item.max}
min={item.min}
/>
))}
</div>
...
Run Code Online (Sandbox Code Playgroud)
该问题是一个递归问题。显示选项组时,会显示该组复选框及其选项。显示选项时,必须考虑它们的类型。
ingredient,则可以显示一个简单的复选框。group,则必须显示一个新选项组及其选项,如上所述。这就是您的代码中缺少的内容。这是一个正在运行的沙箱,修复方法如下:
在 Checkbox.js 中:
const input2Checkboxes =
this.props.options &&
this.props.options.map((item, index) => {
// Is the option a 'group' or an 'ingredient'?
return item.type === "group" ? (
{/* It's a group so display its options recursively */}
<Checkboxes
key={index}
name={item.name || item.description}
options={item.children}
childk={this.props.childk}
max={item.max}
min={item.min}
/>
) : (
{/* It's an ingredient so display a simple checkbox */}
<div className="inputGroup2" key={item.name || item.description}>
{" "}
<div className="inputGroup">
<input
id={this.props.childk + (item.name || item.description)}
name="checkbox"
type="checkbox"
onChange={this.selectData.bind(
this,
this.props.childk + (item.name || item.description)
)}
/>
<label
htmlFor={this.props.childk + (item.name || item.description)}
>
{item.name || item.description}{" "}
</label>
</div>
</div>
);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |