μ μ μ μΌλ‘ μ±μ μ€μνμ§ μκ³ λ³΅μ‘ν λ°©μμΌλ‘ λ³κ²½λμ§ μλ μμ μνμ Reactλ₯Ό μ¬μ©ν©λλ€. μλ₯Ό λ€μ΄, μΌλΆ UI μμμ ν κΈ, μμ μ λ ₯ μν. μ μ μ μΌλ‘ μ€μνκ±°λ 볡μ‘ν λ°©μμΌλ‘ λ³ν λ μνμ Reduxλ₯Ό μ¬μ©ν©λλ€. μλ₯Ό λ€μ΄ μΊμ λ μ¬μ©μ λλ κ²μλ¬Ό μ΄μμ΄ μμ΅λλ€.
λλ‘λ Redux μνμμ React μν (Reduxμ 무μΈκ°λ₯Ό μ μ₯νλ κ²μ΄ μ΄μ ν΄μ§)λ‘ μ΄λνκ±°λ λ€λ₯Έ λ°©λ² (λ λ§μ κ΅¬μ± μμκ° λ‘컬μ΄μλ μνμ μ‘μΈμ€ν΄μΌνλ κ²½μ°)μ μν κ²μ λλ€.
κ²½νμ λ²μΉμ λ μ΄μν μΌμνλ κ²μ λλ€.
λ€νΈμν¬ μμ²μ ν΅ν΄ κ°μ Έμ¨ λ°μ΄ν°μ κ²½μ° μλ² μΈ‘ λ λλ§μ μ§μνκΈ° μν΄ νμ μ μ₯μλ₯Ό μ¬μ©νμμμ€ (μ΅μ’ λͺ©νλΌκ³ μκ°νλ κ²½μ°). κ·Έλ μ§ μμΌλ©΄ μ¬μνν μ μμ΅λλ€.
λ κ° μ΄μμ 컨ν μ΄λμμ ν΄λΉ μνλ₯Ό μμ νλ €λ©΄ 맀μ₯μλ μμ΄μΌν©λκΉ?
λλ μμμ μꡬμ ꡬλ³μ λν΄ @gaeron κ³Ό λμν©λλ€. κ·Έλ¬λ μ λ μ€μ λ‘ μ΄κ²μ λν΄ μΈ κ°μ§ λ²μ£Όλ‘ μκ°ν©λλ€. νλλ κ·Έκ° μ΄μΌκΈ°νλ UI μν μ΄λ©° μ λ λν μΌμμ μ΄λΌκ³ μκ°ν©λλ€. λ νλλ μ ν리μΌμ΄μ μ μ€μ ν΅μ¬ μΈ λΌμ°ν μν μ λλ€. λλ μ¬λλ€μκ² μΉμνκΈ° λλ¬Έμ "λΌμ°ν "μ΄λΌλ μ©μ΄λ₯Ό μ¬μ©νμ§λ§, λ°μ€ν¬ν, μΉ λ° λͺ¨λ°μΌμ λ μ μ μ©λλ κ²μΌλ‘ μκ°νκΈ° λλ¬Έμ μ΄κ²μ "보기 μ ν"μνλ‘ μΆμνν©λλ€.
μ΄μ μ΄κ²μ μ¬λλ€μ΄ 보λ κ²μ κ²°μ νκΈ° λλ¬Έμ UI μνλΌκ³ μ£Όμ₯ ν μ μμ΅λλ€ (μλ₯Ό λ€μ΄ νμ μνμ λ§€μ° μ μ¬ ν¨). κ·Έλ¬λ λλ λ κ°μ§ μ°¨μ΄μ μ λ³Έλ€. 첫 λ²μ§Έλ μνκ° μ§λ ¬νλμ΄ (μ¦, URLλ‘) λ€λ₯Έ μ¬λμκ² μ μ‘λλ€λ κ²μ λλ€. λ°λΌμ μ¬λλ€μ΄ νΉμ UI μνμ λ°λ‘ 'λ₯ λ§ν¬'ν μ μλλ‘νλ €λ©΄ κ²½λ‘ μνλ‘ μ΄λν΄μΌν©λλ€ . λ λ²μ§Έλ λλΆλΆμ κ²½μ° μ΄κΈ° κ²½λ‘ μν λλ κ²½λ‘ λ³κ²½μΌλ‘ μΈν΄ μ ν리μΌμ΄μ μνκ° λ³κ²½λ©λλ€ (μ : λ³Ό λ°μ΄ν°λ‘λ). λ¬Όλ‘ UIμ μμ μ λμΌν μμ μ μνν©λλ€. κ·Έλ¬λ λ΄κ° λ§λλ μ°¨μ΄μ μ κ²½λ‘ μν λ³κ²½μ λν "μ ν리μΌμ΄μ λ Όλ¦¬" λ₯Ό ν μ€νΈνκΈ° μν΄λ³΄κΈ° λ λ λλ§μμ΄ κ²½λ‘ μνλ₯Ό κ°μ§ μ μλ€λ κ²μ λλ€. λ·°μ λ λλ§μ΄ κ΄λ ¨ λ νμκ° μκΈ° λλ¬Έμ λΆλΆμ μΌλ‘ μ ν리μΌμ΄μ μν μΈ IMHOκ°λ©λλ€.
μ΄κ²μ΄ μν κ΄λ¦¬λ₯Όμν Redux λ Reactμ μ§λ¬Έκ³Ό μ΄λ€ κ΄λ ¨μ΄ μμ΅λκΉ? μ ν리μΌμ΄μ μνλ Reduxμ λλ©μΈμ΄κ³ UI μνλ Reactμ λλ©μΈμ λλ€. κ·Έλ¬λ λΌμ°ν μνλ (λ΄ μκ°μ) UI μνλ‘ λ³Ό μ μμ§λ§ Reduxμμ κ΄λ¦¬ν΄μΌν©λλ€ (λ΄κ° μκ°νλ μ΄μ μ λν μμΈν λ΄μ©μ ν¬ν¨ λ λ§ν¬ μ°Έμ‘°).
λΆλͺ ν λ§νλ©΄ , μμ§μ΄λ κ²μ λν
μ ν리μΌμ΄μ μνλ Reduxμ λλ©μΈμ΄κ³ UI μνλ Reactμ λλ©μΈμ λλ€.
λλ μ΄κ²μ μ£Όμ₯νμ§ μμ΅λλ€. Reactμμ μΌλΆ μ± μνλ₯Ό μ μ§νκ³ Reduxμμ μΌλΆ UI μνλ₯Ό μ μ§νλ κ²μ΄ μ’μ΅λλ€. λλ κ·Έλ€μ΄ λλ©μΈμΌλ‘ λΆλ¦¬λμ΄μΌνλ€κ³ μκ°νμ§ μμ΅λλ€.
Reduxλ‘ μ±μ λ§λλ κ²½μ° μ κ° μκ°νλ λ°©μμ λ¨μΌ μν νΈλ¦¬λ₯Ό μμ©ν©λλ€. κ±°κΈ°μ UI μνλ λ£μΌμμμ€. κ·Έλ¬λ μ§λ£¨νκ³ λ΅λ΅ν΄μ§λ©΄ κ΅¬μ± μμμ μνλ₯Ό λ£λ κ²μ λλ €μνμ§ λ§μμμ€. λ΄ μμ μ μ΄μνμ§ μλ ν λ¨μΌ μν νΈλ¦¬λ₯Ό μ¬μ©νκ³ λ³΅μ‘νκ² λ§λ€μ§ μκ³ λ¨μν ν λλ§ μ¬μ©νλ€λ κ²μ λλ€. μ΄κ²μ΄ μ μΌν μ§μΉ¨μ λλ€.
λ¨Όμ @gaearon μ μ μ λ¨μ΄λ₯Ό λ£μ μκ°μ μμμ΅λλ€. μ£μ‘ν©λλ€.
λμ§Έ, @gaearonμ μ μ μΌλ‘ λμν©λλ€. μ λ λν λ¨μΌ μν νΈλ¦¬ μ κ·Ό λ°©μμ κ΅³κ² λ―Ώμ΅λλ€. UI μνμ λν΄ μ΄μΌκΈ° ν λ, μμ© νλ‘κ·Έλ¨ μνμλ κ΄λ ¨μ΄ μμ μμλ μ¬μν κ² (μ : μ νν νμ¬ ν)μ΄ μμμ΅λλ€ (μ νν
μ μ μ₯μ λͺ νννκ² μ΅λλ€. λλ κ²½λ‘ μνλ₯Ό ν¬ν¨νμ¬ κ±°μ λͺ¨λ κ²μ΄ Reduxμ μμ΄μΌ νλ€λ λ° λμν©λλ€ (λ΄κ° Reduxμ TypeScriptλ₯Ό μ¬μ©νμ¬ TodoMVC ꡬν μμνλ κ²μ²λΌ. λλ ꡬ체μ μΌλ‘ κ²½λ‘ μνλ₯Ό μΈκΈνκ³ κ·Έκ²μ ꡬλ³νμ΅λλ€. ꡬν) νμ€ν Reduxμ μνκ³ (κ·Έλ¦¬κ³ λ λλ§μ μ ν μ°κ²°λμ΄μλ μ λ¨) νμ€ν "UI μν"κ° μλλλ€.
React κ΅¬μ± μμμ κ²½μ° μνλ₯Ό κ±°μ μ¬μ©νμ§ μμ΅λλ€. λλ 무μμ λ λλ§ν μ§μ λν μ 보λ₯Ό μ»κ³ λ΄ μ»΄ν¬λνΈ μΈλΆμ λ³κ²½μ νΈλ¦¬κ±°νκΈ° μν΄ νΈμΆ ν μμλ ν΄λ‘μ λ₯Ό μ»κΈ° μν΄ propsλ₯Ό μ¬μ©νλ κ²μ μ νΈν©λλ€. μΆμ νΈνκ²νκΈ° μν΄ κ΅¬μ± μμμ μνλ₯Ό λμ νλ κ²½μ°κ° λλ¬Όμ§λ§ νΌνλ €κ³ ν©λλ€. λλ κ·Έκ²μ΄ μΌμ λͺ νννκΈ°λ₯Ό λ°λλλ€.
μ λμ΄ μ§λ¬Έμ΄ μ λ§ μ£Όκ΄μ μ΄κ³ 볡μ‘νλ€κ³ μκ°ν©λλ€. κ·Έλμ μ€λ μ ν¬ νκ³Ό ν¨κ» μ΄λ €μ΄ κ²°μ μ λ΄ λ Έμ΅λλ€. μ κ²½ μ°μ§ λ§μΈμ.
this.setState
μ¬μ©νμ§ λ§μμμ€.μ΄μ μ°λ¦¬λ μμ UI μνλ₯Ό κ΄λ¦¬νλ μΌμ λ μ§λ£¨νκ² λ§λ€κΈ° μν΄ λͺ κ°μ§ λμ°λ―Έλ₯Ό ꡬννκ³ μμ΅λλ€.
@gaearon @ lionng429 @xogeny μ΄ μ κ·Ό λ°©μμ λν΄ μκ°ν μμλ λ¨μ μ΄ μμ΅λκΉ?
@inetfuture TypeScriptλ₯Ό μ¬μ©νκ³ μκ³ μ ν리μΌμ΄μ
μνμ λν μ νμ μμ ν μ μνκΈ° λλ¬Έμ μ ν리μΌμ΄μ
(redux) μνμ λν΄ μ½κ° λΉμ°Έν κ²½ν₯μ΄ μμ΅λλ€. μ¦, λ λλ§μμ λͺ¨λ μν μ‘°μμ λΆλ¦¬νκΈ° μν΄ κ΅¬μ± μμ λΌμ΄λΈλ¬λ¦¬λ₯Ό κ°λ°ν λ λ°μνμ΅λλ€ (μμΈν λ΄μ©μ μ΄μ μ£Όμμ λ§ν¬ μ°Έμ‘°). μ΄κ²μ μ¬μνμ§ μμ μΌλ°μ μΈ κ΅¬μ± μμμ λν΄μλ μμ ν μνλ₯Ό μΈλΆννλ€λ κ²μ μλ―Έν©λλ€. λλ μΌλ°μ μΌλ‘ λͺ¨λ κ²μ props (μν μ‘°μμμν μνμ ν΄λ‘μ λͺ¨λ)λ₯Ό ν΅ν΄ μ λ¬ν©λλ€. μ΄λ κ²νλ©΄ μ ν리μΌμ΄μ
μνμ μ½κ² μ°κ²°ν μ μμ΅λλ€. μ΄κ²μ μΌλΆλ μμ¬ ν μ¬μ§μμ΄ TypeScriptλ₯Ό μ¬μ©νλ μΈκ³΅λ¬Όμ΄λ©° combineReducers
λ° connect
λ₯Ό μ¬μ©νμ¬ λ¬Όκ±΄μ μ°κ²° (μ΅μν μ ν μ μ½ μ‘°κ±΄μ μ μ§)νλ λ° μ¬μ©ν μ μμ΅λλ€. λ°λΌμ μ΄κ²μ μλ§λ λνμ μΈ κ΄μ μ΄ μλλλ€. κ·Έλ¬λ λλ λΉμ μ΄ "λͺ¨λ κ²μ Redux μ€ν μ΄μ λ£μ΄ λΌ"λΌκ³ λ§νλ μ΄μ λ₯Ό λ§ν κ²μ
λλ€. λλ λΉμ μ΄ μνμ λΆμ μ±ν¬λκ° λ κ²μ΄λΌκ³ κ±±μ ν κ²μ
λλ€. TypeScriptλ₯Ό μ¬μ©νλ€λ κ²μ μμ© νλ‘κ·Έλ¨ μνλ₯Ό νμ₯νλ λ° μ½κ°μ λ
Έλ ₯μ΄ νμνλ€λ μ¬μ€μ΄ "μ λ§μ΄κ² νμνκ°μ?"λΌλ κ²°μ μ λ΄ λ¦¬λλ‘ κ°μνκΈ° λλ¬Έμ λ°λμ λμ κ²μ μλλλ€. 물건μ μμ λλ λμ .
λμμΌλ‘ λ‘컬 κ΅¬μ± μμ μνλ λΉ λ₯Έ μ λ°μ΄νΈ μκ°μ΄ νμν μ μ΄ λ μ λ ₯μ μ μ© ν λΏλ§ μλλΌ νΈλ¦¬κ±°λλ μ€μ μμ μλ₯Ό μ€μΌ μ μμ΅λλ€. νμ¬ νλ‘ν νμ μμλ νμ¬ νΈμ§μ€μΈ νλͺ©μ μνμΌλ‘λ°λ μμ νΈμ§ HOCλ₯Ό ꡬμ±νμ΅λλ€. λν λ³κ²½λ νλλ₯Ό ν΄λΉ μνλ‘ μ μ₯ ν λ€μ κ²°ν© λ λ‘컬 WIP λ³κ²½μΌλ‘ λ λ°μ΄μ€ λ "EDIT_ITEM_ATTRIBUTE"μμ μμ±μλ₯Ό νΈμΆνμ¬ μμ μ λ ₯ λ³κ²½ μ΄λ²€νΈλ₯Ό μ²λ¦¬ν©λλ€. κ·Έ κ²°κ³Ό μμ μ체 λ§ λ€μ λ λλ§λκ³ ν¨μ¬ μ μ μμ μμ μ΄ νΈλ¦¬κ±°λκΈ° λλ¬Έμ μμ νλκ° μ¦μ μ λ°μ΄νΈλ©λλ€ (μ : 'A'λ₯Ό λͺ μ΄ λμ λλ₯΄κ³ μμΌλ©΄ 'AAAAAAAAAAAA'κ°λ§ 'A', 'AA'λ±μ΄ μλ μ‘μ μΌλ‘ μ μ‘λ©λλ€.
λκ΅°κ° κ΄μ¬μ΄ μλ€λ©΄ https://gist.github.com/markerikson/554cab15d83fd994dfab μμ μμ μΌλ‘ HOCλ₯Ό μ»μμ΅λλ€.
μ΄μ¨λ μμ μ κ΅¬μ± μμ μνμ μ μ₯μ μν λͺ¨λ μ©λκ° μλ€λ κ²μ λλ€. μ€μ μ¬μ© μ¬λ‘λ₯Ό κ³ λ €ν΄μΌν©λλ€.
μ¬μ¬μ© κ°λ₯ν κ΅¬μ± μμμ κ²½μ° μΆ©λΆν ν¬κ³ 볡μ‘νλ€λ©΄ μ£Όλ‘ μΆμ μ± λ° ν μ€νΈ μ© μ¬μμ μν΄ Reduxμ μνλ₯Ό μ μ§νλ κ²μ΄ λ―Έλμ λλΉν μ μμ΅λλ€. κ·Έλ¬λμ΄ μ½λ μ¬μ¬μ©μ΄ μ νν μ΄λ»κ² μ€κ³λμ΄μΌνλμ§μ λν΄μλ μ¬μ ν μ½κ°μ μλ¬Έμ΄ μμ΅λλ€ (μ»΄ν¬λνΈ, μ‘μ , 리λμ).
μ°λ¦¬μ μμ© νλ‘κ·Έλ¨μμ μ°λ¦¬λ μ°κ²°κ³Ό κ°μ μ€νμΌλ‘μ΄ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€. https://github.com/Babo-Ltd/redux-state
Reduxμ μνλ₯Ό μ μ₯νλ κ²μ΄ μ΄μν κ²½μ°λ κ±°μ μμμ΅λλ€. λλ κ·Έκ²μ΄ μ 곡νλ νμ μ’μνκ³ , νμν λ λ€λ₯Έ κ΅¬μ± μμμ μνΈ μμ©νλλ‘ λ§λ€ μ μμ΅λλ€.
μ΄μ ν μμλ μ μΌν μκ°μ νΌ μμμ μνλ₯Ό μ²λ¦¬νλ κ²μ λλ€. μλνλ©΄ κ·Έκ²λ€μ΄ λ무 λ§μ μ μκΈ° λλ¬Έμ λλ€. μ΄ κ²½μ° redux-form κ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν©λλ€.
λ΄ μμ μ μ΄μνμ§ μλ ν λ¨μΌ μν νΈλ¦¬λ₯Ό μ¬μ©νκ³ λ³΅μ‘νκ² λ§λ€μ§ μκ³ λ¨μν ν λλ§ μ¬μ©νλ€λ κ²μ λλ€. κ·Έκ² μ μΌν μ§μΉ¨μ λλ€
@gaearon μ΄
@idavollen λͺ κ°μ§ μ€ μ μμ΅λλ€.
<input>
λ³κ²½μ λ λ°μ΄μ± ν λ μνλ₯Ό μ¬μ©νμ¬ κ°μ μ¦μ μ
λ°μ΄νΈνκ³ (λ€λ₯Έ κ΅¬μ± μμκ° λΆνμνκ² λ€μ λ λλ§ ν μνμ΄ μμ) λ λ°μ΄μ€ λ λ°©μμΌλ‘ μ€ν μ΄λ₯Ό μ
λ°μ΄νΈ ν μ μμ΅λλ€.κΈ°λ³Έμ μΌλ‘ λ€λ₯Έ κ΅¬μ± μμμ μν₯μμ£Όμ§ μλ μνμ μ¬μ©ν΄μΌν©λλ€.
μλ₯Ό λ€μ΄ κ³ λ €ν΄μΌ ν μΈ λ²μ§Έ μν©μ΄ μμ΅λλ€. μλ₯Ό λ€μ΄, μμ μ²΄ν¬ λ°μ€κ° μκ³ μ μΆ λ²νΌμ΄μλ μ¬λ¬ μ€λ‘ ꡬμ±λ μμ (λ λλ§ λ©μλμμ λΉμ©μ΄ λ§μ΄ λλ λ°μ 컨ν μ΄λ κ΅¬μ± μμ)μ΄ μμ΅λλ€. μ μΆ λ²νΌμ ν΄λ¦νλ©΄ μ²΄ν¬ λ°μ€κ° μ²΄ν¬ λ λΌμΈμ νΌμ μ μΆν΄μΌν©λλ€. μ¦, μ¬μ©μκ° ν κΈ ν λ νΌμ μ μΆνκΈ° μ κ°λ³ μ²΄ν¬ λ°μ€μ μΌμμ μΈ μνλ μ€μνμ§ μμΌλ©° μ»΄ν¬λνΈ μνλ‘ μ·¨κΈν΄μλ μλλ©° μ²΄ν¬ λ°μ€ ν κΈλ‘ μΈν΄ λ°μνμ§ μμμΌν©λλ€. render ()λ₯Ό νΈμΆν©λλ€.
λΉλΆκ°μ νμΈλ μνλ₯Ό μμ© νλ‘κ·Έλ¨ μν μ μλ λ‘컬 κ΅¬μ± μμ μν, μ¦ νμΈλμ ν κΈνλ λμ λΆνμν render () νΈμΆμ νΌνκΈ° μν΄ νΌ λ°μ κ΅¬μ± μμμ λ£μ§ μμμ΅λλ€. μΈμ€ν΄μ€ λ³μλ μ²΄ν¬ λ°μ€λ₯Ό μ μ§νλ κ²λ³΄λ€ μ νΈλμ§λ§ λ°μ ν¨ν΄μ μλ°°λ©λλ€.
μ΄ κ²½μ° μ΄λ¬ν νμΈλ μνλ₯Ό κ΄λ¦¬νλ κ°μ₯ μ’μ λ°©λ²μ΄ 무μμΈμ§ κΆκΈν©λλ€.
@idavollen μ΄ νμΈλμ μ μ΄λμ§ μμ΅λκΉ? κ·Έλ μ§ μμ κ²½μ° μ΄μ¨λ λ€μ λ λλ§νλ―λ‘ κ΅¬μ± μμμ μνμμ μ νλ νλͺ©μ μΆμ νκ³ μ΄λ₯Ό μ¬μ©νμ¬ μ μΆν λ°μ΄ν° λΆλΆμ μ νν μ μμ΅λλ€.
Reduxλ κ΅¬μ± μμμ μνμ λΉν΄ μΌλ§λ λΉ λ¦ λκΉ? μ€μ μ΄λ²€νΈμ λ λλ§ νλ‘μΈμ€ μ¬μ΄μ νμ΄λ° μΈ‘λ©΄μμ μ λ§ ν©λ¦¬μ μΈ UI μνμ μν΄ Reduxλ₯Ό μ¬μ©ν΄μΌν©λκΉ? κ΅¬μ± μμ μνλ₯Ό μ¬μ©νλ €λ©΄ κ·Έλ κ² κ°λ¨νμ§ μμ μμ¬ μν΅μ΄ λ§μ΄ νμν 볡μ‘ν μν©μ΄ μμ΅λλ€. μ΄ λ¬Έμ μ λν λμμ μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€.
@tiberiumaxim λ΄ κ²½νμ (μ λ μ€λ§νΈ TVμ κ°μ μ μ λ ₯ μ₯μΉμμ μ€νλλ react λ° reduxλ‘ μ±μ κ°λ°ν©λλ€). λλΆλΆμ κ²½μ° κ΅¬μ± μμ μνλ₯Ό μ λ°μ΄νΈνλ κ²μ΄ λ μ±λ₯μ΄ μ’μ κ²μ λλ€. κ·Έ μ΄μ λ λ°μν΄μΌνλ μ°¨μ΄κ° λ μμ λ°μ΄ν° μΈνΈμ μκ³ λμ€ν¨μΉκ° λ°μνμ§ μκΈ° λλ¬Έμ λλ€. κ΅¬μ± μμ λλ μμ λ§ ν΄λΉ μνμ μ‘μΈμ€ν΄μΌνλ κ²½μ° λ‘컬 κ΅¬μ± μμ μνλ₯Ό κ³ μνλ κ²μ΄ λ μ’μΌλ©° μ΄λ μ’ μ’ UI κ΄λ ¨ μνμ κ²½μ°μ΄μ§λ§ νΉμ μ§μ μμ ν΄λΉ λ°μ΄ν°λ₯Ό redux μ μ₯μμ μ μ§ν΄μΌνλ κ²½μ°- λ‘컬 (μ»΄ν¬λνΈ) μνμ κΈλ‘λ² (redux) μνμ μ‘°ν©μ μ¬μ©ν΄μΌ ν μ μμΌλ©° μ νν μκ° (μ : μ¬μ©μκ° νμ΄μ§μμ λ²μ΄λ λ)μ ν΄λΉ λ°μ΄ν°λ₯Ό redux μ μ₯μμ μ μ§ν΄μΌν©λλ€. νΉμ μ¬κ±΄μ λν΄ μ’ λ μ€λͺ ν΄ μ£Όμλ©΄ λ μμΈν μ 보λ₯Ό λ릴 μ μμ΅λλ€
Reduxμ λ€μ΄κ°λ μνμ κ΅¬μ± μμμ λν΄ λ‘μ»¬λ‘ μ μ§λλ κ²μ μ¬μ©μκ° κ²°μ ν©λλ€. http://redux.js.org/docs/faq/OrganizingState.html#organizing -state-only-redux-state λ° http://redux.js.org/docs/faq/Performanceλ₯Ό ν΅ν΄ μ½μ μ html # performance -scalingμ μ°Έμ‘°νμμμ€.
@deowk μ±λ₯ λ¬Έμ μ λν μ§μμ 곡μ ν΄ μ£Όμ
μ κ°μ¬ν©λλ€. μ λ λ§μ°¬κ°μ§λΌκ³ μκ°νμ§λ§ νμΈμ΄ νμνμ΅λλ€.
λν @markerikson λ§ν¬μ κ°μ¬λ립λλ€. λ€μ ν λ² μ΄ν΄ λ³΄κ² μ΅λλ€.
λκ΅°κ° λͺ
μ μ μΌλ‘ μΈκΈνλμ§ νμ€νμ§ μμ§λ§ λ‘컬 κ΅¬μ± μμ μνλ Reduxμμλ κ΄λ¦¬ ν μ ββμμ΅λλ€. κ΅¬μ± μμ μμ±μμμ λ°λ‘ μμ μ λ§λ€ μ μμ΅λλ€. μ΄ λ‘컬 μ μ₯μλμ΄ κ΅¬μ± μμμ μνλ₯Ό ν¬ν¨νκ³ μ΄ κ΅¬μ± μμμ κ΄λ ¨λ μμ
μ μ²λ¦¬ν©λλ€ (λ°μ΄ μ μ₯μμ dispatch
ν¨μ λλ ν΄λΉ dispatch
ν¨μλ₯Ό νΈμΆνλ μ½λ°±μ μ λ¬νμ¬ ν΄λΉ νμ νλͺ©). .
μ΄ μν€ν μ²λ μλμΌλ‘ ꡬννκ±°λ redux-fractal, redux-ui λ±κ³Ό κ°μ μΌλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν μ μμ΅λλ€.
λλ Danμ΄ μ§μ νλ―μ΄ κ΅¬μ± μμμ μνλ₯Ό μ λ°μ΄νΈνλ κ°μκΈ° μ€νμΌμ μ κ·Ό λ°©μμ ꡬνν μλ μμ΅λλ€! https://twitter.com/dan_abramov/status/736310245945933824 μ°Έμ‘°
νλ νμκΈ° λ° λͺ¨λ¬ μ΄κΈ° λλ λ«κΈ°μ κ°μ UI μνλ₯Ό μ μ₯ν μμΉλ₯Ό μκ³ μΆμ΅λλ€. setStateλ₯Ό μ¬μ©νλ©΄ λ°μ κ΅¬μ± μμμ λ¨μ ν μ€νΈμ λ¬Έμ κ° λ°μν©λκΉ?
@ akshay2604 : λ€μ, κ·Έκ²μ λΉμ μκ² λ¬λ € μμ΅λλ€. μ΄ μ€λ λμ μ΄μ λκΈμ κ²μ ν λ§ν¬λ₯Ό μ°Έμ‘°νμμμ€. νΉν κ΅¬μ± μμλ₯Ό ν
μ€νΈνλ λ° λμμ΄λλ Enzyme λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²½μ° κ΅¬μ± μμλ₯Ό ν
μ€νΈνλ λμ setState
λ₯Ό νμ€ν μ¬μ©ν μ μμ΅λλ€.
μ μκ°μ 곡μ νκ² μ΅λλ€.
μ ν리μΌμ΄μ μ μ λ ₯ / μΆλ ₯κ³Ό κ΄λ ¨λλ λ°©μμ λ°λΌ μνλ₯Ό 3 κ°μ§ λ²μ£Όλ‘ λΆλ₯ν©λλ€.
{ "todos": [{ id: 1, title: "title" }, { id: 2, title: "title" }] }
{ "changeTodo": { title: "title", action: "add", done: false },
{ id: 1, title: "changed title", action: "modify", done: true }, { id: 2, action: "delete" } }
{ "displayOptions": { searchTerm: "title", sort: ["title", "desc"], filter: "done=false" } }
cache
κ³Ό changes
νΌν©νμ§ μκ³ cache
κ³Ό view
νΌν©νμ§ μμΌλ©° view
κ³Ό (μ) νΌν©νμ§ μμ΅λλ€. changes
λ¬Όλ‘ λ¨μΌ λ°μ κ΅¬μ± μμμ νμνλ €λ©΄ μ΄λ»κ² λ λ³ν©ν΄μΌν©λλ€. λ°λΌμ "λ³ν© λ"κ°μ²΄λ λ€μκ³Ό κ°μ΅λλ€.
{ "todos": [{id: undefined, title: "title", done: false }, { id: 1, title: "changed title" }] }
κ·Έλ¬λ μ΄λ μνκ° μλλΌ μ ν리μΌμ΄μ
λ‘μ§ μ κ²°κ³Όμ
λλ€. λ°λΌμ μ΄λμλ 보κ΄ν΄μλ μλ©λλ€.
μ΄ λ³ν© λ μνλ₯Ό μ νκΈ°μμ μΊμ ν μ μκ³ , μ μ₯μμμ μΊμ ν μ μμΌλ©°, κ΅¬μ± μμμ μΊμ ν μ μμ§λ§ "μν"κ° μλλ©° μ€μνμ§ μμΌλ©° μ ν리μΌμ΄μ
λ
Όλ¦¬ ν¨μλ₯Ό 3 κ°μ μν λΆλΆμ λͺ¨λ μ½κ² λ€μ μ μ© ν μ μμ΅λλ€. λ³ν© λ μνλ₯Ό λ€μ μ»μ΅λλ€. μ΄κ²μ΄ λ°λ‘ κΈ°λ₯μ μ κ·Ό λ°©μμ
λλ€.
Redux κ΄λ¦¬μλ "μμ© νλ‘κ·Έλ¨ λ‘μ§μ μ¬λ¬ 리λμμ μ¬λ¬ μ΄λ²€νΈλ‘ ꡬνν΄μΌν©λλ€. κ·Έλ¬λ©΄"λ³ν© λ "κ°μ²΄μ λ€λ₯Έ λΆλΆμ ꡬμ±νκ²λ©λλ€."λΌκ³ λ§ν©λλ€.
μλͺ»λ μ κ·Όμ΄λΌκ³ μκ°ν©λλ€. κ·Έκ²μ λΉμ μ΄ reduxμμ λ²μ΄λ μ μλ€λ κ²μ μλ―Έν©λλ€. μνλ₯Ό κ΄λ¦¬νλ λκ΅¬λ‘ μλ λ κ²μ λ³Έμ§μ μΌλ‘ μμ© νλ‘κ·Έλ¨ λ
Όλ¦¬ μ ꡬνμ΄λ©λλ€.
μλ νμΈμ, μ λ λ©°μΉ λμ React / Reduxλ₯Ό μ΄ν΄λ³΄κ³ μΌλΆ μ 보λ₯Ό κ΅¬μ± μμ λ‘컬 μνμ μ μ₯νκ±°λ μ μ§ν μ§ μ¬λΆλ₯Ό μ ννκΈ°λ‘ ν κ²°μ μ μ΄ν΄ν©λλ€.
νμ§λ§ νλμ νλμ΄ λμμ λ κ°μ§λ₯Ό λͺ¨λ μꡬνλ€λ©΄ μ΄λ»κ² λ κΉμ? λ€μμ λ§€μ° μΌλ°μ μΈ μ¬μ© μ¬λ‘μ λλ€.
{ modelItems: myModelItems }
μ
λλ€. μλ² λͺ¨λΈμ μΊμ (μΌλΆ / ν¬μ)ν©λλ€.MyItemsView
λ‘ κ΅¬μ±λ©λλ€. λ§μ΄νΈλλ©΄ κ΅¬μ± μμκ° λͺ¨λΈ νλͺ© κ°μ Έ μ€κΈ°λ₯Ό νΈλ¦¬κ±°ν©λλ€. κ΅¬μ± μμ μ
λ ₯ : myModelItems
. κ΅¬μ± μμ μΆλ ₯ : fetchModelItems
μ‘μ
νΈλ¦¬κ±°. κ΅¬μ± μμ λ΄λΆ : state.busy
λ° state.errorId
MyItemsView
κ° fetchModelItems
MyItemsView
νΈλ¦¬κ±°νλ©΄ λͺ¨λΈμ κ°μ Έ μμ μ μ₯μμ μΊμνκΈ° μν΄ HTTP μμ²μ΄ μλ²λ‘ μ μ‘λ©λλ€. μ΄ λΉλκΈ° μμ
μλ λ€μκ³Ό κ°μ 4 λ¨κ³μ λ§μ νν¬κ° μμ΅λλ€. onStarted
(HTTP μμ²μ΄ μμ λλ €κ³ νκ³ κ΅¬μ± μμμμ μ€νΌλλ‘λκ° μμλ¨), onEnded
(HTTP μλ΅μ΄ μμλ¨, μ€νΌλλ‘λκ° κ΅¬μ± μμμμ μ€μ§λ¨) , μ¬μ ν μλ΅ μνλ₯Ό λ³΄μ§ μμ), onFailed
(κ΅¬μ± μμμ μ€λ₯ μλ¦Όμ΄ νμλ¨) λ° onSucceed
(Redux μ μ₯μκ° μ
λ°μ΄νΈ λ λ€μ 보μ νκ³ μλ λͺ¨λΈ μΊμκ° μ λ¬λ¨) λ λλ§μμν κ΅¬μ± μμ)λ°λΌμ fetchModelItems
μ‘μ
νΈλ¦¬κ±°λ₯Ό λ€μκ³Ό κ°μ΄ λΆν νλ λ°©λ² :
onStarted
, onEnded
λ° onFailed
λ Redux μ€ν μ΄μ λλ¬νμ§ μμ΅λκΉ? μ΄λ onStarted
λ° onEnded
κ° λͺ¨λΈ μΊμμ μνΈ μμ©νμ§ μμμΌνλ μΌμμ μΈ UI μνμ΄κΈ° λλ¬Έμ
λλ€. onFailed
λ§μ°¬κ°μ§μ
λλ€ (λͺ¨λΈ μΊμλ λ³κ²½λμ§ μκ³ UIκ° μ€λ₯ μλ¦Όμ λ λλ§ν©λλ€). MyItemsView
λ μ¬κΈ°μ μΊμ λ λͺ¨λΈμ΄ μλ UI μνλ₯Ό λ λλ§ν©λλ€.onSucceed
μ΄ Redux μ€ν μ΄λ₯Ό κ°νν©λκΉ? μ΄ λͺ¨λΈ μΊμ 볡κΆμ λΉμ²¨μ΄ μκΈ° λλ¬Έμ, λ€μ λ λλ§, μ¬μ μ€μ κ², μ§λ¦¬μ μμ€μ λν μ‘μΈμ€ κΆνμ λΆμ¬ μ μ ν myModelItems
μμ MyItemsView
λ΄ νμ¬ μλμ ꡬνμ λν΄ Redux Thunkλ fetchModelItems
μμ
νΈλ¦¬κ±°λ₯Ό μ²λ¦¬ν©λλ€. λλ κ·Έκ³³μμ Redux κ²½λ‘λ₯Ό μ νν κ² κ°κ³ , "λΉλκΈ° μ±κ³΅μ Redux μ€ν μ΄μ μ λ¬νκ³ λ€λ₯Έ κ²μ React μ»΄ν¬λνΈ μνμ μ μ§νλΌ"κ³ λ μ΄μ λ§μμ λ°κΏ μ μλ€κ³ λλλλ€.
μ΄κ²μ λΉνΉμ€λ¬μμ μ μ₯λ μ±κ³΅μ κ°μ Έμ€κ³ μ°κ²°λ κ΅¬μ± μμ (μ : Redux 컨ν
μ΄λ)λ‘ μ λ¬ν©λλ€. κ·Έλ¬λ λ‘λ© μ€νΌλμ λΉμ°Έν μ½μ λ‘κ·Έ μ€λ₯ λ©μμ§ atmμ΄ μμ΅λλ€. store.ui.myItemsView.busy
λ store.ui.myItemsView.errorId
μ μνκ³ μΆμ§λ μμ§λ§ κ΅¬μ± μμ μνμμ ν΄λΉ μ 보λ₯Ό κ°μ Έμ΅λλ€.
@pascalav :
μ΄κ²μ μ§μ μμ€ν
μ΄ μλλΌ λ²κ·Έ μΆμ κΈ°μ
λλ€. μ¬μ©λ²μ λν μ§λ¬Έμ λ λ§μ μ¬λλ€μ΄ λμμ μ€ μ€λΉκ°λμ΄μλ Stack Overflow λλ Reactifluxλ₯Ό μ¬μ©νμμμ€. μλ§λ λ λμ λ΅λ³μ λ 빨리 μ»μ μμμ κ²μ
λλ€. κ°μ¬!
κ°μ₯ μ μ©ν λκΈ
μ μ μ μΌλ‘ μ±μ μ€μνμ§ μκ³ λ³΅μ‘ν λ°©μμΌλ‘ λ³κ²½λμ§ μλ μμ μνμ Reactλ₯Ό μ¬μ©ν©λλ€. μλ₯Ό λ€μ΄, μΌλΆ UI μμμ ν κΈ, μμ μ λ ₯ μν. μ μ μ μΌλ‘ μ€μνκ±°λ 볡μ‘ν λ°©μμΌλ‘ λ³ν λ μνμ Reduxλ₯Ό μ¬μ©ν©λλ€. μλ₯Ό λ€μ΄ μΊμ λ μ¬μ©μ λλ κ²μλ¬Ό μ΄μμ΄ μμ΅λλ€.
λλ‘λ Redux μνμμ React μν (Reduxμ 무μΈκ°λ₯Ό μ μ₯νλ κ²μ΄ μ΄μ ν΄μ§)λ‘ μ΄λνκ±°λ λ€λ₯Έ λ°©λ² (λ λ§μ κ΅¬μ± μμκ° λ‘컬μ΄μλ μνμ μ‘μΈμ€ν΄μΌνλ κ²½μ°)μ μν κ²μ λλ€.
κ²½νμ λ²μΉμ λ μ΄μν μΌμνλ κ²μ λλ€.