๊ฐ๋ฅํฉ๋๊น ์๋๋ฉด ๋ด๊ฐ ์๋ชปํ๊ณ ์์ต๋๊น?
let initialState = immutable.fromJS({some_store: "some initial data"});
const redux = createRedux(stores, initialState);
...
export function some_store(state, action) {
// state is undefined here
}
๋น์ ์ด ์ํ๋ ๊ฑด ์ด๋ฐ ๊ฒ ๊ฐ์์
// stores/some-store.js
import Immutable from 'immutable'
const { Map, List, fromJS } = Immutable
const initialState = Map({
foo: 'bar',
fooList: List()
})
export function someStore (state = initialState, action) {
if (action.type === 'FOO') {
return state.set('foo', fromJS(action.foo))
}
if (action.type === 'FOO_LIST') {
return state.set('fooList', fromJS(action.fooList))
}
return state
}
// stores/index.js
export { default as someStore } from './some-store'
// application.js
import * as stores from './stores'
const redux = createRedux(stores)
@emmenko๊ฐ ๋ณด์ฌ์ค ๊ฒ๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ด ์์ฒด ์ด๊ธฐ ์ํ๋ฅผ ์ ์ํ๋๋กํด์ผํฉ๋๋ค.
initialState
์ธ์๋ ์๋ฒ ๋๋ localStorage์์ ์ํ๋ฅผ ๋ค์ ์ํํ๋ ๋ฐ๋ง ์ฌ์ฉ๋ฉ๋๋ค. ( @acdlite , ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋ฌธ์์์ ์ค๋ช
ํ๊ณ ์ถ์ ๊ฒ์
๋๋ค.)
์ฆ, ์๋ํ ๊ฒ์ด ์๋ํด์ผํฉ๋๋ค. ๋๊ตฐ๊ฐ ์กฐ์ฌ ํ ์ ์์ต๋๊น?
์๋์, ์๋ํ ๋ด์ฉ์ด ์๋ํ์ง ์์ต๋๋ค. ๋ชจ๋ ๋งค์ฅ์ ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ํ ๊ณณ์์ ๋ง๋ค๊ณ ์ถ์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ด๊ฐํ์ง ๋ง์์ผ ํ ์ผ์ด๋ผ๊ณ ์๊ฐํ๋ค.
๋ชจ๋ ๋งค์ฅ์ ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ํ ๊ณณ์์ ๋ง๋ค๊ณ ์ถ์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ด๊ฐํ์ง ๋ง์์ผ ํ ์ผ์ด๋ผ๊ณ ์๊ฐํ๋ค.
๊ทธ๊ฒ์ ๋น์ ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋๋๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค.
๊ทธ๋๋ ์๋ํ์ง ์๋ ๊ฒ์ด ์์ผ๋ฉด ์ด์ด ๋๊ฒ ์ต๋๋ค. ๋ค์ ์ฃผ์ ๋ค์ ๋ฐฉ๋ฌธํ์ฌ ์๋ํ์ง ์๋ ์ด์ ๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
๋ฌธ์ ๋ ํจ๊ป composeStores
์ผ๋ฐ JS ๊ฐ์ฒด๊ฐ ๋ฃจํธ ์ํ๋ฅผ ๊ฐ์ ํ์ฌ,์ ํจ๊ป ์์ฑ์ ์ก์ธ์คํ๊ณ ์์ state[key]
์คํจํ๋ Immutable.Map
. ์ผ๋ฐ JS ์์ฑ์ ํตํด ํ๋์ ์ก์ธ์ค ํ ์ ์๊ธฐ ๋๋ฌธ์ Immutable.Record
์ ํจ๊ป ์๋ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ์ง๋ง ํ๋ฒํ ๋ฌผ์ฒด๋ฅผ ๊ฐ์ ํ๋ ๋ค๋ฅธ ๊ณณ์ด์์ ์ ์์ต๋๋ค.
์ค. ๋๋จํ ์บ์น์ ๋๋ค! ์ค๋ช ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ ์๋ฒฝํ๊ฒ ์ดํด๋ฉ๋๋ค.
์ปค๋ฅํฐ ์ฌ์ฉ๋ isPlainObject(Immutable.Record) === false
๊ฐ์ ์ด์ ๋ก ์คํจํฉ๋๋ค.
@pierregm ์ด๊ฒ์ ์ค์ ๋ก ๋ง์ต๋๋ค. ๊ตฌ์ฑ ์์ ์ํ์ ๋ ์ฝ๋ ์์ฑ์ ๋ถ์ฐํ๋ฉด ์ด์จ๋ ์๋ํ์ง ์์ต๋๋ค. select={state => state.get('something').toJS()}
์์ฑํ๋ ๊ฒ์ ๊ทํ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค.
์ด๋ ๊ฒ ์๋ํ๋๋ก ๋ง๋ค ์์์์ต๋๋ค.
// store
const initialState = Immutable.fromJS({}).toOrderedMap();
export default function streamStore(state = initialState, action) {
switch (action.type) {
case actionTypes.FETCH_STREAM_DONE:
var streamMap = {};
for (var i in action.stream_data) {
var item = action.stream_data[i];
streamMap[item.id] = item;
}
return state.merge(Immutable.fromJS(streamMap).toOrderedMap());
default:
return state
}
};
// select
function select(state) {
return {stream: state.stream.toList()}
}
์๋ฒฝํ๊ฒ ์๋ํ์ง๋ง ์คํธ๋ฆผ์ ๋ชจ๋ ํญ๋ชฉ์ ๋ค์ ๋ ๋๋งํฉ๋๋ค (๋ชฉ๋ก๋ณด๊ธฐ). ๋งค์ฅ ์์ค์์ ์ด์ ์ํ์ ์ ์ํ๋ฅผ ๋น๊ตํ๊ณ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋ง ํ ํ์์ฑ์ ๋ฌดํจํํ๋ ๊ฒ์ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. NuclearJS๋ ๋ถ๋ณ ๊ตฌ์กฐ๋ก์ด๋ฅผ ์ํํฉ๋๋ค. redux์์ ์ด์ ๊ฐ์ ๊ฒ์ ๊ตฌํํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
์ค ์์ด์ค
Reselect : https://github.com/faassen/reselect๋ฅผ ํ์ธ
@gaearon ์ฟจ! ReactEurope BTW์์ ๋ฉ์ง ์ด์ผ๊ธฐ! ๊ฐ์ฌ.
์ด๊ฒ์ redux 1.0.0, https://github.com/gajus/redux-immutable ๊ณผ ํจ๊ป Immutable.js๋ฅผ ์ฌ์ฉํ๋ ค๋ ์๋์ ๋๋ค.
์ข์ @gajus! ์ง๊ธ redux-immutable
ํ
์คํธํ๊ณ https://github.com/gajus/canonical-reducer-composition ํจํด์ ์ ๋ง ์ข์ํฉ๋๋ค.
@chiplay ๊ฐ์ฌํฉ๋๋ค. ๊ฒฐํจ์ด ์๊ฑฐ๋ ๊ฐ์ ํ ์์ด๋์ด๊ฐ ์์ผ๋ฉด ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
redux์ ํจ๊ป ๋ถ๋ณ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ด ์์ต๋๊น? redux๊ฐ ๋ถ๋ณ์ ํ๋์ ๊ธฐ๋ฐ์ผ๋กํ๋ ๊ฒฝ์ฐ (์ : ์ ์ฅ์๊ฐ ์ํ์ ์๋ก์ด ์ฌ๋ณธ์ ๋ฐํ)? ์ฑ๋ฅ (์ด๋ค ๋ฒค์น ๋งํฌ?)? ๋๋ ๋ค๋ฅธ ๊ฒ? ๊ณ ๋ง์
๋ฟก๋ฟก
Redux์ ํจ๊ป Immutable ์ฌ์ฉ์ ์ฅ์ :
Redux์ ํจ๊ป Immutable ์ฌ์ฉ์ ๋จ์ :
ํธ๋ ์ด๋ ์คํ๋ ๋น์ ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค!
@gaearon
๋น ๋ฅด๊ณ ๋์์ด๋๋ ๋ต๋ณ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
Redux ํ์ค์ ์ค์ํ๋ ImmutableJs ๋ฐ Redux๋ฅผ ์ํ๋ค๋ฉด https://github.com/indexiatech/redux-immutablejs๋ฅผ ์ดํด๋ณผ ์ ์์ต๋๋ค.
@gaearon ์น ์ฌ์ดํธ์ ๋งํฌ๋ฅผ ๋ฃ์ ์ ์์ต๋๊น?
Asaf ๊ฐ์ฌํฉ๋๋ค. ์ฌ๋๋ค์ด ์ ์ฉํ๋ค๊ณ ์๊ฐํ ๊ฒ์ ๋๋ค.
2015 ๋ 9 ์ 4 ์ผ 18:36์ Asaf Shakarchi [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
Redux ํ์ค์ ์ค์ํ๋ ImmutableJs ๋ฐ Redux๋ฅผ ์ํ๋ค๋ฉด https://github.com/indexiatech/redux-immutablejs๋ฅผ ์ดํด๋ณผ ์ ์์ต๋๋ค.
@gaearon ์น ์ฌ์ดํธ์ ๋งํฌ๋ฅผ ๋ฃ์ ์ ์์ต๋๊น?
โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
@asaf
์ข์ ์ผ์
๋๋ค. Ecosystem.md
PR์ ํด์ฃผ์๊ฒ ์ต๋๊น?
ํ๋ก์ ํธ์ ํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ฉด ๊ธฐ๊บผ์ด ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
@gaearon ๋จ์ ํ ์คํธ ์๋ฃ, PR : https://github.com/rackt/redux/pull/707
๊ฐ์ฌ!
์๋
ํ์ธ์,
@gaearon์ ๋ํ ์ฝ๊ฐ์ ์ง๋ฌธ์
๋๋ค. ์ง๊ธ๊น์ง ๊ธฐ์กด React / Redux ์ฑ์์ ImmutableJS๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ํ ํ ๋น ๋ฅธ ํ
์คํธ์์ ์ฝ๊ฐ ๋๋ฆฌ๊ฒ ๋๊ปด์ง๋๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ ์ฌ๋ก : API ํธ์ถ์์ ๋ฐ์ดํฐ ๋ชจ์์ ๊ฐ์ ธ ์์ ๊ฐ์๊ธฐ์ ์ ์ฅ ...
๋ด ๊ฐ์๊ธฐ์์
ImmutableJS์์ด โโ:
const initialStore = {
isLoading : false,
error : null,
data : []
}
// in the switch case
return {
...state,
isLoading: false,
error: null,
data: action.result
}
ImmutableJS ์ฌ์ฉ
const initialStore = Map({
isLoading : false,
error : null,
data : List()
})
// in the handler function
return state.merge({
isLoading: false,
error: null,
data: List(result.result)
})
ImmutableJS "์น๋ฃ"๊ฐ ์ฌ๊ธฐ์์ ๋ ๋ง์ ๋น์ฉ์ด ๋ค์ง ์๋์ง ๊ถ๊ธํฉ๋๋ค.
Immutability์์ ์ดํด ํ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ๋ ๋๋ง์ด ๋น ๋ฅด๊ฒ ์งํ๋ ๋ ์ด์ ์ด ๋ ๋ง์ต๋๋ค.
์๊ฒฌ์ ๋ณด๋ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ด์ ์ ๋ํ ์ด๋ ์ด ๋ฐ ๊ฐ์ฒด์์ ์๋ํ๋ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋น์ฉ์ด ์ ๊ฒ ๋ค๊ณ ๋ ๋น ๋ฅด๊ฒ ์๋ํ๋ค๋ ๊ฒ์ ๋๋ค. ์์ ์์ฉ ํ๋ก๊ทธ๋จ์์๋ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
์์์ด ๊ณ ๋ง์.
๊ทธ๋์ ๋๋ ์ด์จ๋ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ง๊ณ ์์ต๋๊น?
๋ค, ์ ์ด์ธ๋ฆฝ๋๋ค.
์ง๊ธ๊น์ง ๊ทธ๋งํ ๊ฐ์น๊ฐ์์์ต๋๋ค .. ๐ฏ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ฟก๋ฟก
Redux์ ํจ๊ป Immutable ์ฌ์ฉ์ ์ฅ์ :
Redux์ ํจ๊ป Immutable ์ฌ์ฉ์ ๋จ์ :
ํธ๋ ์ด๋ ์คํ๋ ๋น์ ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค!