Home

Awesome

Ducks: Redux Reducer Paketleri

<img src="duck.jpg" align="right"/>

Her redux uygulamasi gelistirdigimde, uygulamami parca parca yaziyorim. Bu surecte, kendimi surekli {actionTypes, actions, reducer} uclemesini yazarken buluyorum. Bunlari ayri dosyalarda hatta ayri klasorlerde tutuyordum. Ancak 95% oranda sadece tek reducer/action ikilisi bu iliskileri kullanmaya ihtiyac duyuyor.

Bence, bu parcalari tek dosyada toplu sekilde tutmak cok daha mantikli. Boylece izole sekilde, paketlenmis bir sekilde bir arada durabilirler.

Oneri

Ornek

Bakiniz: Common JS Ornegi.

// widgets.js

// Actions
const LOAD   = 'my-app/widgets/LOAD';
const CREATE = 'my-app/widgets/CREATE';
const UPDATE = 'my-app/widgets/UPDATE';
const REMOVE = 'my-app/widgets/REMOVE';

// Reducer
export default function reducer(state = {}, action = {}) {
  switch (action.type) {
    // reducer ile ilgili seyler buraya gelecek
    default: return state;
  }
}

// Action Creators
export function loadWidgets() {
  return { type: LOAD };
}

export function createWidget(widget) {
  return { type: CREATE, widget };
}

export function updateWidget(widget) {
  return { type: UPDATE, widget };
}

export function removeWidget(widget) {
  return { type: REMOVE, widget };
}

// side effects, only as applicable
// e.g. thunks, epics, etc
export function getWidget () {
  return dispatch => get('/widget').then(widget => dispatch(updateWidget(widget)))
}

Kurallar

Bir modul...

  1. KESINLIKLE reducer() adinda bir fonksiyonu export default ile export etmeli
  2. KESINLIKLE aksiyon ureten tanimlari fonksiyon olarak export etmeli
  3. KESINLIKLE action tiplerini npm-module-or-app/reducer/ACTION_TYPE isimlendirme yapisiyla tanimlamali
  4. BELKI aksiyon turlerini UPPER_SNAKE_CASE seklindeki isimlendirme yapisiyka expor tedebilir, eger disaridan bir reducer dinlemek isterse, tekrardan kullanilabilir sekilde olurlar.

Ayni kurallar {actionType, action, reducer} uclulueri icin de gecerli.

Isimlendirme

Java, jars ve beans paketlerine sahip. Ruby'nin gem'leri var. Ben bu reducer paketlerine "ducks" (ordekler) adini vermek istiyorum. "redux" ise sesdes oluyorlar boylece.

Kullanimi

Hala sunu yapabilirsiniz:

import { combineReducers } from 'redux';
import * as reducers from './ducks/index';

const rootReducer = combineReducers(reducers);
export default rootReducer;

Bunu da:

import * as widgetActions from './ducks/widgets';

...boylece sadece action ureticilerini import etmis olursunuz, bindActionCreators() methodunda kullanima hazir olurlar.

Aslinda, ayrica default'u import edecek, bu da reducer fonksiyonunuz olacak.

Bazen action creator'lar disindaki seyleri export etmek isteyeceksiniz. Kodu bozmayacaktir. Sadece action creator'lari export etmekniz gerekir diye bir kural yok sonucta.

import {loadWidgets, createWidget, updateWidget, removeWidget} from './ducks/widgets';
// ...
bindActionCreators({loadWidgets, createWidget, updateWidget, removeWidget}, dispatch);

Ornek

React Redux Universal Hot Example projesi "ducks" kullaniyor. Bakiniz: /src/redux/modules.

Todomvc da ducks kullaniyor.

Implementasyon

Migrasyon aslinda oldukca basit. Bence buyuk bas agrisindan kurtariyor gelistiricileri.

Herhangi bir kutuphane kullanmadan bu yaklasimi uygulamak mumkun. Ancak asagidaki implementasyonlar ve kutuphaneler araciligiyla isinizi kolaylastirabilirsiniz:

Herhangi bir geri bildirimi veya problemi ana repo'ya bildirebilirsiniz veya @erikras'a tweet atin. Cok tesekkur ederim.

Mutlu Kodlamalar!

-- Erik Rasmussen

Ceviriler

한국어 中文 Turkce


C'mon! Let's migrate all our reducers!

Foto kredisi Airwolfhound.


Beerpay Beerpay