J'avais l'intention de changer le CSS en ligne en survolant l'élément. Mais réagissez flippé car toutes les propriétés de l'objet 'style' dans cette classe sont en quelque sorte toutes en lecture seule.
Mais c'est bien de le modifier dans la méthode 'render'. J'ai recherché le message d'erreur, beaucoup de gens obtiennent ce message d'erreur en modifiant l'objet props, mais celui-ci n'est même pas dans l'objet props. Des idées?
Voici mon code:
import React, { Component } from 'react';
export default class Game extends Component {
state = {
}
style = {
height: '200px',
backgroundImage: 'url()',
backgroundSize: 'cover',
backgroundRepeat: 'no-repeat',
backgroundPosition: 'center',
transform: 'scale(1)'
}
onHover() {
this.style.transform = 'scale(1.2)';
}
render() {
const { game, onClick } = this.props;
const { img, name } = game;
this.style.backgroundImage = `url(${img})`;
this.style.transform = 'scale(1)';
return (
<div className="m-2"
style={this.style}
onClick={() => { onClick(this.props.game) }}
onMouseEnter={() => this.onHover()}
>{name}</div>
);
}
}
Impossible de joindre des images pour le moment, voici donc le lien pour le message d'erreur.
La seule façon de mettre à jour la propriété dans react est de mettre à jour l'état avec setState. Vous pouvez également les placer à l'intérieur du crochet de rendu lui-même ou là où vous en avez besoin:
render() {
const { game, onClick } = this.props;
const { img, name } = game;
const style = {
height: '200px',
backgroundImage: 'url()',
backgroundSize: 'cover',
backgroundRepeat: 'no-repeat',
backgroundPosition: 'center',
transform: 'scale(1)'
}
// now, you can modify
style.backgroundImage = `url(${img})`;
style.transform = 'scale(1)';
Ou, même vous pouvez les placer en dehors de la classe: (Ce serait la méthode préférée dans votre cas, car vous mettez à jour les propriétés dans les méthodes souhaitées)
const style = {
height: '200px',
backgroundImage: 'url()',
backgroundSize: 'cover',
backgroundRepeat: 'no-repeat',
backgroundPosition: 'center',
transform: 'scale(1)'
}
export default class Game extends Component {
render() {
// modifying style
style.backgroundImage = `url(${img})`;
style.transform = 'scale(1)';
Vous pouvez copier votre objet de style et modifier la copie:
render() {
const { game, onClick } = this.props;
const { img, name } = game;
// make a copy
let changedStyle = {
...this.style
}
// change the copy
changedStyle.backgroundImage = `url(${img})`;
changedStyle.transform = 'scale(1)';
return (
<div className="m-2"
style={changedStyle}
onClick={() => { onClick(this.props.game) }}
onMouseEnter={() => this.onHover()}
>{name}</div>
);
}
Pour le rendre encore plus propre, vous pouvez simplement fusionner les classes css via
style = {
height: '200px',
backgroundImage: 'url()',
backgroundSize: 'cover',
backgroundRepeat: 'no-repeat',
backgroundPosition: 'center',
transform: 'scale(1)',
}
hoveringStyle = {
transform: 'scale(1.2)',
}
this.style = {...style, ...hoveringStyle}
Cela peut avoir un effet secondaire négatif que je ne connais pas.