Ada situs https://custom-elements-everywhere.com yang cukup populer yang menunjukkan bagaimana komponen web bekerja dalam kerangka kerja yang berbeda. Hampir semua kerangka kerja memiliki hasil 100% yang indah di sana, tetapi React memiliki 71% yang sangat mengkhawatirkan di sana:
Banyak pengguna melihat halaman ini dan menyimpulkan bahwa React tidak hanya mendukung komponen web dengan buruk, tetapi juga DOM API secara umum. Begitu? Apakah ini benar-benar buruk?
Mari kita cari tahu!
Menganalisis tes
Peringkat tersebut dihitung berdasarkan tes. Di sinilah hasilnya ditampilkan . Ada total 15 tes, 7 di antaranya rusak, oleh karena itu kami mendapatkan peringkat yang tidak penting. Tes berikut rusak:
atribut dan properti
akan melewatkan data array sebagai properti
akan mengirimkan data objek sebagai properti
acara
dapat secara deklaratif mendengarkan kejadian DOM huruf kecil yang dikirim oleh Elemen Khusus
bisa secara deklaratif mendengarkan kejadian DOM kasus kebab yang dikirim oleh Elemen Khusus
dapat secara deklaratif mendengarkan kejadian DOM camelCase yang dikirim oleh Elemen Khusus
dapat secara deklaratif mendengarkan peristiwa CAPScase DOM yang dikirim oleh Elemen Kustom
dapat secara deklaratif mendengarkan kejadian DOM PascalCase yang dikirim oleh Elemen Khusus
, , . . 71% , 90% 15% , - .
, - , . - Github:
" " ? .
:
<input type="checkbox" checked={checked} onChange={handleChange} />
. - :
<custom-checkbox checked={checked} onChange={handleChange} />
, on*
React . ( ) . , Sebastian MarkbΓ₯ge ( React) . :
, . , touch- , , , , "" , .. , .
, , . , , , . , . DOM-, _ _ , . DOM- (refs) .
, React DOM-, , React ( Concurrent mode), Refs API:
function CustomCheckbox({ checked, handleChange }) {
const ref = useRef();
useEffect(() => {
ref.current.addEventListener("change", handleChange);
return () => ref.current.removeEventListener("change", handleChange);
}, [handleChange]);
return <custom-checkbox ref={ref} />;
}
, custom-elements-everywhere? , . , , / .
?
" -" . , - JSX . , ( JSON.stringify) :
<user-view user="{user}" />
<!-- <user-view user="[object Object]" /> -->
. React DOM - . DOM- , . React- :
function UserView({ user }) {
const ref = useRef();
// user
useEffect(() => (ref.current.user = user), [user]);
return <user-view ref={ref} />;
}
/** @jsx h */
import { createElement } from "react";
import val from "@skatejs/val";
const h = val(createElement);
function Checkbox({ checked, handleChange }) {
// !
return <custom-checkbox checked={checked} onChange={handleChange} />;
}
, , , Google Developer Advocates , , . , React DOM ( ).
100%
100% . ? !. ( new CustomEvent('!')
)?
. , Angular . materials-components-web : MDCSlider:change
. Google (Angular) (Material design). , β DOM-.
, , - React 71% , Angular 100%. .
, . . , DOM β . , custom-elements-everywhere .
c custom-elements-everywhere, React DOM API -. , :
onChange React DOM- change. , [Github issue](https://github.com/facebook/react/issues/9657). React, React - , , onChange React β .
onFocus/onBlur . DOM API, focus, , . React , focusin. issue.
. , , . Portal API React-. DOM-, .
, . , , , React , () - DOM API , React (, react-focus-lock).
- . label. for id :
<label for="name"> </label>
<input id="name" name="firstName" />
. React :
const id = useUniqueId();
<Label for={id}> </Label>
<Input id={id} name="firstName" />
Label Input html- .
React, -:
<custom-label for="name"> </custom-label>
<custom-input id="name" name="firstName" />
Kotak teks kita rusak! Tag label bagian dalam tidak dapat berkomunikasi dengan tag input karena berada pada instance ShadowDOM yang berbeda. Ada proposal yang dirancang untuk mengatasi masalah ini , tetapi masih dalam tahap awal dan tidak berfungsi di browser mana pun (ingat, komponen web telah dikembangkan selama hampir 10 tahun). Dan pada saat ini , hal itu tidak akan mungkin untuk menerapkan custom-label
itu custom-input
dalam bentuk komponen web, mengamati persyaratan aksesibilitas.
Jadi pikirkan sendiri teknologi mana yang benar-benar melanggar standar web.