Fable: Atribut untuk mengkompilasi argumen sebagai objek JS

Dibuat pada 30 Okt 2018  ·  3Komentar  ·  Sumber: fable-compiler/Fable

Penambahan baru pada React (memo, hooks) menunjukkan komunitas akan bergerak lebih ke fungsi sebagai komponen daripada kelas. Ini adalah kabar baik bagi kami, karena sintaks kelas di F# sedikit bertele-tele untuk tujuan ini. Namun, masih ada hal-hal yang dapat kita lakukan untuk meningkatkan pengalaman.

Di FableConf @vbfox disarankan untuk mengaktifkan atribut untuk mengkompilasi argumen sebagai objek JS, jadi kita tidak perlu mendeklarasikan record setiap kali kita ingin mendefinisikan komponen fungsi dengan props. Jadi alih-alih:

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

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

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

Kita bisa menulis:

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

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

Saya baru menyadari bahwa kami lupa membahas bagaimana ini akan disebut. Dalam contoh di atas saya baru saja menambahkan argumen unit di bagian akhir untuk mencegah eksekusi, tetapi mungkin ada cara lain.

Pada prinsipnya, saya ingin menghindari atribut sihir di F# sebanyak mungkin, tapi itu bisa dibenarkan dalam kasus ini. Alternatifnya adalah menunggu sampai catatan anonim masuk ke F#. Mereka dapat memecahkan situasi ini dan kami akan menyelaraskan dengan F# standar, dan tampaknya mereka akan berada di awal F# previews .

discussion

Komentar yang paling membantu

Catatan anonim masih cukup verbose:

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

Catatan biasa:

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

Tetapi semakin saya memikirkan proposal saya, semakin saya melihat masalah dengannya ... Bahkan dengan primitif seperti itu akan memungkinkan komponen fungsional berfungsi tetapi tidak dibungkus seperti memo karena nama argumen akan hilang dari kompiler :( : ( :(

Saya pikir Anda dapat menutup @alfonsogarciacaro ini Saya akan membukanya kembali jika saya menemukan cara untuk menyelesaikan ini ... Untuk saat ini kami akan membuat catatan atau tupel XD

Semua 3 komentar

Alternatifnya adalah menunggu sampai catatan anonim masuk ke F#

Karena masalah sudah diatasi pada bagian F# dan sudah ada alternatif di Fable dengan mendefinisikan catatan, saya sarankan untuk menunggu sampai kita memiliki catatan anonim. Jika tidak, Anda hanya akan menambahkan fitur yang akan dihapus dalam waktu dekat, belum lagi itu harus diterapkan, diuji, didokumentasikan, ditambahkan dengan beberapa contoh dan pengguna perlu mempelajari atribut lain di samping gudang kebiasaan Fable mereka yang melakukan hal-hal javascripty

Saya mendukung untuk menunggu catatan F# anonim

Catatan anonim masih cukup verbose:

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

Catatan biasa:

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

Tetapi semakin saya memikirkan proposal saya, semakin saya melihat masalah dengannya ... Bahkan dengan primitif seperti itu akan memungkinkan komponen fungsional berfungsi tetapi tidak dibungkus seperti memo karena nama argumen akan hilang dari kompiler :( : ( :(

Saya pikir Anda dapat menutup @alfonsogarciacaro ini Saya akan membukanya kembali jika saya menemukan cara untuk menyelesaikan ini ... Untuk saat ini kami akan membuat catatan atau tupel XD

Apakah halaman ini membantu?
0 / 5 - 0 peringkat