Rumah alat pembangunan composer Langkah terperinci untuk merangkum Komposer Konteks React (kongsi)

Langkah terperinci untuk merangkum Komposer Konteks React (kongsi)

Dec 20, 2021 pm 01:57 PM

Artikel ini ditulis oleh komposer ruangan tutorial untuk memperkenalkan kepada anda cara merangkumkan React Context Composer langkah demi langkah. Saya harap ia dapat membantu rakan yang memerlukan.

Bagaimanakah cara saya merangkum Komposer Konteks React langkah demi langkah?

Motivasi

React mempunyai banyak penyelesaian pengurusan negeri, seperti Redux, Mobx, Recoil, dll. Setakat ini, saya hanya mengalami Redux, dan saya fikir ia masih agak menyusahkan. Kerana saya biasanya menulis banyak Cangkuk, saya lebih suka menggunakan Pembekal Konteks dengan cangkuk useContext, yang menjadikannya lebih mudah untuk memisahkan dan menggabungkan keadaan. Di sini, kami tidak akan membincangkan kebaikan dan keburukan setiap penyelesaian pengurusan negeri, tetapi menumpukan pada masalah sarang berbilang lapisan yang dihadapi apabila menggunakan Konteks.

Gambar di bawah ialah beberapa kod yang diekstrak daripada projek taro react hooks ts yang saya tulis baru-baru ini. Saya membahagikan beberapa keadaan global (tujuan pemisahan adalah untuk mengurangkan pemaparan semula yang tidak perlu) dan kemudian menyarangkannya. Cara penulisan ini mengingatkan saya tentang perasaan dikuasai oleh neraka panggil balik, yang sangat tidak selesa. Oleh itu, saya terfikir untuk menyegel komponen pesanan tinggi sendiri dan "meratakan" struktur dari segi penulisan.

<LoadingContext.Provider value={{ loading, setLoading }}>
  <UserDataContext.Provider value={{ name: "ascodelife", age: 25 }}>
    <ThemeContext.Provider value={"light"}>
    {/* ....more Providers as long as you want */}
    </ThemeContext.Provider>
  </UserDataContext.Provider>
</LoadingContext.Provider>
Salin selepas log masuk

Penyelesaian paling mudah

Di sini, saya dengan pantas menulis penyelesaian pertama, menggunakan reduceRight untuk melengkapkan sarang Penyedia.

Sebab reduceRight digunakan di sini dan bukannya reduce adalah kerana kita lebih terbiasa dengan susunan tulisan dari lapisan luar hingga lapisan dalam.

// ContextComposer.tsx
import React from &#39;react&#39;;
type IContextComposerProps = {
  contexts: { context: React.Context<any>; value: any }[];
};
const ContextComposer: React.FC<IContextComposerProps> = ({ contexts, children }) => {
  return (
    <>
      {contexts.reduceRight((child, parent) => {
        const { context, value } = parent;
        return <context.Provider value={value}>{child}</context.Provider>;
      }, children)}
    </>
  );
};
export default ContextComposer;
// App.tsx
<ContextComposer
  contexts={[
    { context: ThemeContext, value: "light" },
    { context: UserDataContext, value: { name: "ascodelife", age: 25 } },
    { context: LoadingContext, value: { loading, setLoading } },
  ]}>
    { children }
</ContextComposer>
Salin selepas log masuk

Selepas pengalaman sebenar, saya mendapati bahawa walaupun ia boleh digunakan, pengalaman pembangunan sedikit lebih teruk. Masalahnya ialah nilai yang diluluskan apabila komponen memasuki parameter adalah dari jenis mana-mana, yang bermaksud bahawa pemeriksaan jenis statik ts ditinggalkan. Apabila menghantar parameter, memandangkan semakan jenis statik tidak akan dilakukan pada nilai, bukan sahaja tiada sebarang gesaan kod semasa menaip kod, tetapi ia juga boleh menyebabkan beberapa ralat masa jalan yang agak rendah. Ulasan buruk!

Pelan transformasi berdasarkan React.cloneElement()

Untuk mengubah penyelesaian di atas, saya beralih kepada fungsi yang agak tidak popular tetapi mudah digunakan - React. cloneElement(). Tidak banyak perkara yang perlu diberi perhatian tentang fungsi ini Terutamanya lihat pada tiga parameter inputnya Yang pertama ialah elemen induk, yang kedua ialah prop induk, dan yang ketiga ialah parameter yang selebihnya... kanak-kanak, kecuali bagi. parameter pertama Kecuali untuk ini, semua nilai lain adalah pilihan.

Contohnya:

<!-- 调用函数 -->
React.cloneElement(<div/>,{},<span/>);
<!-- 相当于创建了这样一个结构 -->
<div> 
    <span></span>
</div>
Salin selepas log masuk

Kemudian mari kita mulakan transformasi Bingkai reduceRight kekal tidak berubah.

// ContextComposer.tsx
import React from &#39;react&#39;;
type IContextComposerProps = {
  contexts: React.ReactElement[];
};
const ContextComposer: React.FC<IContextComposerProps> = ({ contexts, children }) => {
  return (
    <>
      {contexts.reduceRight((child, parent) => {
        return React.cloneElement(parent,{},child);
      }, children)}
    </>
  );
};
export default ContextComposer;
// App.tsx
<ContextComposer
  contexts={[
      <ThemeContext.Provider value={"light"} />,
      <UserDataContext.Provider value={{ name: "ascodelife", age: 25 }} />,
      <LoadingContext.Provider value={{ loading, setLoading }} />,
  ]}>
    { children }
</ContextComposer>
Salin selepas log masuk

Selepas transformasi, apabila kita melepasi parameter, nampaknya kita benar-benar mencipta komponen (sudah tentu, komponen itu sebenarnya dicipta, tetapi komponen itu sendiri tidak diberikan kepada Dom maya. rendering sebenar Apa yang naik ialah salinan klon). Pada masa yang sama, masalah semakan jenis statik nilai yang baru kita fokuskan juga telah diselesaikan.

petua: React.cloneElement(ibu bapa,{},anak) bersamaan dengan React.cloneElement(ibu bapa,{anak:anak}), adakah anda tahu mengapa?

Sumber berkaitan

Kod sumber telah disegerakkan ke github (https://github.com/ascodelife/react-context-provider-composer).

Ia juga telah dibungkus dalam gudang npm (https://www.npmjs.com/package/@ascodelife/react-context-provider-composer).

Atas ialah kandungan terperinci Langkah terperinci untuk merangkum Komposer Konteks React (kongsi). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apa yang dilakukan oleh komposer? Apa yang dilakukan oleh komposer? Apr 08, 2025 am 12:19 AM

Komposer adalah alat pengurusan ketergantungan untuk PHP, yang digunakan untuk mengisytiharkan, memuat turun dan mengurus kebergantungan projek. 1) Mengisytiharkan kebergantungan melalui fail composer.json, 2) Pasang kebergantungan menggunakan perintah komposerinstall, 3) menghuraikan pokok pergantungan dan memuat turunnya dari pembungkus, 4) menghasilkan fail autoload.php untuk memudahkan pemuatan automatik, 5) Mengoptimumkan penggunaan termasuk menggunakan composerupdate-prefer-dist dan penyesuaian autoload.

Untuk apa komposer digunakan? Untuk apa komposer digunakan? Apr 06, 2025 am 12:02 AM

Komposer adalah alat pengurusan ketergantungan untuk PHP. Langkah-langkah teras menggunakan komposer termasuk: 1) mengisytiharkan kebergantungan dalam komposer.json, seperti "jalur/jalur-php": "^7.0"; 2) Jalankan ComposerInstall untuk memuat turun dan mengkonfigurasi kebergantungan; 3) Menguruskan versi dan autoload melalui komposer.lock dan autoload.php. Komposer memudahkan pengurusan pergantungan dan meningkatkan kecekapan projek dan penyelenggaraan.

Apakah perbezaan antara komposer dan orkestrator? Apakah perbezaan antara komposer dan orkestrator? Apr 02, 2025 pm 02:49 PM

Komposer digunakan untuk menguruskan kebergantungan pada projek PHP, manakala orkestrator digunakan untuk mengurus dan menyelaraskan microservices atau aplikasi kontena. 1.composer mengisytiharkan dan menguruskan kebergantungan projek PHP melalui fail komposer.json. 2. Orchestrator menguruskan penggunaan dan peluasan perkhidmatan melalui fail konfigurasi (seperti fail YAML Kubernetes), memastikan ketersediaan dan pengimbangan beban yang tinggi.

