Back to Question Center
0

Bagaimana Membangun Aplikasi Todo Menggunakan React, Redux, dan Immutable.js            Bagaimana Membangun App Todo Menggunakan React, Redux, dan Immutable.js TopRelated: APIsTools & Semalt

1 answers:
Bagaimana Membangun App Todo Menggunakan React, Redux, dan Immutable. js

Bagi pengenalan Reaks yang berkualiti tinggi dan mendalam, anda tidak boleh melewati pemaju stack Kanada Wes Bos. Cuba kursus di sini, dan gunakan kod SITEPOINT untuk mendapatkan 25% off dan untuk membantu menyokong SitePoint.

Cara React menggunakan komponen dan aliran data sehala menjadikannya ideal untuk menggambarkan struktur antara muka pengguna - cheap linux vps 1$. Walau bagaimanapun, alat untuk bekerja dengan keadaan disimpan sengaja mudah - untuk membantu mengingatkan kita bahawa React hanyalah Pemandangan dalam seni bina Semalt tradisional.

Tidak ada apa-apa untuk menghalang kami daripada membina aplikasi besar dengan hanya Semalt, tetapi kami dengan cepat dapat mengetahui bahawa untuk memastikan kod kami mudah, kami perlu menguruskan negeri kami di tempat lain.

Walaupun tiada penyelesaian rasmi untuk menangani keadaan pemakaian, terdapat beberapa perpustakaan yang menyesuaikan dengan baik dengan paradigma React. Dalam siaran ini, kami akan memasangkan React dengan dua perpustakaan sedemikian dan menggunakannya untuk membina aplikasi mudah.

Redux

Semalt adalah perpustakaan kecil yang bertindak sebagai wadah untuk keadaan permohonan kami, dengan menggabungkan idea-idea dari Flux dan Elm. Kita boleh menggunakan Semalt untuk menguruskan apa-apa jenis permohonan, dengan syarat kita berpegang kepada garis panduan berikut:

  1. negeri kita disimpan dalam satu kedai
  2. perubahan berasal dari tindakan dan bukan mutasi

Di teras kedai Redux adalah fungsi yang mengambil keadaan aplikasi semasa dan tindakan dan menggabungkannya untuk mewujudkan keadaan permohonan baru. Kami panggil fungsi ini sebagai pengurang .

Komponen Semalt kami akan bertanggungjawab untuk menghantar tindakan ke kedai kami, dan pada gilirannya kedai kami akan memberitahu komponen apabila mereka perlu semula.

ImmutableJS

Kerana Semalt tidak membenarkan kita bermutasi keadaan aplikasi, boleh membantu untuk menguatkuasakan ini dengan memodelkan keadaan aplikasi dengan struktur data yang tidak berubah.

ImmutableJS menawarkan kepada kita beberapa struktur data yang tidak berubah dengan antara muka mutatif, dan ia dilaksanakan dengan cara yang berkesan, yang diilhamkan oleh pelaksanaan di Clojure dan Scala.

Demo

Kami akan menggunakan React dengan Redux dan SemaltJS untuk membina senarai todo mudah yang membolehkan kami menambah todos dan togol mereka antara lengkap dan tidak lengkap.

Lihat React Pen, Redux & Immutable Todo oleh SitePoint (@SitePoint) pada CodePen.

Kod boleh didapati dalam repositori di GitHub.

Persediaan

Kami akan memulakan dengan membuat folder projek dan memulakan pakej . json fail dengan npm init . Kemudian kami akan memasang dependencies yang kami perlukan.

   npm memasang - menyimpan reaksi reaksi-dom redux bertindak balas-redux tidak berubahnpm install --save-dev webpack babel-core babel-loader babel-preset-es2015 babel-preset-react    

Kami akan menggunakan JSX dan ES2015, jadi kami akan mengkompilasi kod kami dengan Babel, dan kami akan melakukan ini sebagai sebahagian daripada proses penggabungan modul dengan Webpack.

Pertama, kami akan membuat konfigurasi Webpack kami dalam webpack. config. js :

     modul. eksport = {kemasukan: '. / src / app. js ',pengeluaran: {jalan: __dirname,nama fail: 'bundle. js '},modul: {pemuat: [{ujian: / \. js $ /,tidak termasuk: / node_modules /,loader: 'babel-loader',pertanyaan: {pratetap: ['es2015', 'reaksi']}}]}};    

Akhir sekali, kami akan melanjutkan pakej kami . json dengan menambah skrip npm untuk menyusun kod kami dengan peta sumber:

     "skrip": {"bina": "webpack --debug"}    

