82 votes

Façon canonique de définir les constantes communes dans Vue.js ?

Je développe quelques applications Vue à l'aide de composants à fichier unique. Je trouve qu'un bon nombre de mes composants nécessitent des informations de configuration communes, par exemple un objet contenant des méthodes de livraison que je pourrais définir comme ceci :

const DeliveryMethods = {
  DELIVERY: "Delivery",
  CARRIER: "Carrier",
  COLLATION: "Collation",
  CASH_AND_CARRY: "Cash and carry"
}

Quelle est la façon canonique de mettre cela à la disposition de mes composants ? Pour l'instant, je l'ai fait avec un fichier 'config.js', comme ci-dessous :

export default {

  DeliveryMethods: {
    DELIVERY: "Delivery",
    CARRIER: "Carrier",
    COLLATION: "Collation",
    CASH_AND_CARRY: "Cash and carry"
  }

}

Dans mes composants où j'en ai besoin, j'ai import config from 'src/config.js' et lorsque je veux utiliser l'un d'entre eux, je me référerai par exemple à , config.DeliveryMethods.CASH_AND_CARRY . Cela me semble cependant assez long et répétitif, et je préférerais pouvoir utiliser seulement DeliveryMethods.CASH_AND_CARRY au lieu de config.DeliveryMethods.CASH_AND_CARRY .

Quelle est la manière canonique de se baser sur js lint et/ou le guide de style jquery ? Y a-t-il d'autres autorités à prendre en compte ?

2 votes

Si vous voulez juste DeliveryMethods.CASH_AND_CARRY pourquoi ne pas simplement exporter le POJO sans le champ d'application supplémentaire de DeliveryMethods: {...} et exporter simplement le {DELIVERY: "Delivery", ...} portion ; Ensuite import DeliveryMethods from "./src/config.js" ?

66voto

Méthodes de livraison/index.js

const DELIVERY = "Delivery"
const CARRIER = "Carrier"
const COLLATION = "Collation"
const CASH_AND_CARRY = "Cash and carry"

export default {
  DELIVERY: DELIVERY,
  CARRIER: CARRIER,
  COLLATION: COLLATION,
  CASH_AND_CARRY: CASH_AND_CARRY
}

Utilisation

import DeliveryMethods from './path/to/delivery-methods'

console.log(DeliveryMethods.CARRIER)

Ou :

config.js

export default Object.freeze({
  DELIVERY: "Delivery",
  CARRIER: "Carrier",
  COLLATION: "Collation",
  CASH_AND_CARRY: "Cash and carry"
})

Utilisation :

import DeliveryMethods from './path/to/delivery-methods'

console.log(DeliveryMethods.CARRIER)

31voto

John Moore Points 1245

Merci, ceci et le commentaire de subhaze m'ont mis sur la bonne voie. DeliveryMethods n'est pas la seule constante que je voudrais utiliser, donc export default ne fonctionne pas si je veux avoir toutes mes constantes dans un seul fichier pour faciliter la maintenance. Voici ce que j'ai fait :

export const DeliveryMethods = {
    DELIVERY: "Delivery",
    CARRIER: "Carrier",
    COLLATION: "Collation",
    CASH_AND_CARRY: "Cash and carry"
};

Dans mes composants, j'ai import {DeliveryMethods} from 'src/config.js' ce qui me permet d'utiliser simplement, par exemple, les éléments suivants DeliveryMethods.COLLATION . Je peux exporter/importer un nombre quelconque de constantes de manière claire et simple. Je m'y retrouve encore dans les modules Javascript !

PLUS TARD : Suivant la suggestion de WaldemarIce, j'ai changé cela en :

export const DeliveryMethods = Object.freeze({
    DELIVERY: "Delivery",
    CARRIER: "Carrier",
    COLLATION: "Collation",
    CASH_AND_CARRY: "Cash and carry"
});

Ça marche mieux.

0 votes

Essayez ce qui se passe si vous essayez de redéfinir DeliveryMethods.DELIVERY = 'bla' .

0 votes

Eh bien, je sais que je peux modifier les propriétés d'un objet même si l'objet lui-même a été déclaré par l'intermédiaire de const donc l'objet n'est pas immuable. Votre déclaration des constantes elles-mêmes via const avant de les assigner à des propriétés de l'objet permettrait d'éviter cela. Mais c'est un peu plus verbeux que ce que je veux faire de cette façon, et je pense à la façon dont je l'ai fait comme une sorte de convention - un nom d'objet en majuscule avec des propriétés en majuscule signifie que c'est un objet avec des constantes, donc ne le trafiquez pas !

4 votes

Ok, je comprends, mais pourquoi ne pas utiliser la deuxième option avec Object.freeze() ? C'est moins verbeux et cela simule des constantes, vous ne pouvez pas changer les propriétés de l'objet gelé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X