React:通过将列表作为道具传递来呈现组件列表
React: Rendering a list of components by passing the list as a prop
我目前正在学习有关 React 的教程,并且对如何做到这一点很感兴趣:
class Counters extends Component {
state = {
counters: [
{ id: 0, value: 0 },
{ id: 1, value: 4 },
{ id: 2, value: 5 },
{ id: 3, value: 9 },
],
};
handleDelete = (counterID) => {
console.log("Event handler called", counterID);
const counters = this.state.counters.filter((c) => c.id !== counterID);
this.setState({ counters });
};
render() {
return (
<React.Fragment>
{this.state.counters.map((counters) => (
<Counter
key={counters.id}
counters={counters}
onDelete={this.handleDelete}
></Counter>
))}
</React.Fragment>
);
}
我正在使用“计数器”来跟踪我的个人“计数器”(注意单数名词)组件。我很想知道为什么我可以简单地 将整个数组作为 prop 传递到“计数器”中,并使用以下行:
counters={counters}
并在“计数器”中使用以下代码class:
class Counter extends Component {
state = {
value: this.props.counters.value,
tags: ["tag1", "tag2", "tag3"],
};
styles = {
fontSize: "50px",
fontWeight: "bolder",
};
handleIncrement() {
console.log("Increment clicked.");
this.setState({ value: this.state.count + 1 });
}
render() {
console.log(this.props);
return (
<React.Fragment>
<h4>Counter #{this.props.counters.id}</h4>
<span style={{ fontSize: "25px" }} className={this.getBadgeClasses()}>
{this.formatCount()}
</span>
<button
onClick={() => this.handleIncrement()}
className="btn btn-secondary btn-sm m-2"
>
Increment
</button>
<button
onClick={() => this.props.onDelete(this.props.counters.id)}
className="btn btn-danger btn-sm m-2"
>
Delete
</button>
{this.renderTags()}
</React.Fragment>
);
}
getTags() {
let tags = this.state.tags;
return tags === undefined || tags.length <= 0 ? (
<p>"The tag list is empty."</p>
) : (
tags.map((tag) => <li key={tag}>{tag}</li>)
);
}
renderTags() {
return <ul>{this.getTags()}</ul>;
}
getBadgeClasses() {
let classes = "badge m-2 badge-";
classes += this.state.value === 0 ? "warning" : "primary";
return classes;
}
formatCount() {
const value = this.state.value;
return value === 0 ? "Zero" : value;
}
}
export default Counter;
我能够获得完整的“计数器”组件列表吗?我的印象是 我只在“计数器”class 中声明了一个,但是通过传递一个列表我能够呈现整个计数器列表。这怎么可能?我在这里缺少什么概念?
如果你想通过计数器组件的整个列表:
counters={this.state.counters}
因为在 counter={counters} 中,您实际上传递了一个元素(方法映射逐项发送)。所以实际上,当你写this.state.counters.map((counters) => ...时,你应该写this.state.counters.map((counter) =>...因为它只是数组counters的一个元素。
我目前正在学习有关 React 的教程,并且对如何做到这一点很感兴趣:
class Counters extends Component {
state = {
counters: [
{ id: 0, value: 0 },
{ id: 1, value: 4 },
{ id: 2, value: 5 },
{ id: 3, value: 9 },
],
};
handleDelete = (counterID) => {
console.log("Event handler called", counterID);
const counters = this.state.counters.filter((c) => c.id !== counterID);
this.setState({ counters });
};
render() {
return (
<React.Fragment>
{this.state.counters.map((counters) => (
<Counter
key={counters.id}
counters={counters}
onDelete={this.handleDelete}
></Counter>
))}
</React.Fragment>
);
}
我正在使用“计数器”来跟踪我的个人“计数器”(注意单数名词)组件。我很想知道为什么我可以简单地 将整个数组作为 prop 传递到“计数器”中,并使用以下行:
counters={counters}
并在“计数器”中使用以下代码class:
class Counter extends Component {
state = {
value: this.props.counters.value,
tags: ["tag1", "tag2", "tag3"],
};
styles = {
fontSize: "50px",
fontWeight: "bolder",
};
handleIncrement() {
console.log("Increment clicked.");
this.setState({ value: this.state.count + 1 });
}
render() {
console.log(this.props);
return (
<React.Fragment>
<h4>Counter #{this.props.counters.id}</h4>
<span style={{ fontSize: "25px" }} className={this.getBadgeClasses()}>
{this.formatCount()}
</span>
<button
onClick={() => this.handleIncrement()}
className="btn btn-secondary btn-sm m-2"
>
Increment
</button>
<button
onClick={() => this.props.onDelete(this.props.counters.id)}
className="btn btn-danger btn-sm m-2"
>
Delete
</button>
{this.renderTags()}
</React.Fragment>
);
}
getTags() {
let tags = this.state.tags;
return tags === undefined || tags.length <= 0 ? (
<p>"The tag list is empty."</p>
) : (
tags.map((tag) => <li key={tag}>{tag}</li>)
);
}
renderTags() {
return <ul>{this.getTags()}</ul>;
}
getBadgeClasses() {
let classes = "badge m-2 badge-";
classes += this.state.value === 0 ? "warning" : "primary";
return classes;
}
formatCount() {
const value = this.state.value;
return value === 0 ? "Zero" : value;
}
}
export default Counter;
我能够获得完整的“计数器”组件列表吗?我的印象是 我只在“计数器”class 中声明了一个,但是通过传递一个列表我能够呈现整个计数器列表。这怎么可能?我在这里缺少什么概念?
如果你想通过计数器组件的整个列表:
counters={this.state.counters}
因为在 counter={counters} 中,您实际上传递了一个元素(方法映射逐项发送)。所以实际上,当你写this.state.counters.map((counters) => ...时,你应该写this.state.counters.map((counter) =>...因为它只是数组counters的一个元素。