λλ μ‘μ νμ λ€μ μ€νμ΄μ€μ μ’μ ꡬνμ μ°ΎκΈ° μν΄ μ½ μΌμ£ΌμΌμ 보λκ³ μ‘μ μμ±μ, 리λμ λ° νμ μ ν λͺ©λ‘μ 보μ νλ Transition ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘νλ λ΄ μμ μ λ‘€λ§νμ§λ§μ΄ μ κ·Ό λ°©μμ λ°©λ²μ΄ νμν©λλ€ λ³΄μΌλ¬ νλ μ΄νΈ μ½λκ° λ무 λ§κ³ λ§€μ° κ°λ¨ν μμ μ΄ λ§μΌλ©΄ λ¬Έμ κ°λ©λλ€.
μ΄ μ μ₯μμ λ€λ₯Έ λ§μ μμ μμ μ°Ύμ μμλ λͺ¨λ μμ μμμ΄ λ¬Έμ λ μ΄λ€ μ΄μ λ‘ νμ 무μλμ§λ§ μ΄κ²μ΄ Reduxλ₯Ό μ‘°μ¬νκΈ° μμν λ λ°κ²¬ ν 첫 λ²μ§Έ λ¬Έμ μμ΅λλ€.
μ¬κΈ°μ λκ° λΉ μ‘λμ? λΉμ μ μΆ©λ μ΄λ¦μ μ§μ νλ μ‘μ μ νμ΄ μμ΅λκΉ?
λκ΅°κ° μμ λ₯Ό μ λ°μ΄νΈνκ³ μ΄ λ¬Έμ λ₯Ό μ΄λ»κ² μ²λ¦¬νλμ§ λ³΄μ¬ μ£Όκ±°λ μ¬λ°λ₯Έ λ°©ν₯μ μλ €μ€ μ μμ΅λκΉ?
λ΄ νΉμ μ¬λ‘λ νλ°νΈ μλμ 2 κ°μ λ³λ κ΄λ¦¬ ν¨λμ΄μλ κ²κ³Ό κ΄λ ¨μ΄ μμ΅λλ€. νλλ ν μ€ν° μ©μ΄κ³ λ€λ₯Έ νλλ μ€ν μ΄μ λ³λ μΉμ ( "testerAccount", "customerAccount")μ μνλ₯Ό μ μ₯νλ κ³ κ° μ©μ΄μ§λ§ λ λ€ ADD_VIDEO_UPLOAD, ADD_COMMENT λ±κ³Ό κ°μ μ μ¬ν μμ μ μν ν μ μμ΅λλ€.
μ¬κΈ°μ λμμ μ£Όμ μ κ°μ¬ν©λλ€. :)
accountTypeμ μ‘μ
μ λ£μΌμκ² μ΅λκΉ? 리λμ ν©ν 리λ₯Ό μμ±νκ³ λμΌν μ½λλ₯Ό μ¬λ¬ λ² μ¬μ©νμ¬ λ€λ₯Έ μμ
μ μλ΅νλ 리λμλ₯Ό μμ±νλ λ°©λ²μ examples/real-world/reducers
λ μ°Έμ‘°νμΈμ.
λ§μ°¬κ°μ§λ‘ μ‘μ μμ±μλ ν¨μμΌ λΏμ΄λ©° λ€λ₯Έ ν¨μλ₯Ό λ°ννλ ν¨μλ₯Ό λ§λ€ μ μμμ μμ§ λ§μμμ€.
λλ λΉμ μ΄ κΈ°μ‘΄μ μμμ 무μλμλ€κ³ λ§νλ λ¬Έμ μ νΉμ μμ μλ₯Ό μ 곡νλ©΄ μ λ§ λμμ΄ λ κ²μ΄λΌκ³ μκ°ν©λλ€.
κ·Έλ° λ€μ νΉμ μλ₯Ό λ¨μννλ λ°©λ²μ μ°Ύλλ‘ λμ λ릴 μ μμ΅λλ€. μ½λμμ΄ μ§λ¬Έμ λν μλ΅μΌλ‘ νΉμ ν κ²μ μ μνλ κ²μ λ§€μ° μ΄λ ΅μ΅λλ€.
@gaearon λλ λΉμ μ΄ μ΄κ²μΌλ‘ μ΄λλ‘ ν₯νκ³ μλμ§ μκ³ μμ§λ§ μ¬μ¬μ© κ°λ₯ν κ°μκΈ°, μ‘μ μ μμ λλ DRY 물건μ λ§λ€λ €κ³ νμ§λ μμ΅λλ€.
λ μ¬λμ΄ μμ€ν μ μλ‘ λ€λ₯Έ μΉμ μμ μμ ν μ μλλ‘ μμ κ·Έλ£Ήμ μλ‘ λΆλ¦¬νλ €κ³ λ Έλ ₯νκ³ μμΌλ©° μμ μ ν μ΄λ¦μ λ€μ μ€νμ΄μ€κ° λΆμ‘±νμ¬ μ€μλ‘ μλ‘μ κ°μκΈ°λ₯Ό νΈλ¦¬κ±°νμ§ μλλ‘ν©λλ€.
μ΄κ²μ΄ λ λͺ ν ν΄μ§κΈ°λ₯Ό λ°λλλ€.
https://www.npmjs.com/package/flux-constant λ₯Ό createActionTypes
λΌλ λ§€μ° κ°λ¨ν λμ°λ―Έ ν¨μμ ν¨κ» μ¬μ©νμ¬ λ΄ νλ‘μ νΈμμμ΄ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
λ³Έμ§μ μΌλ‘ λ΄ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
// create-action-types.js
var fluxConstant = require('flux-constant');
module.exports = function (types) {
return fluxConstant.set(types);
};
// in foo-action-types.js
module.exports = createAtionTypes([
'ADD_FOO',
'REMOVE_FOO'
]);
// in some-store.js
var fooActionTypes = require('foo-action-types');
function (state, action) {
switch(action.type) {
case fooActionTypes.ADD_FOO:
case fooActionTypes.REMOVE_FOO:
}
}
λͺ¨λ μ‘μ
μ νμ νκ³³μμ μμλ‘ μ μ§νμ§ μλ μ΄μ λ 무μμ
λκΉ?
κ·Έλ° λ€μ λμΌν μ΄λ¦μ λ λ² λ΄λ³΄λΌ μ μκΈ° λλ¬Έμ μΆ©λ ν μ μμ΅λλ€.
μ΄λ₯Ό λ μ μκ°ννκΈ° μν΄ μ΄κ²μ΄ μμ μ μ΄κΈ° μνλΌκ³ κ°μ ν΄ λ³΄κ² μ΅λλ€.
let initialState = {
"testerAccount": {
"videoUploads": [],
"messages": []
},
"customerAccount": {
"videoUploads": [],
"messages": []
},
"systemUserAccount": {
"videoUploads": [],
"messages": []
}
};
μ΄λ¬ν κ° μΉμ μ λν΄ λΉλμ€ λλ λ©μμ§λ₯Ό μΆκ°νκΈ° μν΄ λ³λμ κ°μκΈ°λ₯Ό ꡬνν λ μμ μ ν μ΄λ¦ μΆ©λμ μ΄λ»κ² νΌν μ μμ΅λκΉ?
@gaearon λΉμ μ΄ μ μνλ κ²μ λ¬Έμ μ ν΅μ¬μ ν΄κ²°νμ§ λͺ»ν©λλ€. μκ°μ΄ μ§λ¨μ λ°λΌ λ§μ λ¬Έμ λ₯Ό μΌμΌν€λ κ±°λν μ νμ νμΌλ‘ λλ κ²μ΄κΈ° λλ¬Έμ λνΈ ν μ΄ν μ κ·Ό λ°©μμ
μ½λ λ³ν© μ€μ 곧λ°λ‘ λ¬Έμ κ° λ°μνλ©° λμ€μ μ΄λ¦ μ§μ ν΄νΉμΌλ‘ ν΄κ²°ν΄μΌν©λλ€. μ :
ADD_VIDEO_UPLOAD, ADD_TESTER_VIDEO_UPLOAD, ADD_VIDEO_UPLOAD_IN_SOME_SECTION λ±
λ€μ ν λ² ν° κ³¨μΉ«κ±°λ¦¬μ λλ€.
@koulmomo μ΄κ²μ΄ λ°λ‘ μ κ° μ°Ύλ κ²μ λλ€. κ°μ¬ν©λλ€ :) : +1 : κ°λ¨νκ³ κ°λ ₯ν©λλ€.
@gaearon μ΄ ν¨ν€μ§ λ redux-constantλΌλ μ΄λ¦μ μ ν¨ν€μ§λ₯Ό μ¬μ©νλ μμ κ° νλ μ΄μ μμ΄μΌνλ€κ³ μκ°ν©λλ€.
λ΄ μ견μΌλ‘λ λ€μ μ€νμ΄μ€ λ¬Έμ λ₯Ό ν΄κ²°νλ λ¬Έμ / μμ μμ μ κ·Ό λ°©μμ ν보νλ κ²μ΄ μλ‘μ΄ κΈ°λ³Έκ°μ΄μ΄μΌν©λλ€.
λμ μ£Όμ μ κ°μ¬ν©λλ€ :)
κ·νμ μμμ λλ μ νλμ μ ν μΈνΈ, νλμ κ°μκΈ° μμ±κΈ° λ° νλμ μ‘μ
μμ±κΈ° μΈνΈκ° μλμ§ μ΄ν΄νμ§ λͺ»ν©λλ€. μ‘μ
μ κ·Έλ€μ ꡬλ³νκΈ° μν΄ accountType
μμ±μ ν¬ν¨ν©λλ€. μ‘μ
μ μμλμ΄λ₯Ό λ§€κ° λ³μλ‘ λ°μλ€μ
λλ€. κ°μκΈ° ν©ν 리λ accountType
μλ½νκ³ μ΄ κ³μ μ νμ μμ
λ§ μ²λ¦¬νλ κ°μκΈ°λ₯Ό λ°νν©λλ€.
flux-constant
μ΄ μ¬κΈ°μμ νλ₯ν μ루μ
μ΄λΌκ³ μκ°νμ§ μμ΅λλ€. instanceof
μνμ μμ‘΄νλ κ² κ°μ΅λλ€. μ¦, deserialized μ νμ΄ μμ± λ μ νκ³Ό μΌμΉνμ§ μκΈ° λλ¬Έμ μμ
μ μ§λ ¬ννκ³ λμ€μ λ€μ μ¬μν μ μμ΅λλ€.
μ¬λλ€μ μ’ μ’ Flux μ νμ κΈ°λ₯μ κΉ¨λ¨λ¦¬κ³ μλ€λ μ¬μ€μ κΉ¨λ«μ§ λͺ»ν μ± Fluxλ₯Όβλ¨μνβνλ €κ³
κ·νμ μμμ λλ μ νλμ μ ν μΈνΈ, νλμ κ°μκΈ° μμ±κΈ° λ° νλμ μ‘μ μμ±κΈ° μΈνΈκ° μλμ§ μ΄ν΄νμ§ λͺ»ν©λλ€. μμ μλ ꡬλΆνκΈ° μν΄ accountType μμ±μ΄ ν¬ν¨λ©λλ€. μ‘μ μ μμλμ΄λ₯Ό λ§€κ° λ³μλ‘ λ°μλ€μ λλ€. κ°μκΈ° ν©ν 리λ accountTypeμ μλ½νκ³ μ΄ κ³μ μ νμ μμ λ§ μ²λ¦¬νλ κ°μκΈ°λ₯Ό λ°νν©λλ€.
λλ λΉμ μ μμμ λͺ λ°±ν λμΉμΌλ‘ μ€ν΄λ₯Ό λ°μμ΅λλ€. λλ λΉμ μ΄ μ¬κΈ°μ DRYκ° μλ€λ κ²μ μλ―ΈνμΌλ©° κΈ°λ₯μ λμΉμ https://github.com/rackt/redux/issues/786#issuecomment -142649749μμ λ§ν κ²μ²λΌ λΆλͺ ν©λλ€.
μ¬κΈ°μ λμκ΄μ΄ νμνμ§ μλ€κ³ μκ°ν©λλ€. 컨벀μ
μ μΈμ°μμμ€! μλ₯Ό λ€μ΄, νμ νλ‘μ νΈ λλ κΈ°λ₯μ΄ λ무 λΆλ¦¬ λ κ²½μ° μμ
μ ν feature/ACTION_TYPE
(μ : testers/UPLOAD_VIDEO
λλ customers/UPLOAD_VIDEO
λ₯Ό νΈμΆνλ κ·μΉμ λ§λμμμ€. μ΄ "κ·Έλ£Ή"μ΄ μ€μ λ‘ λμ€ν¬μ μ€μ ν΄λ (λλ λ λμ ν¨ν€μ§)μ ν΄λΉνλ κ²½μ° νΉν μ μ©ν©λλ€.
μλ°μ μ½λ κ²ν μμ μ½κ² ν¬μ°© ν μ μμ΅λλ€. _ μ λ§λ‘ _ μνλ€λ©΄ μ΄κ²μ μλν ν μλ μμ§λ§ μλ λ€μ μ€νμ΄μ€λ₯Ό μ΄λ»κ² κ°μ Έ μ€λμ§ μ μ μμ΅λλ€. κ° λͺ¨λ λ΄μμ κΈ°λ₯μλ³΄λ€ μ½κ² ββμ μ΄νκ³ μ€μλ‘ μΈν λ Έλ ₯μ μ€λ³΅μ λ°©μ§νκ³ λ¬Έμλ‘ λͺ¨λ μμλ₯Ό νλμ νμΌμ μ μΈνκ³ μΆμ κ²μ λλ€.
μ½λ λΆν , λ€μ μ€νμ΄μ€ μμ
μ ν λ±μ μ¬μ©νμ¬ huge-apps
μμ λ₯Ό μΆκ°ν©λλ€. κ·Έλλ λ³λμ λ¬Έμ μ
λλ€.
λ¬Έμμ΄μ λ³Έμ§μ μΌλ‘ λ€μ μ€νμ΄μ€μ λμμ§ μμ΅λλ€. URLμ λ¬Έμμ΄μ΄λ©° μ λλ‘ μλνλ κ² κ°μ΅λλ€.
@gaearon λ§μμ, νλμ€ μμλ₯Ό κΈ°λ°μΌλ‘ ν μ루μ μΌλ‘ μ§λ ¬ν λ¬Έμ λ₯Ό μμ΄ λ²λ Έμ΅λλ€.
μ체 μ΄λ¦μΌλ‘ λͺ¨λ / λ€μ μ€νμ΄μ€λ₯Ό μ½κ² ꡬλΆν μμλ ν λ¬Έμμ΄ κΈ°λ° λ€μ μ€νμ΄μ€μλ λ¬Έμ κ° μμ΅λλ€.
λͺ λͺ κ·μΉ κΈ°λ° μ루μ μ μ΄μ μ λ³Έ κ²μ λλ€.
https://github.com/erikras/ducks-modular-redux
κ·Έλ¬λ λλ λΉμ μ κ²½νμ κΈ°λ°μΌλ‘ ν λ λμ λλ "μ¬λ°λ₯Έ"λ°©λ²μ΄ μκΈ°λ₯Ό λ°λλλ€.
νλμ€ μμ μ κ·Ό λ°©μμ μ€μ λ‘ μ΄λ€ μ μΌλ‘λ μ§λ ¬ν ν μμλ κ²μΌλ‘ λ³ννλ €κ³ μλ ν κ²μ λλ€.
λ€λ₯Έ μ¬λλ€μ μκ°μ λ§μ΄ μ μ½ ν μ μκ³ λμ€μ μ½κ² λ°λ₯Ό μμλ μΌμ’ μ κ·μΉμ μ립νλ λ° λμμ΄ λ κ²μ΄λ―λ‘ μκ°μ΄ μμΌλ©΄ "κ±°λν μ±"μμ λ₯Ό μΆκ°νμμμ€.
λ€μ κ°μ¬ν©λλ€ :)
μ, μ£μ‘ν©λλ€. μνκΉκ²λ νλμ ν° μ±μμ μμ νμ§ μμκ³ , κ·Έλ΄ λλ μ€μ λ‘ μ΄λ€ μΌμ΄ μΌμ΄λ μ§μ λν μ’μ κ°μλ₯Ό μ 곡νκΈ° λλ¬Έμ μμκ° μΉμ μΌλ‘ κ·Έλ£Ήν λ νλμ κ±°λν νμΌμ΄ μλ€λ μ μ΄ μ’μμ΅λλ€. μ±μμ.
@pbc μ²΄ν¬ μμ https://gist.github.com/jhewlett/acceb0e84bf043c17b66
μ΄ "λ¬Έμ "κ° λ¬Έμμμ λ μμΈν μ€λͺ λλ κ²μλ³΄κ³ μΆμ΅λλ€. @pbcμ κ°μ μ§λ¬Έμ΄ μμ΅λλ€. λλ "μ λͺ¨λ μ‘μ μ νμ νκ³³μμ μμλ‘ μ μ§νμ§ μλκ°?"λΌκ³ μκ°νμ§ μμ΅λλ€. μ¬λ¬ νλ‘μ νΈμμ μ¬λ¬ λͺ¨λμ μ¬μ¬μ©νκ³ "κ·μΉμ μ€μ νμμμ€!" CSS λλμ BEMκ³Ό λ§€μ° ν‘μ¬ν©λλ€. κ·Έλ¬λ μ°λ¦¬λ BEMμμ CSS λͺ¨λλ‘ μ΄λνκ³ ν° νλ‘μ νΈμ μ‘μ μ νμλ ν΄μ ν΄λμ€ μ΄λ¦μ΄ νμν CSS λͺ¨λκ³Ό λΉμ·ν κ²μΌλ‘ μκ°ν©λλ€.
λ΄κ° λ§ν μμλ ν, μ§λ ¬νμ μΆ©λ μμμ λͺ¨λ λ¬μ± ν μμλ λ°©λ²μ μμ΅λλ€.
μ¬μ¬μ© κ°λ₯ν λͺ¨λμ λν μ’μ κ·μΉμ μ λλ©μΈ μ΄λ¦, githubμ μ¬μ©μ μ΄λ¦ / repo λλ npmμ λ±λ‘ λ λͺ¨λ μ΄λ¦κ³Ό κ°μ κΈ°μ‘΄ "κ³ μ 곡κΈμ"λ₯Ό μ¬μ©ν μ μμ΅λλ€.
νΈμ§ : CSS λͺ¨λμ CSS μμ μ¬μ©μ μ μ μΈμ΄λ₯Ό μ μνκ³ μ¬μ μ²λ¦¬ μ€μ ν΄λμ€ μ΄λ¦μ μ λμ¬λ‘ μ§μ νμ¬μ΄λ₯Ό μνν©λλ€ (μ΄μ¨λ κ·μΉμ λ°λΌ μμ±λμ§λ§ μμ± λ κ²μ).
μ§λ¬Έκ³Ό ν λ‘ μ +1. λλ λν @pbc μ κ°μ μ νν λ¬Έμ λ‘ λ§μ μ΄λ €μμ
μ§λ ¬ν κ°λ₯ν λ¬Έμμ΄ μμ μ νμ λν μ루μ μ μ°Ύμ κ² κ°μ΅λλ€. μ°λ¦¬ λ§μμ΄ μ΄λ€ κ²μ μΈμμ μΈ μ νμ κ°νλ μν© μ€ νλλΌκ³ μκ°ν©λλ€.
κΈ°λ³Έ μμ΄λμ΄λ μ ν μμκ° μ΄λ€ μ μΌλ‘λ λ¬Έμμ΄ κ°κ³Ό κ΄λ ¨ λ νμκ° μλ€λ κ²μ λλ€. λ°λΌμ 무μμλ‘ μμ± λ κ°, ν΄μ λ νμΌ κ²½λ‘ λλ μ ν μμ λ¬Έμμ΄ κ°μ λν΄ κ³ μ ν λ€λ₯Έ κ²μ μ¬μ©ν μ μμ΅λλ€. κ°μκΈ°μμ μ ν μμλ₯Ό μ΄λ¦μΌλ‘ κ°μ Έμ€κ³ μ΄λ¦μΌλ‘ λΉκ΅ν©λλ€. μ΄ μ΄λ¦μ λ€λ₯Έ μμ λ° λ€λ₯Έ κ°μκΈ°μμ μ¬μ©ν μ μμ§λ§ κ°μ΄ λμΌνμ§ μκΈ° λλ¬Έμ μ€μνμ§ μμ΅λλ€.
μ΄κ²μ νλͺ ν©λλ€. μ¬μ ν μμ μ΄λ¦μ μ¬λμ΄ μ½μ μμλ λΆλΆμ μ μ§νκ³ μΆμ§λ§ κ³ μ ν μ λμ¬λ₯Ό μμ±νλ©΄ μμ ν μλν©λλ€.
λ¬Όλ‘ κ·Έλ€μ΄ λ
νΉνλ€λ κ²μ μ¦λͺ
ν μ μλ€λ©΄.
κ°μ₯ μ’μ λ°©λ²μ μ¬μ ν ββκΈ°μ‘΄ κ³ μ μ± κ³΅κΈμ (μ λλ©μΈ μ΄λ¦ λλ npm λͺ¨λ μ΄λ¦)λ₯Ό μ¬μ©νλ κ²μ
λλ€.
κ·μΉμ΄μλ λ€μ μ€νμ΄μ€λ λͺ¨λμ μμ±ν λ μ μ΄ ν μμλ λ€μν μ₯μμμ μ¬μ©ν μμλ κ²λ³΄λ€ μνν©λλ€.
ActionTypeμ΄ "Area"μΈ "Geometry"λͺ¨λμ΄ μλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. μ΄ λͺ¨λμ λ κ³³μμ μ¬μ©λ©λλ€.
μ΄μ λͺ¨λμ΄ μ¬μ©λλ μμΉμ λ°λΌ λ κ°μ μΆ©λνλ λ€μ μ€νμ΄μ€κ° μμ΅λλ€.
λ€μ ν¨ν΄μΌλ‘ μ€ννκ³ μμ΅λλ€.
λ€μμ ν¬ν¨νλ κ° μ»¬λ μ μ νμ λν dirμ λ§λλλ€.
λ€μ νμμΌλ‘ constλ₯Ό λ§λλλ€.
// song-store/song-store-consts.js
export const ADD = 'SONG_STORE.ADD'
export const REMOVE = 'SONG_STORE.REMOVE'
κ°μκΈ°, saga λλ μ‘μ
μμ μμλ₯Ό μ¬μ©ν λ import
λͺ¨λ *
:
// song-store/song-store-actions.js
import * as SONG_STORE from './song-store-consts'
export function addSongStore(name) {
return {
type: SONG_STORE.ADD,
name
}
}
export function removeSongStore(songStoreId) {
return {
type: SONG_STORE.REMOVE,
songStoreId
}
}
μ¬νκ²λ λ무 νλ€κΈ°μλ μ’μ§ μμ΅λλ€. ES6κ° νμ©νλ€λ©΄ μ’μ κ²μ λλ€.
import { ADD, REMOVE } as SONG_STORE from './song-store-actions'
Webpack 2κ° μ§λ₯μ μΌλ‘ import *
νΈλ¦¬ μμ΄νΉ ν μ μλμ§ λꡬλ μ§ μκ³ μμΌλ―λ‘ *
κ°μ Έμ¨ κ²½μ°μλ μ¬μ©λμ§ μλ λ΄λ³΄λ΄κΈ° μ½λλ₯Ό λ²λ€λ‘ μ 곡νμ§ μμ΅λλ€.
μ΄κ²μ λ§€μ° μΌλ°μ μΈ λ¬Έμ λ‘ λ³΄μ΄λ©° λ€μκ³Ό κ°μ κ²½μ° μ¬λ¬΄μ€μμ μμ£Ό λ°μν©λλ€.
μ°λ¦¬λ λͺ κ°μ§ λ€λ₯Έ ν΄κ²°μ± μ μλνμ§λ§ μ무κ²λ λΆμ§ μλ κ²μ²λΌ 보μμ΅λλ€.
μ§λ λͺ λ¬ λμ μ€ν ν ν μ°λ¦¬λ λλ ν 리 ꡬ쑰λ₯Ό μ¬μ©νμ¬ μ‘μ
μ νμ λ€μ μ€νμ΄μ€λ₯Ό μ§μ νκΈ°λ‘ κ²°μ νμ΅λλ€. μλμΌλ‘ μ
λ ₯νλ κ²μ μ λ§ λΉ¨λ¦¬ λμ΄ κ°κΈ° λλ¬Έμ __filename
λκ°λ₯Ό μλνμ§λ§ μ½λ λ²λ€λ§ λ±μΌλ‘ μΈν΄ μλνμ§ μμ΅λλ€. κ·Έλ° λ€μ ν€μλ __filenamespace
λ₯Ό λ³ννλ 첫 λ²μ§Έ Babel νλ¬κ·ΈμΈ μ λ§λ€μμ΅λλ€ __filenamespace
λ₯Ό μ μ λ¬Έμμ΄λ‘ λ³ννλ©΄ μ μλνλ κ² κ°μ΅λλ€.
App/testerAccount/index.js
:
// Something like this
const ADD_VIDEO_UPLOAD = `${__filenamespace}/ADD_VIDEO_UPLOAD`;
const ADD_COMMENT = `${__filenamespace}/ADD_COMMENT`;
// Will be transformed into something like this
const ADD_VIDEO_UPLOAD = 'App/testerAccount/ADD_VIDEO_UPLOAD';
const ADD_COMMENT = 'App/testerAccount/ADD_COMMENT';
μμ λ‘κ² μ¬μ©ν΄λ³΄μΈμ. μ μ©νκΈ°λ₯Ό λ°λλλ€. νΉν μ΄μ μμ±μμ΄μ λΌμ΄λΈλ¬λ¦¬ μμ±μ μΈ @pbc λλ @gaearon μΌλ‘λΆν° νΌλλ°±μλ°λ κ²μ νμμ μΌ κ²μ λλ€.
λλ λκ΅°κ°κ° "νμ€"μ μ μνκΈ°λ₯Ό μ λ§λ‘ λ°λΌκ³ μμλ€. μ΄λ₯Ό μν΄ κΈ°νΈ λ κ°μ²΄κ° νμνμ§ μμ΅λλ€. κ·μΉ λ§ μμΌλ©΄λ©λλ€.
"featureName$actionType"
λλ "fileName/ACTION_TYPE"
λλ "PROJECT.FEATURE.ACTION"
νμκ² μ΅λκΉ? μ°λ¦¬ λͺ¨λκ° λμ ν μ μλ€λ©΄ κ°μκΈ°λ₯Ό 곡μ νλ κ²μ΄ λ μ¬μΈ κ²μ
λλ€.
λ€λ₯Έ μ¬μ© κ°λ₯ν κ·μΉμ΄ λΆμ‘±νμ¬ Ducks κ° μ¬μ€μμ νμ€μ΄ λ κ² κ°μ΅λλ€.
const ACTION = 'app/feature/ACTION';
μΆ©λΆν©λλ€.
@gaearon μ νμ μ‘μ
κ³Ό 리λμ μ¬μ΄μ 1 : 1 κ΄κ³κ° μλ§λ λμ μκ°μ΄λΌκ³ μΈκΈνμΌλ©° μ λ§ λμν©λλ€. κ·Έλ¬λ λ κ°μ λ€λ₯Έ λ·°κ° μ€μ λ‘ λμΌν κ°μκΈ°λ₯Ό νΈμΆνλ €λ κ²½μ°λ μ΄λ»μ΅λκΉ?
μλ₯Ό λ€μ΄. κ°λ¨ν νκ²½ μ€μ ν κΈμ λ κ³³μμ νμ±ν λλ λΉνμ±ν ν μ μμ΅λλ€.
/ myaccount / toggleNotification
/ dashboard / toggleNotification
λ°λΌμ λμΌν λ΄μ©μΌλ‘ μμ±λ λ κ°μ κ°μκΈ°κ° μμ΄μΌν©λλ€.
reducers / notifications.js
μ°Έμ‘° : @ samit4me , @philholden
λ€λ₯Έ μκ°μΌλ‘, μ΄κ²μ λ€λ₯Έ μμ
μ΄λ¦μΌλ‘ λμΌν μμ
μ μννλ νμΌ λ΄μ λ κ° μ΄μμ κ°μκΈ°λ₯Ό κ°λ κ²μ΄ μ’μ μκ°μ΄λΌκ³ μκ°ν©λλ€. μ΄κ²μ κ°μκΈ°λ₯Ό 보λ κ²λ§μΌλ‘λ μΌλ§λ λ§μ κ³³μμ νΉμ μνκ° μμ λκ³ μλμ§ μ΄ν΄ν μμλ λ°©λ²μ
λλ€.
μ΄μ¨λ μ λ¬Έκ°μ μ견μ λ£κ³ μΆμ΅λλ€. κ°μ¬.
@ivks : μ¬κΈ°μ λͺ κ°μ§ μκ°μ΄ μμ΅λλ€.
첫째, μμ© νλ‘κ·Έλ¨ λ΄μ μ¬λ¬ μμΉμμ λμΌν μμ μ μ λ¬ν μ μμ΅λλ€.
λμ§Έ, λμΌν κ°μκΈ°κ° μ¬λ¬ μμ μ νμ μμ νκ³ λμΌν λ°©μμΌλ‘ μ²λ¦¬ ν μ ββμμ΅λλ€.
μ μ§Έ, "1 : 1 κ΄κ³"μΈ‘λ©΄μ κ°κ°μ μν λΉνΈλ₯Ό λ 립μ μΌλ‘ μ λ°μ΄νΈνλ λμΌν μμ μ μμ νλ μ¬λ¬ μ¬λΌμ΄μ€ κ°μκΈ°λ₯Ό κ°μ§ μ μλ€λ κ²μ λλ€. μ, λλΆλΆμ κ²½μ° μ£Όμ΄μ§ μμ μ μ²λ¦¬νλ κ°μκΈ°κ° νλλΏ μΌ μ μμ§λ§ μ¬λ¬ κ°μκΈ°κ° μλ΅νλ κ²μ Reduxμ μλ λ μ¬μ© μ¬λ‘μ λλ€.
λΏ‘ λΉ΅λ¨
λμ§Έ, λμΌν κ°μκΈ°κ° μ¬λ¬ μμ μ νμ μμ νκ³ λμΌν λ°©μμΌλ‘ μ²λ¦¬ ν μ ββμμ΅λλ€.
λλ μ€μ λ‘ redux-actionsλ₯Ό μ¬μ©νκ³ μμμΌλ©° μμ
μ μννλ μ νΈλ¦¬ν° λ©μλ combineActionμ΄ μλμ§ λͺ°λμ΅λλ€. λ°©κΈ κ·Έκ²μ μ°Ύμκ³ μμ μ§μ μ λκ°μ κ²μ μΈκΈν©λλ€. (λ λͺ
ν νμ΄μΌ νμ΄, λ―Έμν΄)
λ΅μ₯ ν΄μ£Όμ
μ κ°μ¬ν©λλ€.
λλ Ducks κ° ActionTypesμμ μ¬λ°λ₯΄κ² μ μνλ€κ³ μκ°νμ§ μμ΅λλ€.
npm-module-or-app / reducer / ACTION_TYPE νμμ μμ μ νμ΄ μμ΄μΌν©λλ€.
κ·Έ μ΄μ λ νλ μ΄μμ 리λμκ° νλμ μ‘μ
μ ꡬλ
ν μ μκΈ° λλ¬Έμ
λλ€. @mherodevκ° λ§νλ―μ΄ const ACTION = 'app/feature/ACTION';
μ΄ λ ν©λ¦¬μ μ΄λ©° μΆκ°λ‘ const ACTION = 'action://app/feature/ACTION';
μμ
μ λν μ€ν€λ§ λ₯Ό
μ‘μ μ νμ μλ³νκΈ° μν΄ κΈλ‘λ² μ체 μ¦λΆ μ μλ₯Ό μ¬μ©νμ§ μλ μ΄μ λ 무μμ λκΉ? μ
let id = 0
function generateActionType (label /* for readability */) {
id++
return `app/feature/${id}/${label}`
}
μ΄κ²μ λν΄ μ‘°κΈ μκ°νκ³ , λ€λ₯Έ κ°λ°μμ μΆ©λνμ§ μλλ‘ λ¦°νΈ κ·μΉμ μμ±νκ³ μμ΅λλ€.μ΄ κ·μΉμ λλ ν 리λ₯Ό μ‘°μ¬ν©λλ€ (λͺ¨λ 리λμκ° μκ³ κ° λ¦¬λμμλ μ체 μμ μ νμ΄ μμλ‘ μμ).
λμΌν κ°μ κ°μ§ λ κ°μ μμκ°μλ κ²½μ° μλ°μλ³΄κ³ νλλ‘ lintingμ κ³ννκ³ μμ΅λλ€.
μ μμ΄ μμΌμλ©΄ μλ €μ£ΌμΈμ :)
κ°μ₯ μ μ©ν λκΈ
λ¬Έμμ΄μ λ³Έμ§μ μΌλ‘ λ€μ μ€νμ΄μ€μ λμμ§ μμ΅λλ€. URLμ λ¬Έμμ΄μ΄λ©° μ λλ‘ μλνλ κ² κ°μ΅λλ€.