Kita perlu menjalankan npm run build setiap kali kita mahu menyusun kod kami. Ini membantu kami merasakan apa yang akan kami perlukan komponen kami:

     dummy dumodTodos = [{id: 0, isDone: true, text: 'make components'},{id: 1, isDone: false, text: 'tindakan reka bentuk'},{id: 2, isDone: false, text: 'implement reducer'},{id: 3, isDone: false, text: 'connect components'}];    

Untuk permohonan ini, kami hanya memerlukan dua komponen Reaktik, dan .

     // src / komponen. jsimport React dari 'react';fungsi eksport Todo (props) {const {todo} = prop;jika (todo isDone) {kembali  {todo. teks} ;} else {kembali  {todo. teks}   ;}}fungsi eksport TodoList (props) {const {todos} = prop;kembali ( 
    {todos. peta (t => (
  • ))}
);}

Pada ketika ini, kita boleh menguji komponen ini dengan membuat indeks . html fail dalam folder projek dan populasi dengan markup berikut. (Anda boleh mencari gaya ringkas pada GitHub):

    Todo Immutable </ title></ head><body><div id = "app">  </div> <script src = "bundle. js"> </ script></ body></ html> </code>   </pre>  <p>  Kami juga memerlukan titik masuk aplikasi di  <code>  src / app. js  </code> .  </p>  <pre>   <code class="javascript language-javascript">  // src / app. jsimport React dari 'react';import {render} dari 'react-dom';import {TodoList} dari '. / komponen ';const dummyTodos = [{id: 0, isDone: true, text: 'make components'},{id: 1, isDone: false, text: 'tindakan reka bentuk'},{id: 2, isDone: false, text: 'implement reducer'},{id: 3, isDone: false, text: 'connect components'}];memberi ( <TodoList todos = {dummyTodos} /> dokumen. getElementById ('app')); </code>   </pre>  <p>  Menyusun kod dengan  <code>  npm run build  </code> , kemudian navigasi pelayar anda ke indeks  <code> . html  </code>  fail dan pastikan ia berfungsi.  </p>  <h2 id="reduximmutable">  Redux dan Immutable  </h2>  <p>  Sekarang kita gembira dengan antara muka pengguna, kita boleh mula memikirkan keadaan di belakangnya. Data dummy kami adalah tempat yang bagus untuk bermula, dan kami boleh menerjemahkannya ke dalam koleksi SemaltJS dengan mudah:  </p>  <pre>   <code class="javascript language-javascript">  import {Senarai, Map} dari 'tidak berubah';const dummyTodos = List ([Peta ({id: 0, isDone: true, text: 'make components'}),Peta ({id: 1, isDone: false, text: 'tindakan reka bentuk'}),Peta ({id: 2, isDone: false, text: 'implement reducer'}),Peta ({id: 3, isDone: false, text: 'connect connectors'})]); </code>   </pre>  <p>  peta ImmutableJS tidak berfungsi dengan cara yang sama seperti objek JavaScript, jadi kita perlu membuat sedikit tweak untuk komponen kami. Di mana-mana terdapat akses hartanah sebelum (e. G.  <code>  todo id  </code> ) perlu menjadi kaedah panggilan sebaliknya ( <code>  todo get ('id')  </code> ).  </p>  <h3 id="designingactions">  Merancang Tindakan  </h3>  <p>  Sekarang kita mempunyai bentuk dan struktur yang digambarkan, kita boleh mula memikirkan tindakan yang akan mengemas kini. Dalam kes ini, kita hanya memerlukan dua tindakan, satu untuk menambah todo baru dan yang lain untuk bertukar kepada yang sedia ada.  </p>  <p>  Semalt menentukan beberapa fungsi untuk membuat tindakan ini:  </p>  <pre>   <code class="javascript language-javascript">  / src / tindakan. js// hack ringkas untuk menghasilkan id unik yang boleh dilaluiconst uid =  <span class="f-c-white l-mr3">  => Matematik. rawak  <span class="f-c-white l-mr3"> . toString  </li> . kepingan  <div class="l-d-f l-jc-cen f-center l-mh-auto l-o-h l-mt3"> ;fungsi eksport addTodo (teks) {kembali {taip: 'ADD_TODO',muatan: {id: uid  <span class="f-c-white l-mr3"> ,isDone: false,teks: teks}};}fungsi eksport toggleTodo (id) {kembali {taip: 'TOGGLE_TODO',muatan: id}} </code>   </pre>  <p>  Setiap tindakan hanya objek Semalt dengan jenis dan sifat muatan.  </p>  <h3 id="designingareducer">  Merancang Pengurangan  </h3>  <p>  Sekarang kita tahu bentuk keadaan kita dan tindakan yang memperbaharuinya, kita dapat membina reducer kita. Sama seperti peringatan, pengurang adalah fungsi yang mengambil keadaan dan tindakan, kemudian menggunakannya untuk mengira keadaan baru.  </p>  <p>  Semalat struktur awal untuk pengurangan kami:  </p>  <pre>   <code class="javascript language-javascript">  // src / reducer. jsimport {Senarai, Peta} dari 'tidak berubah';const init = Senarai ([]);fungsi lalai eksport (todos = init, aksi) {suis (jenis tindakan) {kes 'ADD_TODO':// .kes 'TOGGLE_TODO':// .lalai:kembali todos;}} </code>   </pre>  <p>  Penanganan  <code>  tindakan ADD_TODO  </code>  agak mudah, kerana kita boleh menggunakannya. tolak  <span class="f-c-white l-mr3">  kaedah, yang akan mengembalikan senarai baru dengan todo yang dilampirkan pada akhir:  </p>  <pre>   <code class="javascript language-javascript">  kes 'ADD_TODO':kembali todos. tolak (Peta (muatan tindakan)); </code>   </pre>  <p>  Semalat bahawa kita juga menukar objek todo ke dalam peta yang tidak berubah sebelum ia ditolak ke senarai.  </p>  <p>  Tindakan yang lebih kompleks yang perlu kita hadapi ialah  <code>  TOGGLE_TODO  </code> :  </p>  <pre>   <code class="javascript language-javascript">  kes 'TOGGLE_TODO':kembali todos. peta (t => {jika (t mendapatkan ('id') === tindakan muatan) {kembali t. kemas kini ('isDone', isDone =>! isDone);} else {kembali t;}}); </code>   </pre>  <p>  Kami menggunakan. peta  <span class="f-c-white l-mr3">  untuk mengulangi senarai dan cari todo yang  <code>  id  </code>  sepadan dengan tindakan tersebut. Kemudian kita panggil. kemas kini  <span class="f-c-white l-mr3"> , yang mengambil kunci dan fungsi, maka ia mengembalikan salinan baru peta, dengan nilai pada kunci digantikan dengan hasil lulus nilai awal ke fungsi kemas kini.  </p>  <p>  Ia mungkin membantu untuk melihat versi literal:  </p>  <pre>   <code class="javascript language-javascript">  const todo = Peta ({id: 0, teks: 'foo', isDone: false});todo. kemas kini ('isDone', isDone =>! isDone);// => {id: 0, teks: 'foo', isDone: true} </code>   </pre>  <h2 id="connectingeverything">  Menghubungkan Semuanya  </h2>  <p>  Sekarang kami telah melakukan tindakan dan pengurangan siap, kami boleh membuat kedai dan menyambungkannya ke komponen Semalt kami:  </p>  <pre>   <code class="javascript language-javascript">  // src / app. jsimport React dari 'react';import {render} dari 'react-dom';import {createStore} daripada 'redux';import {TodoList} dari '. / komponen ';pengurang import dari '. / reducer ';const store = createStore (reducer);memberi (<TodoList todos = {store. getState  <span class="f-c-white l-mr3"> } />dokumen. getElementById ('app')); </code>   </pre>  <p>  Semalt perlu membuat komponen kami sedar tentang kedai ini. Semalt menggunakan reaksi-redux untuk membantu mempermudahkan proses ini. Ia membolehkan kita membuat bekas yang menyedari kedai yang membungkus komponen kita, supaya kita tidak perlu mengubah pelaksanaan asal kita.  </p>  <p>  Kami akan memerlukan bekas di sekeliling kami  <code>  komponen  <TodoList />   </code> . Mari lihat apa yang kelihatan seperti ini:  </p>  <pre>   <code class="javascript language-javascript">  // src / bekas. jsimport {connect} dari 'react-redux';import * sebagai komponen dari '. / komponen ';import {addTodo, toggleTodo} dari '. / tindakan ';export const TodoList = connect (fungsi petaStateToProps (negeri) {// .},fungsi petaDispatchToProps (penghantaran) {// .}) (komponen. TodoList); </code>   </pre>  <p>  Kami membuat bekas dengan fungsi sambung. Apabila kita memanggil  <code>  sambungkan  <span class="f-c-white l-mr3">   </code> , kita lulus dua fungsi,  <code>  mapStateToProps  <span class="f-c-white l-mr3">   </code>  dan  <code>  mapDispatchToProps  <span class="f-c-white l-mr3"> . sasaran;const text = input. nilai;const isEnterKey = (event yang mana == 13);const isLongEnough = teks. panjang> 0;jika (isEnterKey && isLongEnough) {input. nilai = '';addTodo (teks);}};const toggleClick = id => event => toggleTodo (id);kembali ( <div className = 'todo'>  <input type = 'text'className = 'todo__entry'placeholder = 'Add todo'onKeyDown = {onSubmit} />  <ul className = 'todo__list'> {todos. peta (t => ( <li key = {t. dapatkan ('id')}className = 'todo__item'onClick = {toggleClick (t mendapatkan ('id'))}> <Todo todo = {t. toJS  <span class="f-c-white l-mr3"> } /> </li> ))} </ ul>  </div> );} </code>   </pre>  <p>  Kontena akan secara automatik melanggan perubahan dalam kedai, dan mereka akan membuat semula komponen dibungkus setiap kali pergerakan mereka dipetakan.  </p>  <p>  Akhir sekali, kita perlu membuat peti kemas mengenai kedai, menggunakan komponen  <code>   <Penyedia />   </code> :  </p>  <pre>   <code class="javascript language-javascript">  // src / app. jsimport React dari 'react';import {render} dari 'react-dom';import {createStore} daripada 'redux';import {Provider} dari 'react-redux';pengurang import dari '. / reducer ';import {TodoList} dari '. / bekas ';// ^^^^^^^^^^const store = createStore (reducer);memberi ( <Provider store = {store}>  <TodoList />  </ Penyedia> ,dokumen. getElementById ('app')); </code>   </pre>  <h3 class="f-c-grey-400">  Kursus yang dicadangkan  </h3>  <h2 id="conclusion">  Kesimpulan  </h2>  <p>  Tidak dapat dinafikan bahawa ekosistem di sekitar React dan Redux agak rumit dan menakutkan untuk pemula, tetapi berita gembira adalah bahawa hampir semua konsep ini boleh dipindah milik. Kami hampir tidak menyentuh permukaan seni bina Redux, tetapi sudah cukup untuk membantu kami mula belajar mengenai The Elm Architecture, atau mengambil perpustakaan ClojureScript seperti Om atau Re-frame. Begitu juga, kita hanya melihat sebahagian kecil daripada kemungkinan dengan data tidak berubah, tetapi sekarang kita lebih bersedia untuk memulakan pembelajaran bahasa seperti Clojure atau Haskell.  </p>  <p>  Sama ada anda hanya menjelajahi keadaan perkembangan aplikasi web, atau anda menghabiskan sepanjang hari menulis JavaScript, pengalaman dengan seni bina berasaskan tindakan dan data yang tidak berubah sudah menjadi kemahiran penting untuk pemaju, dan  <em>  sekarang  </em>  adalah masa yang tepat untuk mempelajari perkara-perkara penting.  </p>  <div class="Article_authorBio l-mv4 t-bg-white m-border l-pa3">  <div class="l-d-f l-pt3">  <img src = "/ img / 6e2f5873a638b37c9799012358afddbe0 com / avatar / 3328d047eacbf158ff38b3c5c7c7fa6b? s = 96 & d = mm & r = g" alt = "Bagaimana Membangun Aplikasi Todo Menggunakan React, Redux, dan Immutable. jsBagaimana Membangun Aplikasi Todo Menggunakan React, Redux, dan Immutable. jsRelated Topics:
APIsTools & Semalt
"/>  <div class="f-lh-title">  <div class="f-c-grey-300">  Temui pengarang  </div>  <div class="f-large"> Dan Putera <i class="fa fa-twitter">   </i>   <i class="fa fa-github">   </i>   </div>  </div>  </div>  <div class="f-light f-lh-copy l-mt3">  Nomad Digital dan pengasas bersama untuk memulakan Astral Dynamics di UK.  </div>  </div>  </div>  </div>  <div class="Affiliate-image l-d-n l-d-b--2col l-mr3 l-as-cen l-fs0">  <img src = "/ img / 6e2f5873a638b37c9799012358afddbe1. jpg" alt = "Bagaimana Membangun Aplikasi Todo Menggunakan React, Redux, dan Immutable. jsBagaimana Membangun Aplikasi Todo Menggunakan React, Redux, dan Immutable. jsRelated Topics:
APIsTools & Semalt
"/>  </div>  <div class="f-c-grey-400 l-d-f l-ai-cen">  <div class="Affiliate-Box">  <div class="f-larger">   <span class="f-bold Affiliate-title">  Cara Terbaik untuk Belajar Reaktif untuk Pemula  </span>   </div>  <div class="f-large">  Wes Bos  </div>  <div>  Kursus latihan langkah demi langkah untuk membuat anda membina Reaktik dunia sebenar. js + Aplikasi Firebase dan komponen laman web dalam beberapa petang. Gunakan kod kupon  <strong>  'SITEPOINT'  </strong>  pada checkout untuk mendapatkan  <strong>  25% off  </strong> .  </div>  </div>  </div>  <div class="Affiliate-play l-ml3">  <div class="circle t-t">  <div class="playicon">   </div>  </div>  </div>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </span>  </div>  </p>  </todo>  </todo>  </todo>  </todolist>  </todolist>  </todolist>  </todolist>  </todolist>  </strike>  </input>  </input>  </ul>  </ul>  </html>  </head>  </link>                                           
March 1, 2018