Fable: Attribut pour compiler les arguments en tant qu'objet JS

Créé le 30 oct. 2018  ·  3Commentaires  ·  Source: fable-compiler/Fable

Les nouveaux ajouts à React (mémo, hooks) indiquent que la communauté va s'orienter davantage vers des fonctions en tant que composants plutôt que des classes. C'est une bonne nouvelle pour nous, car la syntaxe de classe en F# est un peu verbeuse à cet effet. Cependant, il y a encore des choses que nous pouvons faire pour améliorer l'expérience.

À FableConf, @vbfox a suggéré d'activer un attribut pour compiler des arguments en tant qu'objet JS, nous n'avons donc pas besoin de déclarer un enregistrement chaque fois que nous voulons définir un composant de fonction avec des accessoires. Donc au lieu de :

type MyProps = { key: string; value1: int; value2: float[] }

let MyComponent (props: MyProps) =
    div [] [...]

// Use
ofFunction MyComponent { key = "foo"; value1 = 5; value2 = [] } []

On pourrait écrire :

let [<MagicAttribute>] MyComponent (key: string) (value1: int) (value2: float[]) () =
    div [] [...]

// Use?
ofFunction2 (MyComponent "foo" 5 []) []

Je viens de remarquer que nous avons oublié de discuter de la façon dont cela s'appellerait. Dans l'exemple ci-dessus, je viens d'ajouter un argument d'unité à la fin pour empêcher l'exécution, mais il peut y avoir d'autres moyens.

En principe, je voulais éviter autant que possible les attributs magiques en F#, mais cela pourrait se justifier dans ce cas. Une alternative pourrait être d'attendre que les enregistrements anonymes entrent dans F#. Ils peuvent résoudre cette situation et nous nous alignerions sur le F# standard, et il semble qu'ils seront au début des aperçus F# .

discussion

Commentaire le plus utile

Les notices anonymes sont encore assez verbeuses :

// Declaration
let userView = namedMemo "User" (fun ({| UserId: string; Name: string |}) ->
    a [Href (sprintf "/%s/" props.UserId)] [str props.Name])

// Usage
ofElementType userView { UserId = "vbfox"; Name = "Julien Roncaglia" } []

Enregistrements normaux :

// Declaration
type UserViewProps = { UserId: string; Name: string }
let userView = namedMemo "User" (fun props ->
    a [Href (sprintf "/%s/" props.UserId)] [str props.Name])

// Usage
ofElementType userView { UserId = "vbfox"; Name = "Julien Roncaglia" } []

Mais plus je pense à ma proposition, plus je vois des problèmes avec elle... Même avec une telle primitive, cela permettrait aux composants fonctionnels de fonctionner mais pas à ceux enveloppés comme mémo car les noms des arguments seraient perdus du compilateur :( : ( :(

Je pense que vous pouvez fermer ce @alfonsogarciacaro J'en rouvrirai un si je trouve un moyen de résoudre ce problème... Pour l'instant, nous allons créer des enregistrements ou des tuples XD

Tous les 3 commentaires

Une alternative pourrait être d'attendre que les enregistrements anonymes entrent dans F#

Étant donné que le problème est déjà résolu sur la partie F# des choses et qu'il existe déjà une alternative dans Fable en définissant un enregistrement, je suggérerais d'attendre que nous ayons des enregistrements anonymes. Sinon, vous n'ajouterez qu'une fonctionnalité qui sera supprimée dans un proche avenir, sans oublier qu'elle doit être implémentée, testée, documentée, ajoutée avec quelques exemples et les utilisateurs devront apprendre un autre attribut à côté de leur arsenal de bizarreries Fable qui faire des choses javascript

Je suis favorable à l'attente d'un enregistrement F# anonyme

Les notices anonymes sont encore assez verbeuses :

// Declaration
let userView = namedMemo "User" (fun ({| UserId: string; Name: string |}) ->
    a [Href (sprintf "/%s/" props.UserId)] [str props.Name])

// Usage
ofElementType userView { UserId = "vbfox"; Name = "Julien Roncaglia" } []

Enregistrements normaux :

// Declaration
type UserViewProps = { UserId: string; Name: string }
let userView = namedMemo "User" (fun props ->
    a [Href (sprintf "/%s/" props.UserId)] [str props.Name])

// Usage
ofElementType userView { UserId = "vbfox"; Name = "Julien Roncaglia" } []

Mais plus je pense à ma proposition, plus je vois des problèmes avec elle... Même avec une telle primitive, cela permettrait aux composants fonctionnels de fonctionner mais pas à ceux enveloppés comme mémo car les noms des arguments seraient perdus du compilateur :( : ( :(

Je pense que vous pouvez fermer ce @alfonsogarciacaro J'en rouvrirai un si je trouve un moyen de résoudre ce problème... Pour l'instant, nous allons créer des enregistrements ou des tuples XD

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

ncave picture ncave  ·  3Commentaires

krauthaufen picture krauthaufen  ·  3Commentaires

tomcl picture tomcl  ·  4Commentaires

jwosty picture jwosty  ·  3Commentaires

nozzlegear picture nozzlegear  ·  3Commentaires