Fable: Atributo para compilar argumentos como objeto JS

Creado en 30 oct. 2018  ·  3Comentarios  ·  Fuente: fable-compiler/Fable

Las nuevas adiciones a React (memo, hooks) indican que la comunidad se moverá más hacia funciones como componentes que como clases. Esta es una buena noticia para nosotros, porque la sintaxis de la clase en F # es un poco detallada para este propósito. Sin embargo, todavía hay cosas que podemos hacer para mejorar la experiencia.

En FableConf @vbfox sugirió habilitar un atributo para compilar argumentos como un objeto JS, por lo que no necesitamos declarar un registro cada vez que queremos definir un componente de función con props. Entonces en lugar de:

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

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

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

Podríamos escribir:

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

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

Me di cuenta de que nos olvidamos de discutir cómo se llamaría esto. En el ejemplo anterior, acabo de agregar un argumento de unidad al final para evitar la ejecución, pero puede haber otras formas.

En principio, quería evitar los atributos mágicos en F # tanto como fuera posible, pero podría estar justificado en este caso. Una alternativa podría ser simplemente esperar hasta que los registros anónimos entren en F #. Pueden resolver esta situación y nos alinearíamos con F # estándar, y parece que estarán al principio de las vistas previas de F # .

discussion

Comentario más útil

Los registros anónimos siguen siendo bastante detallados:

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

Registros normales:

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

Pero cuanto más pienso en mi propuesta, más problemas veo con ella ... Incluso con un elemento tan primitivo, permitiría que los componentes funcionales funcionen pero no los envueltos como memo, ya que los nombres de los argumentos se perderían del compilador :(: (:(

Creo que puedes cerrar esto @alfonsogarciacaro Voy a volver a abrir uno si encuentro la manera de solucionar esto ... Por ahora crearemos registros o tuplas XD

Todos 3 comentarios

Una alternativa podría ser simplemente esperar hasta que los registros anónimos entren en F #

Dado que el problema ya se aborda en la parte F # de las cosas y ya existe una alternativa en Fable al definir un registro, sugeriría esperar hasta que tengamos registros anónimos. De lo contrario, solo agregará una característica que se eliminará en un futuro cercano, sin mencionar que debe implementarse, probarse, documentarse, agregarse con algunos ejemplos y los usuarios deberán aprender otro atributo más junto a su arsenal de peculiaridades de Fable que hacer cosas javascripty

Estoy a favor de esperar registro anónimo F #

Los registros anónimos siguen siendo bastante detallados:

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

Registros normales:

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

Pero cuanto más pienso en mi propuesta, más problemas veo con ella ... Incluso con un elemento tan primitivo, permitiría que los componentes funcionales funcionen pero no los envueltos como memo, ya que los nombres de los argumentos se perderían del compilador :(: (:(

Creo que puedes cerrar esto @alfonsogarciacaro Voy a volver a abrir uno si encuentro la manera de solucionar esto ... Por ahora crearemos registros o tuplas XD

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

forki picture forki  ·  3Comentarios

alfonsogarciacaro picture alfonsogarciacaro  ·  3Comentarios

forki picture forki  ·  3Comentarios

stkb picture stkb  ·  3Comentarios

nozzlegear picture nozzlegear  ·  3Comentarios