Niedawno zacząłem uczyć się Reacta i chciałem zbudować kartę, aby zobaczyć, jak daleko zaszła moja wiedza. Natknąłem się na to i postanowiłem wdrożyć coś bez redukcji. Wydaje mi się, że odpowiedzi nie odzwierciedlają tego, co OP chce osiągnąć. Chce tylko jednego aktywnego składnika, ale odpowiedzi tutaj spowodują, że wszystkie składniki będą aktywne. Dałem temu szansę.
Poniżej znajduje się plik karty
import React, { Component } from 'react';
class Tab extends Component {
render(){
const tabClassName = "col-xs-3 tab-bar";
const activeTab = this.props.activeKey === this.props.keyNumber ? "active-tab" : null;
return (
<div
className = {`${tabClassName} ${activeTab}`}
onClick={()=>this.props.onClick(this.props.keyNumber)}
>
I am here
</div>
);
}
}
export default Tab;
Plik tabs ...
import React, { Component } from 'react';
import Tab from './tab';
class Tabs extends Component {
constructor(props){
super(props);
this.state = {
currentActiveKey: 0,
tabNumber: 2
};
this.setActive = this.setActive.bind(this);
this.setTabNumber = this.setTabNumber.bind(this);
}
setTabNumber(number){
this.setState({
tabNumber: number
});
}
setActive (key){
this.setState({
currentActiveKey: key
});
}
render(){
let tabs = [];
for(let i = 0; i <= this.state.tabNumber; i++){
let tab = <Tab key={i} keyNumber={i} onClick={this.setActive} activeKey={this.state.currentActiveKey}/>;
tabs.push(tab);
}
return (
<div className="row">
{tabs}
</div>
);
}
}
export default Tabs;
twój plik indeksu ...
import React from 'react';
import ReactDOM from 'react-dom';
import Tabs from './components/tabs';
ReactDOM.render(
<Tabs />
, document.querySelector('.container'));
i css
.tab-bar {
margin: 10px 10px;
border: 1px solid grey;
}
.active-tab {
border-top: 1px solid red;
}
To jest szkielet czegoś, co chcę ulepszyć, więc zwiększenie tabNumber powyżej 4 zepsuje css.