Fable: Atributo para compilar argumentos como objeto JS

Criado em 30 out. 2018  ·  3Comentários  ·  Fonte: fable-compiler/Fable

As novas adições ao React (memorando, ganchos) indicam que a comunidade irá se mover mais para funções como componentes ao invés de classes. Essa é uma boa notícia para nós, porque a sintaxe de classe em F # é um pouco prolixa para esse propósito. No entanto, ainda há coisas que podemos fazer para melhorar a experiência.

Em FableConf @vbfox sugeriu habilitar um atributo para compilar argumentos como um objeto JS, então não precisamos declarar um registro toda vez que quisermos definir um componente de função com props. Então, em vez de:

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

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

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

Poderíamos escrever:

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

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

Acabei de notar que esquecemos de discutir como isso seria chamado. No exemplo acima, acabei de adicionar um argumento de unidade no final para evitar a execução, mas pode haver outras maneiras.

Em princípio, eu queria evitar atributos mágicos em F # tanto quanto possível, mas poderia ser justificado neste caso. Uma alternativa poderia ser apenas esperar até que os registros anônimos entrassem no F #. Eles podem resolver esta situação e nós nos alinharíamos com o F # padrão, e parece que eles estarão no início das visualizações do F # .

discussion

Comentários muito úteis

Os registros anônimos ainda são bastante prolixos:

// 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 normais:

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

Porém, quanto mais penso em minha proposta, mais vejo problemas com ela ... Mesmo com uma tão primitiva, permitiria que os componentes funcionais funcionassem, mas não os agrupados como memo, pois os nomes dos argumentos seriam perdidos do compilador :(: (:(

Acho que você pode fechar este @alfonsogarciacaro vou reabrir um se eu encontrar uma maneira de resolver isso ... Por enquanto vamos criar registros ou tuplas XD

Todos 3 comentários

Uma alternativa pode ser apenas esperar até que os registros anônimos cheguem ao F #

Uma vez que a questão já está resolvida na parte F # das coisas e já existe uma alternativa no Fable ao definir um registro, sugiro que esperemos até que tenhamos registros anônimos. Caso contrário, você apenas adicionará um recurso que será removido em um futuro próximo, sem mencionar que deve ser implementado, testado, documentado, adicionado com alguns exemplos e os usuários precisarão aprender outro atributo próximo ao seu arsenal de peculiaridades do Fable que fazer coisas javascripty

Sou a favor de aguardar o registro F # anônimo

Os registros anônimos ainda são bastante prolixos:

// 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 normais:

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

Porém, quanto mais penso em minha proposta, mais vejo problemas com ela ... Mesmo com uma tão primitiva, permitiria que os componentes funcionais funcionassem, mas não os agrupados como memo, pois os nomes dos argumentos seriam perdidos do compilador :(: (:(

Acho que você pode fechar este @alfonsogarciacaro vou reabrir um se eu encontrar uma maneira de resolver isso ... Por enquanto vamos criar registros ou tuplas XD

Esta página foi útil?
0 / 5 - 0 avaliações