J'essaie de comprendre comment basculer une classe active onClick
pour modifier les propriétés CSS.
J'ai adopté de nombreuses approches et lu de nombreuses réponses SO. En utilisant jquery, cela serait relativement simple, cependant, je ne peux pas le faire avec react. Mon code est ci-dessous. Quelqu'un peut-il me dire comment faire?
Sans créer un nouveau composant pour chaque élément, est-il possible de le faire?
class Test extends Component(){
constructor(props) {
super(props);
this.addActiveClass= this.addActiveClass.bind(this);
}
addActiveClass() {
//not sure what to do here
}
render() {
<div>
<div onClick={this.addActiveClass}>
<p>1</p>
</div>
<div onClick={this.addActiveClass}>
<p>2</p>
</div>
<div onClick={this.addActiveClass}>
<p>3</p>
</div>
</div>
}
}
Utilisez l'état. Les documents de Reacts sont ici .
class MyComponent extends Component {
constructor(props) {
super(props);
this.addActiveClass= this.addActiveClass.bind(this);
this.state = {
active: false,
};
}
toggleClass() {
const currentState = this.state.active;
this.setState({ active: !currentState });
};
render() {
return (
<div
className={this.state.active ? 'your_className': null}
onclick={this.toggleClass}
>
<p>{this.props.text}</p>
</div>
)
}
}
class Test extends Component {
render() {
return (
<div>
<MyComponent text={'1'} />
<MyComponent text={'2'} />
</div>
);
}
}
Eh bien, votre addActiveClass doit savoir ce qui a été cliqué. Quelque chose comme ceci pourrait fonctionner (notez que j'ai ajouté les informations indiquant que les div sont actives en tant que tableau d'état, et qu'onClick transmet maintenant les informations sur lesquelles un clic a été effectué en tant que paramètre, après quoi l'état est mis à jour en conséquence - il existe certainement des moyens plus intelligents de faites-le, mais vous avez l'idée).
class Test extends Component(){
constructor(props) {
super(props);
this.state = {activeClasses: [false, false, false]};
this.addActiveClass= this.addActiveClass.bind(this);
}
addActiveClass(index) {
const activeClasses = [...this.state.activeClasses.slice(0, index), !this.state.activeClasses[index], this.state.activeClasses.slice(index + 1)];
this.setState({activeClasses});
}
render() {
const activeClasses = this.activeClasses.slice();
return (
<div>
<div className={activeClasses[0]? "active" : "inactive"} onClick={() => this.addActiveClass(0)}>
<p>0</p>
</div>
<div className={activeClasses[1]? "active" : "inactive"} onClick={() => this.addActiveClass(1)}>
<p>1</p>
</div>
<div onClick={() => this.addActiveClass(2)}>
<p>2</p>
</div>
</div>);
}
}
Je préférerais utiliser "&&" -operator sur une instruction if en ligne. À mon avis, cela donne une base de code plus propre de cette façon.
En général, vous pourriez faire quelque chose comme ça
render(){
return(
<div>
<button className={this.state.active && 'active'}
onClick={ () => this.setState({active: !this.state.active}) }>Click me</button>
</div>
)
}
N'oubliez pas que la fonction de flèche est une fonctionnalité ES6 et n'oubliez pas de définir la valeur 'this.state.active' dans la classe constructor () {}
this.state = { active: false }
ou si vous voulez injecter des CSS dans JSX, vous pouvez le faire de cette façon
<button style={this.state.active && style.button} >button</button>
et vous pouvez déclarer le style json variable
const style = { button: { background:'red' } }
n'oubliez pas d'utiliser camelCase sur des feuilles de style JSX.
React a un concept d'état de composants, donc si vous voulez le changer, faites une setState
:
constructor(props) {
super(props);
this.addActiveClass= this.addActiveClass.bind(this);
this.state = {
isActive: false
}
}
addActiveClass() {
this.setState({
isActive: true
})
}
Dans votre composant, utilisez this.state.isActive
pour rendre ce dont vous avez besoin.
Cela devient plus compliqué lorsque vous souhaitez définir l'état dans le composant n ° 1 et l'utiliser dans le composant n ° 2. Il suffit de creuser davantage pour réagir au flux de données unidirectionnel et éventuellement au redux qui vous aidera à le gérer.
Les réponses ci-dessus fonctionneront, mais juste au cas où vous voudriez une approche différente, essayez classname: https://github.com/JedWatson/classnames
vous pouvez ajouter basculer classe ou basculer état sur clic
class Test extends Component(){
state={
active:false,
}
toggleClass() {
console.log(this.state.active)
this.setState=({
active:true,
})
}
render() {
<div>
<div onClick={this.toggleClass.bind(this)}>
<p>1</p>
</div>
</div>
}
}
Un bon échantillon aiderait à mieux comprendre les choses:
HTML
<div id="root">
</div>
CSS
.box {
display: block;
width: 200px;
height: 200px;
background-color: gray;
color: white;
text-align: center;
vertical-align: middle;
cursor: pointer;
}
.box.green {
background-color: green;
}
Code de réaction
class App extends React.Component {
constructor(props) {
super(props);
this.state = {addClass: false}
}
toggle() {
this.setState({addClass: !this.state.addClass});
}
render() {
let boxClass = ["box"];
if(this.state.addClass) {
boxClass.Push('green');
}
return(
<div className={boxClass.join(' ')} onClick={this.toggle.bind(this)}>{this.state.addClass ? "Remove a class" : "Add a class (click the box)"}<br />Read the tutorial <a href="http://www.automationfuel.com" target="_blank">here</a>.</div>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
en utilisant React, vous pouvez ajouter une classe de basculement à n’importe quel élément/id
style.css
.hide-text{
display: none !important;
/* transition: 2s all ease-in 0.9s; */
}
.left-menu-main-link{
transition: all ease-in 0.4s;
}
.leftbar-open{
width: 240px;
min-width: 240px;
/* transition: all ease-in 0.4s; */
}
.leftbar-close{
width: 88px;
min-width:88px;
transition: all ease-in 0.4s;
}
NomFichier.js
......
ToggleMenu=()=>{
this.setState({
isActive: !this.state.isActive
})
console.log(this.state.isActive)
}
render() {
return (
<div className={this.state.isActive===true ? "left-panel leftbar-open" : "left-panel leftbar-close"} id="leftPanel">
<div className="top-logo-container" onClick={this.ToggleMenu}>
<span className={this.state.isActive===true ? "left-menu-main-link hide-from-menu" : "hide-text"}>Welcome!</span>
</div>
<div className="welcome-member">
<span className={this.state.isActive===true ? "left-menu-main-link hide-from-menu" : "hide-text"}>Welcome<br/>SDO Rizwan</span>
</div>
)
}
......
J'ai commencé à apprendre React récemment et je voulais construire un onglet juste pour voir jusqu'où mes connaissances étaient allées. Je suis tombé sur cela et j'ai décidé de mettre en œuvre quelque chose sans redux. Je pense que les réponses ne reflètent pas ce que l’opération veut réaliser. Il veut seulement un composant actif, mais les réponses ici vont activer tous les composants. Je lui ai donné un coup de feu.
Ci-dessous un fichier de tabulation
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;
Le fichier d'onglets ...
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;
votre fichier d'index ...
import React from 'react';
import ReactDOM from 'react-dom';
import Tabs from './components/tabs';
ReactDOM.render(
<Tabs />
, document.querySelector('.container'));
et le css
.tab-bar {
margin: 10px 10px;
border: 1px solid grey;
}
.active-tab {
border-top: 1px solid red;
}
Ceci est un squelette de quelque chose que je veux améliorer, donc augmenter le nombre de tabN au-delà de 4 cassera le css.