Fable: Attribut zum Kompilieren von Argumenten als JS-Objekt

Erstellt am 30. Okt. 2018  ·  3Kommentare  ·  Quelle: fable-compiler/Fable

Die neuen Ergänzungen zu React (Memo, Hooks) deuten darauf hin, dass sich die Community mehr in Richtung Funktionen als Komponenten statt als Klassen bewegen wird. Das ist eine gute Nachricht für uns, denn die Klassensyntax in F# ist für diesen Zweck etwas ausführlich. Es gibt jedoch noch Dinge, die wir tun können, um die Erfahrung zu verbessern.

Auf der FableConf schlug @vbfox vor, ein Attribut zu aktivieren, um Argumente als JS-Objekt zu kompilieren, damit wir nicht jedes Mal einen Datensatz deklarieren müssen, wenn wir eine Funktionskomponente mit Requisiten definieren möchten. Also statt:

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

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

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

Wir könnten schreiben:

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

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

Mir ist gerade aufgefallen, dass wir vergessen haben zu besprechen, wie das heißen würde. Im obigen Beispiel habe ich am Ende nur ein Unit-Argument hinzugefügt, um die Ausführung zu verhindern, aber es gibt möglicherweise andere Möglichkeiten.

Prinzipiell wollte ich magische Attribute in F# so gut wie möglich vermeiden, aber in diesem Fall könnte es gerechtfertigt sein. Eine Alternative könnte darin bestehen, einfach zu warten, bis anonyme Datensätze in F# eingehen. Sie könnten diese Situation lösen, und wir würden uns an Standard-F# ausrichten, und es scheint, dass sie früh in F#-Vorschauen erscheinen werden .

discussion

Hilfreichster Kommentar

Anonyme Datensätze sind immer noch ziemlich ausführlich:

// 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" } []

Normale Aufzeichnungen:

// 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" } []

Aber je mehr ich über meinen Vorschlag nachdenke, desto mehr Probleme sehe ich damit ... Selbst mit einem so primitiven System könnten funktionale Komponenten funktionieren, aber nicht umschlossene wie Memos, da die Argumentnamen vom Compiler verloren gehen würden :( : ( :(

Ich denke, Sie können dieses @alfonsogarciacaro schließen. Ich werde einen erneut öffnen, wenn ich einen Weg finde, das Moment erstellen wir Datensätze oder Tupel XD

Alle 3 Kommentare

Eine Alternative könnte sein, einfach zu warten, bis anonyme Datensätze in F# eingehen.

Da das Problem bereits im F#-Teil der Dinge behandelt wird und es in Fable bereits eine Alternative gibt, indem ein Datensatz definiert wird, würde ich vorschlagen, zu warten, bis wir anonyme Datensätze haben. Andernfalls fügen Sie nur ein Feature hinzu, das in naher Zukunft entfernt wird, ganz zu schweigen davon, dass es implementiert, getestet, dokumentiert, mit einigen Beispielen hinzugefügt werden muss und die Benutzer neben ihrem Arsenal an Fable-Macken noch ein weiteres Attribut lernen müssen, das Javascript Dinge tun

Ich bin dafür, auf anonymen F#-Eintrag zu warten

Anonyme Datensätze sind immer noch ziemlich ausführlich:

// 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" } []

Normale Aufzeichnungen:

// 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" } []

Aber je mehr ich über meinen Vorschlag nachdenke, desto mehr Probleme sehe ich damit ... Selbst mit einem so primitiven System könnten funktionale Komponenten funktionieren, aber nicht umschlossene wie Memos, da die Argumentnamen vom Compiler verloren gehen würden :( : ( :(

Ich denke, Sie können dieses @alfonsogarciacaro schließen. Ich werde einen erneut öffnen, wenn ich einen Weg finde, das Moment erstellen wir Datensätze oder Tupel XD

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen