Bu hafta reducer yaklaşımını incelediniz. Bu projede bugün öğrendiklerimizi pekiştireceğiz.
- Bu projede, sayıları herhangi bir sırayla toplayabilen, çarpabilen, çıkarabilen ve çıkartabilen, ayrıca hafızaya kaydetme ve callback özellikleri ekleyebilen basit bir hesap makinesi uygulaması oluşturacaksınız.
- Koda eksik parçaları ekleyerek başlayacak ve UI, reducer ve event dosyalarında sıfırdan özellikler oluşturarak projeyi tamamlayacaksınız.
- Bu hesap makinesi bildiklerimizden biraz farklı. Her yeni hesaplamasında önceki hesabın sonucunu ve yeni bir sayıyı parametre olarak alıyor. İşlem sonunda hesap makineniz aşağıdaki gibi çalışmalıdır:
Görevlerinizi tek tek tamamladığınızdan ve ilerlemeden önce her bir görevi test ettiğinizden emin olun..
- Forklayın
- Klonlayın
- Ana dizine gidin
-
npm install -
npm start
Kullanıcı arayüzümüzü reducera ve ilk state'e bağlayarak sürecimize başlayalım..
- Uygulama klasöründe gezinin, özellikle "App.js", "/reducer/index.js" ve "/actions/index.js" dosyaları.
-
TotalDisplaybileşeni bir değer alır ve bu değeri stillenmiş bir textarea'da gösterir. BU BİLEŞENİ DEĞİŞTİRMENİZE GEREK YOK. -
CalcButtonbileşeni bironClickmetodu ve bir değer alır, bu değeri görüntüler veonClickmetodunu ui butonuna ekler. BU BİLEŞENİ DEĞİŞTİRMENİZE GEREK YOK. - App.js içine, useReducer hookunu import edin, uygulamamızın reducer'ı ve initialState nesnesi buradan gelecek.
- Uygulama state'ine ve dispatch fonksiyonuna erişmek için useReducer hookunu kullanın.
Artık App bileşenimizde state'e erişimimiz var (Bunu console.log ya da React dev tools'dan gözlemleyebilirsiniz). State'i örnek ekranımızdaki gibi render edelim.
- Operation elemanı içindeki "X" i
state.operationı referans alarak değiştirin. - Memory elemanı içindeki "0" ı
state.memoryyi referans alarak değiştirin. - TotalDisplay bileşenine değer atarken "0" ı
state.totalı referans alarak değiştirin. - UI'de initialState'teki değerlerle total, operation ve memory'yi kontrol edin (100, * ve sırasıyla 100)
- Reducer'daki initialState değerini değiştirerek elde ettiğiniz state'i test edin:
export const initialState = {
total: 0,
operation: "+",
memory: 0
}
- Ekranınızın state'teki değişikliği doğru bir şekilde yansıttığını kontrol edin.
Artık State'imizi görebildiğimize göre, kullanıcının bunu değiştirebilmesine izin verelim. Hazır bir action ile başlayalım... Total'ı bir artıralım.
-
ADD_ONEaction'ına (./reducer/index.js içindeki) veaddOneaction oluşturucuya (./actions/index.js içindeki) göz atın. Bu action total'a 1 ekler. -
addOneaction oluşturucuyu App.js içine import edin. -
App.jsiçinde bir event handler oluşturarak, 1 butonununonClickmetoduna ekleyin. - Event handler içinde,
addOneaction oluşturucuyu dispatch edin. - Eventinizin doğru çalışıp çalışmadığını tarayıcınızda 1 butonuna basarak test edin. Total'iniz 1 artmalı.
- Bir butona tıklandığında güncellenen totali nasıl gösterebileceğimizi düşünün. Hangi adımlar vardı?
soruyu-anlamak.mddosyası içine, kendi cümlelerinizle tüm adımları yazın.
Her sayı için ayrı action eklemek sıkıcı olabilir. TÜM sayısal girdiler için çalışabilecek bir action ekleyelim
-
APPLY_NUMBERaction'a (./reducer/index.js içindeki) veapplyNumberaction oluşturucuya (./actions/index.js içindeki) göz atalım. Bu action, action oluşturucuya iletilen bir sayıyı ekler, çarpar veya çıkarır. -
applyNumberaction oluşturucusunuApp.js.içine import edin - Daha önce 1 butonuna eklediğimiz event handlerı silin ya da comment içerisine alın.
- Argüman olarak bir sayı alan ve
applyNumberı dispatch eden bir event handler oluşturun. - Bu eventhandlerı, argümanına 1 vererek 1 butonunun onClick metod'una bağlayın. (Şunu unutmayın onClick metoduna bir fonksiyon aktarıyoruz, var olan bir fonksiyonu direk çalıştırmıyoruz(too many re-renders hatası alırız)
- 1 butonuna basıldığında totali 1 artırıp ekrana yazdırıp yazdırmadığını test edin.
- Yeni event handlerınızı gerekli değerleri vererek tek tek diğer butonlara da bağlayın.
- Tüm butonlara tek tek tıklandığında totale doğru değerleri ekleyip eklemediğini test edin.
Şu anda uygulamamız sadece toplama işlemi yapıyor. Şimdi bunu değiştireceğiz. Kendi action oluşturucunuzu yaratmanın vakti geldi!
-
CHANGE_OPERATIONaction'a (./reducer/index.jsiçinde) göz atın. Bu reducer operatör değeri alır (+,- ve *) ve bunu state'e aktarır. - Argümanı olarak bir operatör alan bir action oluşturucu oluşturun (
./actions/index.jsiçinde) ve type'ıCHANGE_OPERATION.olan action nesnesi oluştursun. - Yeni action oluşturucuyu
App.jsye import edin. -
+,-ve*butonlarına tıklandığında, ilgili operatörü action oluşturucunuza ekleyen bir event handler oluşturun. Her buton için doğru operatörü gönderdiğinizden emin olun. - Operatör butonlarının doğru şekilde çalıştığından ve sayıları doğru işleme(toplama, çıkarma v.b.) tabi tuttuğundan emin olmak için test yapın.
Şimdi ekran görüntüleyiciyi sıfırlama özelliği ekleyeceğiz. Bunun için reducer ve action oluşturucunun tamamını kendiniz yapacaksınız.
-
./reducers/index,içinde,CLEAR_DISPLAYcase'i oluşturun. Bu case total değer statini 0 yapacak. -
./actions/index,içinde, action oluşturucuyu ve adıCLEAR_DISPLAYolan bir action constant'ını string değeri ile ekleyin. Reducer dosyanızda da bu sabit değeri import ettiğinizden emin olun. -
App.js,içinde clearDisplay action oluşturucuyu import edin. - clearDisplay action oluşturucunuzu dispatch eden bir event handler yazın ve "CE" butonuna bağlayın.
- clearDisplay butonunuzun düzgün çalışıp çalışmadığını test edin.
Tebrikler! Tüm işlemler için actionler ekleme görevini başarıyla tamamladınız! Şimdi aynı işlemleri takip ederek yeni özellikler ekleyeceksiniz. Tüm caseler için bir sonraki case e geçmeden önce testlerini yapmayı unutmayın.
-
M+a tıklandığında, şu anki memory değerine şu anki total değerini kaydetsin. UI'de test edin. -
MRa tıklandığında, şu an memorydeki değer şu anki total değerine aktarsın (APPLY_NUMBER case ine göz atın). UI'de test edin. -
MCe tıklandığında, şu anki memory değeri sıfırlasın. UI'de test edin.
- Hesap makinesinin rakamlar ekleme yerine tek tek rakamları toplamaya odaklanan bir sürümü vardır. Total stateine bağımsız bir rakam eklemeyi nasıl düşünürsünüz?
- Şurada bir örnek var reducer olmayan bir javascript hesap makinası uygulaması. Yeni bir branch oluşturup hesap makinasının yeni versiyonunu buraya yükleyin.
