2
votes

Réagissez où dans le composant pour ajouter une fonction mathématique simple

J'ai un composant de réaction simple auquel je souhaite ajouter une fonction mathématique simple nommée doMath qui utilise des valeurs de propriété.

class MyClass extends Component {
    constructor( props ) {
        super( ...arguments );
    }

    render() {
        const { attributes } = this.props; /* attributes passed from parent component */
        const { width, height } = attributes;

        const doMath = (width, height) {
           const result = 100 / (width / height);
           return result;
        }

        return (
           doMath(width, height);
        )
    }
}

Je peux ajouter la fonction doMath de la manière suivante ...

À l'intérieur de la classe:

const doMath = (width, height) {
  const result = 100 / (width / height);
  return result;
}

class MyClass extends Component {
    constructor( props ) {
        super( ...arguments );
    }

    render() {
        const { attributes } = this.props; /* attributes passed from parent component */
        const { width, height } = attributes;

        return (
           doMath(width, height);
        )
    }
}

En dehors de la classe en tant que const:

class MyClass extends Component {
    constructor( props ) {
        super( ...arguments );
    }

    doMath() {
       const { width, height } = this.props.attributes;
       const result = 100 / (width / height);
       return result;
    }

    render() {
        const { attributes } = this.props; /* attributes passed from parent component */
        const { width, height } = attributes;

        return (
           doMath();
        )
    }
}

À l'intérieur du rendu en tant que const:

class MyClass extends Component {
    constructor( props ) {
        super( ...arguments );
    }

    render() {
        const { attributes } = this.props; /* attributes passed from parent component */
        const { width, height } = attributes;

        return (
           /* render something using the width and height values */
        )
    }
}

Il semble que je puisse aussi l'ajouter à componentDidMount ou componentDidUpdate

D'après ce que j'ai compris, c'est une mauvaise pratique de l'ajouter dans render () mais cela semble fonctionner partout. Quelle est la meilleure pratique dans cette situation?


1 commentaires

Si vous ne l'utilisez que dans cette classe, elle doit rester dans la classe en tant que méthode de classe, mais si vous avez également besoin de cette fonction pour d'autres classes, vous pouvez la conserver dans un fichier API et l'exporter.


3 Réponses :


0
votes

Il suffit de le mettre dans la classe et de l'appeler par {this.doMath ()} dans la méthode de rendu

class MyClass extends Component {
    constructor( props ) {
        super( ...arguments );
    }

    doMath() {
       const { width, height } = this.props.attributes;
       const result = 100 / (width / height);
       return result;
    }

    render() {
        const { attributes } = this.props; /* attributes passed from parent component */
        const { width, height } = attributes;

        return (
           {this.doMath()}
        )
    }
}


0 commentaires

3
votes

La troisième méthode n'est certainement pas correcte. L'ajout de la fonction à l'intérieur de la méthode render créera une nouvelle fonction doMath chaque fois que votre composant re-rend , et ce n'est pas une façon efficace de faire

Si vous savez avec certitude que vous allez utiliser la fonction doMath uniquement pour ce composant particulier, je suggère de le définir dans le module du composant sans l'exporter. J'opterais donc pour la deuxième méthode.

Si cette fonction ne dépend que de la largeur et de la hauteur , alors c'est bien de l'avoir en dehors de la classe du composant . Sinon, si vous pensez que cela peut dépendre davantage de l ' état , vous pouvez le mettre dans la classe pour ne pas être obligé de transmettre l'état du composant.

Conclusion: en fonction de la quantité de données que vous allez passer à la fonction doMath , vous pouvez la créer soit à l'intérieur de la classe, soit à l'extérieur de celle-ci; mais jamais dans la méthode render .


EDIT: Quelque chose que j'ai oublié de mentionner utilise une méthode statique . En gros, si vous ne définissez pas la méthode static , elle sera créée pour chaque instance de votre composant et pourra utiliser d'autres membres de la classe:

(A) Si la méthode n'est pas statique:

const MyComponent = require('/path/to/MyComponent');
MyComponent.doMath(); // undefined

(B) Si la méthode est statique:

function doMath(width, height) {
  // do magic
  return result;
}

