Pembangun React sudah biasa dengan fakta bahawa React mempunyai dua jenis komponen:
Memandangkan sebutan "kelas" dan "fungsi", soalan secara semula jadi timbul:
Lagipun, jika komponen kelas berkaitan dengan OOP, maka prinsip OOP (warisan, enkapsulasi, polimorfisme, dll.) boleh membimbing pembangunan komponen berasaskan kelas. Begitu juga, prinsip FP boleh menjejaskan komponen berfungsi. Dalam erti kata lain, kita boleh terus menggunakan amalan terbaik paradigma pengaturcaraan ini untuk projek React.
Jadi, apakah hubungan antara komponen berfungsi dan pengaturcaraan berfungsi? Artikel ini akan mendalami topik ini.
Pertama sekali, kita harus menjelaskan dengan jelas bahawa sintaks rangka kerja pada dasarnya ialah DSL (Bahasa Khusus Domain) yang disesuaikan untuk pembangunan dalam domain tertentu.
Sebagai contoh, React ialah DSL untuk membina pandangan. Walaupun platform berbeza menggunakan rangka kerja berbeza untuk membina pandangan, contohnya:
Rangka kerja ini biasanya mengikut DSL (sintaks React) yang sama. DSL ini tidak terikat dengan mana-mana paradigma pengaturcaraan tertentu, tetapi harus dilihat sebagai satu set ciri bahasa yang sangat sesuai untuk pembangunan paparan.
Jadi, sebagai sebahagian daripada React DSL:
Selagi prinsip ini bermanfaat untuk melihat pembangunan, ia boleh disepadukan ke dalam DSL.
Sebagai contoh, pertimbangkan Pengepala komponen berfungsi berikut yang terdiri daripada WelcomeMessage dan LogoutButton, yang menunjukkan prinsip gubahan berbanding warisan dalam OOP:
<code class="language-javascript">function Header(props) { return ( <div> <WelcomeMessage name={props.name} /> <LogoutButton onClick={props.onLogout} /> </div> ); }</code>
Begitu juga, pertimbangkan Cpn komponen kelas, di mana kiraan keadaan dikemas kini bukan melalui mutasi (this.state.count), tetapi dengan memanggil this.setState dengan data tidak berubah:
<code class="language-javascript">class Cpn extends React.Component { // ... onClick() { const count = this.state.count; this.setState({ count: count + 1 }); } render() { // ... } }</code>
Menggunakan data tidak berubah mencerminkan prinsip FP.
Oleh itu, apabila meneroka sebarang ciri React, kita harus mempertimbangkan tiga langkah berikut:
Dengan menggunakan proses pemikiran ini pada hubungan antara komponen berfungsi dan pengaturcaraan berfungsi, kami dapati:
Ini mentakrifkan perhubungan antara mereka: Komponen fungsian ialah produk pelaksanaan berbilang paradigma pengaturcaraan (terutamanya OOP dan FP) dalam React, meminjam beberapa idea daripada FP dalam proses.
Komponen fungsian tidak boleh dilihat semata-mata sebagai penjelmaan pengaturcaraan berfungsi dalam React.
Mari kita terokai evolusi komponen berfungsi menggunakan proses pemikiran tiga langkah yang dinyatakan sebelum ini. Falsafah pembangunan React paling baik dinyatakan dengan formula berikut:
<code class="language-javascript">function Header(props) { return ( <div> <WelcomeMessage name={props.name} /> <LogoutButton onClick={props.onLogout} /> </div> ); }</code>
Untuk merealisasikan konsep ini, dua elemen utama diperlukan:
Di sini, data tidak berubah daripada FP lebih sesuai sebagai pembawa syot kilat data. Inilah sebabnya keadaan dalam React tidak boleh diubah - intipati keadaan ialah petikan.
Tiada keperluan khusus untuk pembawa pemetaan fungsi. Dalam React, setiap kemas kini mencetuskan pemaparan semula dan proses pemaparan itu sendiri ialah proses pemetaan fungsi. Input adalah prop dan keadaan, dan output adalah JSX.
Sebaliknya, komponen Vue lebih selaras dengan prinsip OOP. Pertimbangkan komponen Apl Vue ini:
<code class="language-javascript">class Cpn extends React.Component { // ... onClick() { const count = this.state.count; this.setState({ count: count + 1 }); } render() { // ... } }</code>
Kaedah persediaan komponen hanya dilaksanakan sekali semasa permulaan. Operasi kemas kini seterusnya beroperasi pada data yang sama dalam penutupan, yang sepadan dengan konsep kejadian dalam OOP.
Memandangkan React tidak mengenakan keperluan khas pada pembawa pemetaan fungsi, kedua-dua komponen kelas dan komponen fungsi adalah pilihan yang berdaya maju.
Ramai orang percaya bahawa meningkatkan kebolehgunaan semula logik melalui cangkuk adalah sebab utama komponen berfungsi lebih baik daripada komponen kelas. Walau bagaimanapun, model pembangunan kelas berasaskan penghias, terutamanya apabila digabungkan dengan TypeScript, telah terbukti sebagai kaedah penggunaan semula logik yang berkesan.
Sebab sebenarnya ialah komponen fungsi boleh melaksanakan konsep UI = fn(snapshot) dengan lebih baik.
Seperti yang dinyatakan sebelum ini, syot kilat dalam formula mewakili syot kilat keadaan, yang dalam React termasuk:
Untuk komponen tertentu, formula UI = fn(snapshot) memastikan syot kilat yang sama menghasilkan output yang sama (JSX). Walau bagaimanapun, kemas kini keadaan juga boleh mencetuskan kesan sampingan, seperti pengambilan data atau manipulasi DOM.
Dalam komponen kelas, logik kesan sampingan ini bertaburan dalam pelbagai kaedah kitaran hayat, menjadikan React sukar dikawal. Tetapi dalam komponen fungsi:
<code>UI = fn(snapshot);</code>
Penggunaan:
<code class="language-javascript">const App = { setup(initialProps) { const count = reactive({ count: 0 }); const add = () => { count.value++; }; return { count, add }; }, template: "...omitted" };</code>
Ringkasnya, komponen berfungsi memastikan kesan sampingan kekal terkawal, memberikan output yang konsisten untuk input syot kilat yang sama. Ini konsisten dengan konsep fungsi tulen dalam FP, itulah sebabnya komponen berfungsi telah menjadi pilihan arus perdana dalam React.
Komponen fungsi bukanlah pelaksanaan langsung pengaturcaraan berfungsi dalam React, tetapi pembawa yang paling sesuai untuk melaksanakan konsep teras React UI = fn(snapshot). React mengintegrasikan idea-idea cemerlang daripada pelbagai paradigma pengaturcaraan, yang mana FP mempunyai pengaruh paling besar. Akhirnya, setiap pilihan reka bentuk memenuhi idea keseluruhan.
Leapcell ialah platform tanpa pelayan generasi baharu untuk pengehosan web, tugas tak segerak dan Redis:
Sokongan berbilang bahasa
Kerahkan projek tanpa had secara percuma
Keberkesanan kos yang tiada tandingan
Pengalaman pembangun yang dipermudahkan
Skala mudah dan prestasi tinggi
Ketahui lebih lanjut dalam dokumentasi!
Ikuti kami di X: @LeapcellHQ
Baca blog kami
Atas ialah kandungan terperinci Adakah Komponen Fungsi Sama Pengaturcaraan Fungsian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!