première fois en utilisant réagir. Écrire un morceau de code où je veux que l'élément i, je clique sur pour être mis en surbrillance, tandis que les éléments non sélectionnés sont immacés. Fondamentalement, je veux que l'État passe à vrai sur la base de l'élément I clic et les autres états à basculer sur False.
Ma question est là, existe-t-il un plus élégant pour écrire ce code? J'ai essayé à l'origine de la baser sur event.target code> mais je ne sais pas comment lier un état à un élément spécifique. Tandis que ci-dessous fonctionne à mes fins, je me demande s'il y a un moyen d'utiliser plus de manière dynamique l'ensemble de l'ensemble sans avoir à écrire des méthodes distinctes pour chaque cas ... P>
export default class CharacterNav extends Component {
constructor(props) {
super(props);
this.state = {
profileHighlighted: true,
recruitHighlighted: false,
artsHighlighted: false,
talentsHighlighted: false,
affectionHighlighted: false,
}
this.changeProfileHighlight = this.changeProfileHighlight.bind(this);
this.changeRecruitHighlight = this.changeRecruitHighlight.bind(this);
this.changeArtsHighlight = this.changeArtsHighlight.bind(this);
this.changeTalentsHighlight = this.changeTalentsHighlight.bind(this);
this.changeAffectionHighlight = this.changeAffectionHighlight.bind(this);
this.resetNavState = this.resetNavState.bind(this);
}
changeProfileHighlight () {
this.setState({
profileHighlighted: true,
recruitHighlighted: false,
artsHighlighted: false,
talentsHighlighted: false,
affectionHighlighted: false
});
}
changeRecruitHighlight () {
this.setState({
profileHighlighted: false,
recruitHighlighted: true,
artsHighlighted: false,
talentsHighlighted: false,
affectionHighlighted: false
});
}
changeArtsHighlight () {
this.setState({
profileHighlighted: false,
recruitHighlighted: false,
artsHighlighted: true,
talentsHighlighted: false,
affectionHighlighted: false
});
}
changeTalentsHighlight () {
this.setState({
profileHighlighted: false,
recruitHighlighted: false,
artsHighlighted: false,
talentsHighlighted: true,
affectionHighlighted: false
});
}
changeAffectionHighlight () {
this.setState({
profileHighlighted: false,
recruitHighlighted: false,
artsHighlighted: false,
talentsHighlighted: false,
affectionHighlighted: true
});
}
render () {
let divClass = this.props.characterSelected ?
"blueBackground" :"hideElement";
let profilehighlightclass = this.state.profileHighlighted ? 'highlighted' : 'unhighlighted';
let recruithighlightclass = this.state.recruitHighlighted ? 'highlighted' : 'unhighlighted';
let artshighlightclass = this.state.artsHighlighted ? 'highlighted' : 'unhighlighted';
let talentshighlightclass = this.state.talentsHighlighted ? 'highlighted' : 'unhighlighted';
let affectionhighlightclass = this.state.affectionHighlighted ? 'highlighted' : 'unhighlighted';
return(
<div>
<ul className={divClass}>
<li><h3 onClick={this.changeProfileHighlight} name='profileHighlighted' className={profilehighlightclass}>Profile</h3></li>
<li><h3 onClick={this.changeRecruitHighlight} name='recruitHighlighted' className={recruithighlightclass}>Recruitment</h3></li>
<li><h3 onClick={this.changeArtsHighlight} name='artsHighlighted' className={artshighlightclass}>Arts</h3></li>
<li><h3 onClick={this.changeTalentsHighlight} name='talentsHighlighted' className={talentshighlightclass}>Talents</h3></li>
<li><h3 onClick={this.changeAffectionHighlight} name='affectionHighlighted' className={affectionhighlightclass}>Affection</h3></li>
</ul>
</div>
)
}
}
4 Réponses :
Oui, vous pouvez contenir dans votre état le nom de l'élément en surbrillance.
quelque chose comme: p>
p>
export default class CharacterNav extends Component {
constructor(props) {
super(props);
this.state = {
highlighted: 'profile'
}
this.setHighlighted = this.setHighlighted.bind(this);
}
setHighlighted(e) {
this.setState({
highlighted: e.target.name
});
}
render () {
let divClass = this.props.characterSelected ?
"blueBackground" :"hideElement";
return(
<div>
<ul className={divClass}>
['Profile', 'Recruitment', 'Talents', 'Affection'].map(item => {
const name = item.toLowerCase();
return (
<li>
<h3
onClick={this.setHighlighted}
name={name}
className={name === this.state.highlighted ? 'highlighted' : 'unhighlighted'}>
{item}
</h3>
</li>
)
})
</ul>
</div>
)
}
}Merci! C'était vraiment facile à comprendre.
Une légère solution que j'ai trouvée est que SetHighlight a besoin d'un getattribute afin de saisir le nom de l'élément.
manière optimisée
Le nom de classe ne doit-il pas être dynamique basé sur l'identifiant comme classname = {this.state.hawightd === id? 'En surbrillance': 'Ungheighlighted'} code>?
Il suffit d'ajouter et de supprimer le nom de la classe: sortie: https://codesandbox.io/s/tender-http-pl4xy p> p>
<h3
onClick={this.toggleHighlight}
onKeyPress={this.toggleHighlight}
role="button"
id="profileHighlighted"
className={this.getClassName('profileHighlighted')}
>
Profile
</h3>