class MyComponent extends React.Component {
  render() {
    const {width, height} = this.state;
    const result = doMath(width, height);

    // render something
    // use result
  }
}

// emphasize export
module.exports = MyComponent;

(C) Et pour être complet, définissons également la fonction en dehors de la classe:

class MyComponent extends React.Component {
  /* private */ static doMath(width, height) {
    // do something with them
    // no access to state or the component's instance
  }

  render() {
    const {width, height} = this.state;

    const result = MyComponent.doMath(width, height);

    // render something
  }
}

Comparaison

Lorsque vous utilisez quelque chose comme TypeScript, les méthodes (B) et (C) donnent fondamentalement le même résultat: vous pouvez isoler les fonctionnalités en spécifiant la méthode static privé . Cependant, lorsque j'utilise JavaScript, je préfère (C) car si je le fais

class MyComponent extends React.Component {
  /* private */ doMath() {
    // You have access to this particular instance and its state
    const {width, height} = this.state; 
  }
}

je ne peux pas utiliser la fonction doMath car je ne devrais pas. Avec ces deux méthodes, vous devez passer les données requises à la fonction / méthode en tant que paramètres (c'est-à-dire que vous n'avez pas accès à l'état interne de l'instance du composant).

Maintenant pour (A), la méthode sera créé pour chaque instance du composant (peut-être quelque chose à considérer si vous en avez beaucoup). Vous aurez accès à ce (donc à l'état interne du composant) et vous n'aurez rien à passer en paramètre, ce qui peut être pratique si vous n'êtes pas sûr de la quantité de données dont la méthode a besoin. p>

J'espère que vous pourrez tirer une conclusion de cette explication.


8 commentaires

J'ajoute généralement un composant par fichier, donc ce sera correct de l'ajouter au composant. Je n'ai pas envisagé d'ajouter plus de composants dans un seul fichier.


Ce qui me préoccupe toujours, c'est d'isoler la fonctionnalité. Je ne voudrais donc pas qu'aucun autre module de la base de code puisse accéder à la méthode doMath car elle est uniquement destinée à un usage interne. Si vous utilisiez TypeScript, vous pourrez spécifier la méthode comme private et vous obtiendrez une erreur si vous essayiez d'y accéder depuis un autre endroit. Cependant, si vous n'écrivez que du JavaScript, c'est une bonne idée (IMO) de le mettre en dehors de la classe et de ne pas l'exporter .


C'est un bon point! Selon vos préférences personnelles, vous utiliseriez des fonctions fléchées et transmettriez des variables doMath = (properties) => {} ou une fonction normale et saisissez les propriétés dans doMath () {const {properties} = this.props; ?


@CyberJunkie voir ma modification. S'il vous plaît dites-moi si quelque chose n'est pas clair.


Très cool! C'est une très bonne explication. Dans l'exemple C, je vois que vous avez d'abord ajouté doMath () à un const, puis ajouté result à renvoyer .. plutôt que d'ajouter simplement doMath () en retour comme dans mon exemple. Y a-t-il une raison à cela ou simplement une préférence personnelle?


Dans l'exemple C. class MyComponent étend React.Component {render () {const {width, height} = this.state; résultat const = doMath (largeur, hauteur); // rendre quelque chose // utiliser le résultat}}


Vous avez ajouté doMath () à const result puis utilisez result dans return ()


@CyberJunkie oh c'était juste pour donner un exemple d'utilisation. il n'a rien sans performance ni goût personnel. PS : si vous avez trouvé ma réponse utile, n'oubliez pas de la marquer acceptée



3
votes

Le meilleur moyen de ces 3 est à l'intérieur de la classe , car d'autres composants peuvent réutiliser ce composant avec la fonction mathématique. Si vous faites cela en dehors du composant, cette fonction n'est plus liée au composant. Cependant, à l'avenir, il est très probable que les composants de classe seront obsolètes et ne recevront plus de mises à jour depuis Les hooks sont la nouveauté qui donne à tous les composants un état. Si la fonction était sans état avant, elle sera avec état dans la version hooks et vous devriez lire à ce sujet, c'est une bonne chose!


1 commentaires

Woah! Les crochets changent tout.