我有 4 个组件名称为 SingleTopicBox
的框。当用户单击特定框时,我想更改框的颜色。 SingleTopicBox
组件将 Prop topicID 作为每个框的唯一标识符。当前,当用户单击任何框时,它会更改所有框的状态 bgDisplayColor: 'red'
但是,我只想更改被单击的框的颜色。
index.jsx
import {React, ReactDOM} from '../../../../build/react';
import SelectedTopicPage from './selected-topic-page.jsx';
import TopicsList from './topic-list.jsx';
import topicPageData from '../../../content/json/topic-page-data.js';
export default class MultiTopicsModuleIndex extends React.Component {
constructor(props) {
super(props);
this.setTopicClicked = this.setTopicClicked.bind(this);
this.onClick = this.onClick.bind(this);
() => topicPageData;
this.state = {
isTopicClicked: false,
bgDisplayColor: 'blue'
};
};
onClick(topicID) {
this.setState({isTopicClicked: true, topicsID: topicID, bgDisplayColor: 'red'});
};
setTopicClicked(boolean) {
this.setState({isTopicClicked: boolean});
};
render() {
return (
<div className="row">
{this.state.isTopicClicked
? <SelectedTopicPage topicsVisited={this.topicsVisited} setTopicClicked={this.setTopicClicked} topicsID={this.state.topicsID} key={this.state.topicsID} topicPageData={topicPageData}/>
: <TopicsList bgDisplayColor={this.state.bgDisplayColor} topicsVisited={this.topicsVisited} onClick={this.onClick}/>}
</div>
);
}
};
topic-list.jsx
import {React, ReactDOM} from '../../../../build/react';
import SingleTopicBox from './single-topic-box.jsx';
import SelectedTopicPage from './selected-topic-page.jsx';
export default class TopicsList extends React.Component {
render() {
return (
<div className="row topic-list">
<SingleTopicBox bgDisplayColor={this.props.bgDisplayColor} topicID="1" onClick={this.props.onClick} label="Topic"/>
<SingleTopicBox bgDisplayColor={this.props.bgDisplayColor} topicID="2" onClick={this.props.onClick} label="Topic"/>
<SingleTopicBox bgDisplayColor={this.props.bgDisplayColor} topicID="3" onClick={this.props.onClick} label="Topic"/>
<SingleTopicBox bgDisplayColor={this.props.bgDisplayColor} topicID="4" onClick={this.props.onClick} label="Topic"/>
</div>
);
}
};
单主题框.jsx
import {React, ReactDOM} from '../../../../build/react';
export default class SingleTopicBox extends React.Component {
render() {
var divStyle = {
backgroundColor: this.props.bgDisplayColor
};
return (
<div>
<div className="col-sm-2">
<div style={divStyle} className="single-topic" data-topic-id={this.props.topicID} onClick={() => this.props.onClick(this.props.topicID)}>
{this.props.label}
{this.props.topicID}
</div>
</div>
</div>
);
}
};
最佳答案
您似乎无法决定是要顶层组件还是 SingleTopicBox 的状态,但无论如何您都将其放在顶层组件中。
您应该做出选择:SingleTopicBox 组件应该知道它已被单击,还是 MultiTopicsModuleIndex 应该记住哪个 SingleTopicBox 已被单击?
如果您同意多个 SingleTopicBox 组件同时具有单击状态,则应将状态和 onClick 处理程序移至 SingleTopicBox。您无需记住组件是否已被单击及其背景颜色。例如,您可以:
getInitialState: function() {
return {
bgDisplayColor: 'blue'
};
},
onClick() {
this.setState({bgDisplayColor: 'red'});
};
然后在渲染方法中使用this.state.bgDisplayColor
如果您只想在任何时候单击一个组件,以便在单击另一个组件时之前单击的组件恢复为未单击状态,您可能希望状态和处理程序位于顶级组件中,因为你的代码中已经有了它。在状态中您唯一需要记住的是 topicID,然后将其作为属性传递给 TopicsList 组件,如下所示:
<TopicsList clickedTopicID={this.state.topicID} onClick={this.onClick} />
在 TopicsList 中你呈现这样的东西:
render: function() {
var topics = [
{id: 1, label: 'Topic'},
{id: 2, label: 'Topic'},
{id: 3, label: 'Topic'},
{id: 4, label: 'Topic'},
];
var boxes = [];
for (var i = 0, len = topics.length; i < len; i++)
boxes.push(<SingleTopicBox
bgDisplayColor={(this.props.clickedTopicID == topics[i].id) ? 'red' : 'blue'}
topicID={topics[i].id}
onClick={this.props.onClick}
label={topics[i].label}
/>);
return (
<div className="row topic-list">
{boxes}
</div>
);
}
关于javascript - React - 当同一组件有多个实例时如何改变单个组件的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35455732/