单独折叠每个按钮,而不是一次全部折叠
Collapse each button uniquely, instead of all at once
我有一个 <div>
标签,其中包含不同数量的按钮。单击每个按钮时,我都会显示一个反应变量。我的问题是,每当我单击任何按钮时,每个隐藏文本都会显示;但是我只希望按钮在我单击它们时显示它们的隐藏文本,以便它们表现得独一无二。
我尝试了一些条件渲染的想法,但我不确定如何正确地进行攻击。
我有一个函数可以为每个教堂创建按钮。这是该函数:
createButtonsForChurches(arr) {
var listOfButtons = [];
for (var i = 1; i < arr.length; i++) { // loop through each church
var currentButton = (
<div>
<button onClick={this.toggle} className="churchButton">{arr[i].name}</button>
{
this.state.on && (
<div className="allContent">
<div className="individualContent">
{(arr[i].femaleStudents[0]) && this.createContentParagraphTextForArray(arr[i].femaleStudents, "Female Students")}
</div>
<div className="individualContent">
{(arr[i].femaleLeaders[0]) && this.createContentParagraphTextForArray(arr[i].femaleLeaders, "Female Leaders")}
</div>
<div className="individualContent">
{(arr[i].maleStudents[0]) && this.createContentParagraphTextForArray(arr[i].maleStudents, "Male Students")}
</div>
<div className="individualContent">
{(arr[i].maleLeaders[0]) && this.createContentParagraphTextForArray(arr[i].maleLeaders, "Male Leaders")}
</div>
</div>
)
}
</div>
);
listOfButtons.push(currentButton);
}
return listOfButtons;
}
您还可以看到为 onClick 属性调用的切换函数。这是我的切换方法和构造函数:
constructor(props) {
super(props);
this.toggle = this.toggle.bind(this);
this.state = {
on: false
}
}
toggle() {
this.setState({
on: !this.state.on
});
}
我不想放太多代码使事情复杂化 - arr 是一个对象数组。这些对象包含 4 个不同的数组,每个数组包含不同数量的对象。所以 - arr 是教堂列表,其中包含作为对象的教堂,每个教堂包含 4 个数组(男女学生和领导者),并且在这 4 个数组的每一个中,无论他们属于哪里,都有成员作为对象
我不知道如何只显示我单击的按钮的隐藏文本。希望得到一些帮助。
您必须为按钮创建一个数组,并在切换时提供 属性 isHidden
至 show/hide 数据。这是您问题的有效解决方案。
class App extends React.Component {
state = {
buttons: []
};
arr = [
{
name: "churchName1",
femaleStudents: ["student1", "student1"],
femaleLeaders: ["leaders1", "leaders1"],
maleStudents: ["student1", "student1"],
maleLeaders: ["leaders1", "leaders1"]
},
{
name: "churchName2",
femaleStudents: ["student2", "student2"],
femaleLeaders: ["leaders2", "leaders2"],
maleStudents: ["student2", "student2"],
maleLeaders: ["leaders2", "leaders2"]
},
{
name: "churchName3",
femaleStudents: ["student3", "student3"],
femaleLeaders: ["leaders3", "leaders3"],
maleStudents: ["student3", "student3"],
maleLeaders: ["leaders3", "leaders3"]
}
];
componentDidMount() {
// create buttons array
let buttons = [];
for (let item of this.arr) {
let buttonObj = { id: item.name, isHidden: true };
buttons.push(buttonObj);
}
this.setState({ buttons });
}
createContentParagraphTextForArray = (para1, para2) => {
return (
<div>
{para1} {para2}
</div>
);
};
createButtonsForChurches = arr =>
arr.map((item, index) => {
let isHidden =
this.state.buttons.length > 0
? this.state.buttons[index].isHidden
: true;
return (
<div key={item.name}>
<button
onClick={() => this.clickHandler(item.name)}
className="churchButton"
>
{item.name}
</button>
{!isHidden && (
<div className="allContent">
<div className="individualContent">
{item.femaleStudents[0] &&
this.createContentParagraphTextForArray(
item.femaleStudents,
"Female Students"
)}
</div>
<div className="individualContent">
{item.femaleLeaders[0] &&
this.createContentParagraphTextForArray(
item.femaleLeaders,
"Female Leaders"
)}
</div>
<div className="individualContent">
{item.maleStudents[0] &&
this.createContentParagraphTextForArray(
item.maleStudents,
"Male Students"
)}
</div>
<div className="individualContent">
{item.maleLeaders[0] &&
this.createContentParagraphTextForArray(
item.maleLeaders,
"Male Leaders"
)}
</div>
</div>
)}
</div>
);
});
clickHandler = buttonId => {
let buttons = this.state.buttons;
buttons.forEach(button => {
if (button.id === buttonId) {
button.isHidden = !button.isHidden;
}
});
this.setState({ buttons });
};
render() {
return (
<React.Fragment>{this.createButtonsForChurches(this.arr)}</React.Fragment>
);
}
}
ReactDOM.render(<App/>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id='root'/>
我有一个 <div>
标签,其中包含不同数量的按钮。单击每个按钮时,我都会显示一个反应变量。我的问题是,每当我单击任何按钮时,每个隐藏文本都会显示;但是我只希望按钮在我单击它们时显示它们的隐藏文本,以便它们表现得独一无二。
我尝试了一些条件渲染的想法,但我不确定如何正确地进行攻击。
我有一个函数可以为每个教堂创建按钮。这是该函数:
createButtonsForChurches(arr) {
var listOfButtons = [];
for (var i = 1; i < arr.length; i++) { // loop through each church
var currentButton = (
<div>
<button onClick={this.toggle} className="churchButton">{arr[i].name}</button>
{
this.state.on && (
<div className="allContent">
<div className="individualContent">
{(arr[i].femaleStudents[0]) && this.createContentParagraphTextForArray(arr[i].femaleStudents, "Female Students")}
</div>
<div className="individualContent">
{(arr[i].femaleLeaders[0]) && this.createContentParagraphTextForArray(arr[i].femaleLeaders, "Female Leaders")}
</div>
<div className="individualContent">
{(arr[i].maleStudents[0]) && this.createContentParagraphTextForArray(arr[i].maleStudents, "Male Students")}
</div>
<div className="individualContent">
{(arr[i].maleLeaders[0]) && this.createContentParagraphTextForArray(arr[i].maleLeaders, "Male Leaders")}
</div>
</div>
)
}
</div>
);
listOfButtons.push(currentButton);
}
return listOfButtons;
}
您还可以看到为 onClick 属性调用的切换函数。这是我的切换方法和构造函数:
constructor(props) {
super(props);
this.toggle = this.toggle.bind(this);
this.state = {
on: false
}
}
toggle() {
this.setState({
on: !this.state.on
});
}
我不想放太多代码使事情复杂化 - arr 是一个对象数组。这些对象包含 4 个不同的数组,每个数组包含不同数量的对象。所以 - arr 是教堂列表,其中包含作为对象的教堂,每个教堂包含 4 个数组(男女学生和领导者),并且在这 4 个数组的每一个中,无论他们属于哪里,都有成员作为对象
我不知道如何只显示我单击的按钮的隐藏文本。希望得到一些帮助。
您必须为按钮创建一个数组,并在切换时提供 属性 isHidden
至 show/hide 数据。这是您问题的有效解决方案。
class App extends React.Component {
state = {
buttons: []
};
arr = [
{
name: "churchName1",
femaleStudents: ["student1", "student1"],
femaleLeaders: ["leaders1", "leaders1"],
maleStudents: ["student1", "student1"],
maleLeaders: ["leaders1", "leaders1"]
},
{
name: "churchName2",
femaleStudents: ["student2", "student2"],
femaleLeaders: ["leaders2", "leaders2"],
maleStudents: ["student2", "student2"],
maleLeaders: ["leaders2", "leaders2"]
},
{
name: "churchName3",
femaleStudents: ["student3", "student3"],
femaleLeaders: ["leaders3", "leaders3"],
maleStudents: ["student3", "student3"],
maleLeaders: ["leaders3", "leaders3"]
}
];
componentDidMount() {
// create buttons array
let buttons = [];
for (let item of this.arr) {
let buttonObj = { id: item.name, isHidden: true };
buttons.push(buttonObj);
}
this.setState({ buttons });
}
createContentParagraphTextForArray = (para1, para2) => {
return (
<div>
{para1} {para2}
</div>
);
};
createButtonsForChurches = arr =>
arr.map((item, index) => {
let isHidden =
this.state.buttons.length > 0
? this.state.buttons[index].isHidden
: true;
return (
<div key={item.name}>
<button
onClick={() => this.clickHandler(item.name)}
className="churchButton"
>
{item.name}
</button>
{!isHidden && (
<div className="allContent">
<div className="individualContent">
{item.femaleStudents[0] &&
this.createContentParagraphTextForArray(
item.femaleStudents,
"Female Students"
)}
</div>
<div className="individualContent">
{item.femaleLeaders[0] &&
this.createContentParagraphTextForArray(
item.femaleLeaders,
"Female Leaders"
)}
</div>
<div className="individualContent">
{item.maleStudents[0] &&
this.createContentParagraphTextForArray(
item.maleStudents,
"Male Students"
)}
</div>
<div className="individualContent">
{item.maleLeaders[0] &&
this.createContentParagraphTextForArray(
item.maleLeaders,
"Male Leaders"
)}
</div>
</div>
)}
</div>
);
});
clickHandler = buttonId => {
let buttons = this.state.buttons;
buttons.forEach(button => {
if (button.id === buttonId) {
button.isHidden = !button.isHidden;
}
});
this.setState({ buttons });
};
render() {
return (
<React.Fragment>{this.createButtonsForChurches(this.arr)}</React.Fragment>
);
}
}
ReactDOM.render(<App/>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id='root'/>