Kepakaran Komposer: Apa yang menjadikan seseorang mahir Kepakaran Komposer: Apa yang menjadikan seseorang mahir Apr 11, 2025 pm 12:41 PM

Untuk menjadi mahir apabila menggunakan komposer, anda perlu menguasai kemahiran berikut: 1. Berfungsi dalam menggunakan komposer.json dan komposer.lock fail, 2.

Selesaikan masalah sambungan pangkalan data: Kes praktikal menggunakan perpustakaan mini/db Selesaikan masalah sambungan pangkalan data: Kes praktikal menggunakan perpustakaan mini/db Apr 18, 2025 am 07:09 AM

Saya menghadapi masalah yang rumit ketika membangunkan aplikasi kecil: keperluan untuk mengintegrasikan perpustakaan operasi pangkalan data ringan dengan cepat. Selepas mencuba beberapa perpustakaan, saya mendapati bahawa mereka mempunyai terlalu banyak fungsi atau tidak serasi. Akhirnya, saya dapati Minii/DB, versi mudah berdasarkan YII2 yang menyelesaikan masalah saya dengan sempurna.

Selesaikan masalah caching dalam kraf CMS: Menggunakan plug-in wiejeben/craft-laravel-mix Selesaikan masalah caching dalam kraf CMS: Menggunakan plug-in wiejeben/craft-laravel-mix Apr 18, 2025 am 09:24 AM

Apabila membangunkan laman web yang menggunakan CraftCMS, anda sering menghadapi masalah caching fail sumber, terutamanya apabila anda sering mengemas kini fail CSS dan JavaScript, versi lama fail mungkin masih di -cache oleh penyemak imbas, menyebabkan pengguna tidak melihat perubahan terkini dalam masa. Masalah ini bukan sahaja memberi kesan kepada pengalaman pengguna, tetapi juga meningkatkan kesukaran pembangunan dan debugging. Baru-baru ini, saya menghadapi masalah yang sama dalam projek saya, dan selepas beberapa penjelajahan, saya dapati plugin Wiejeben/Craft-Laravel-Mix, yang sempurna menyelesaikan masalah caching saya.

Gunakan komposer untuk menyelesaikan dilema sistem cadangan: Andres-Montanez/Cadangan-Bundle Gunakan komposer untuk menyelesaikan dilema sistem cadangan: Andres-Montanez/Cadangan-Bundle Apr 18, 2025 am 11:48 AM

Apabila membangunkan laman web e-dagang, saya menghadapi masalah yang sukar: bagaimana menyediakan pengguna dengan cadangan produk yang diperibadikan. Pada mulanya, saya mencuba beberapa algoritma cadangan mudah, tetapi hasilnya tidak sesuai, dan kepuasan pengguna juga terjejas. Untuk meningkatkan ketepatan dan kecekapan sistem cadangan, saya memutuskan untuk menggunakan penyelesaian yang lebih profesional. Akhirnya, saya memasang Andres-Montanez/Cadangan-Bundle melalui komposer, yang bukan sahaja menyelesaikan masalah saya, tetapi juga meningkatkan prestasi sistem cadangan. Anda boleh belajar komposer melalui alamat berikut:

Meningkatkan kecekapan siri entiti doktrin: Penggunaan Sidus/Doktrin-Serializer-Bundle Meningkatkan kecekapan siri entiti doktrin: Penggunaan Sidus/Doktrin-Serializer-Bundle Apr 18, 2025 am 11:42 AM

Saya mempunyai masalah yang sukar apabila mengerjakan projek dengan sejumlah besar entiti doktrin: Setiap kali entiti bersiri dan deserialized, prestasi menjadi sangat tidak cekap, mengakibatkan peningkatan yang signifikan dalam masa tindak balas sistem. Saya telah mencuba pelbagai kaedah pengoptimuman, tetapi ia tidak berfungsi dengan baik. Nasib baik, dengan menggunakan Sidus/Doctrine-Serializer-Bundle, saya berjaya menyelesaikan masalah ini, dengan ketara meningkatkan prestasi projek.

See all articles