reactjs - საფუძვლიანი redux კონცეფცია - როგორ აწარმოონ reducers აქციებით


ხრიკების გასაგებად გაითვალისწინეთ ეს ორი რედიუსერი (ჩაწერილია TypeScript-ში):

export type userActionTypes = 
    | Interface1
    | Interface2

const initialState1 =  {...//some state} //<--comment indicates some sort of values are present
const initialState2 =  {...//some state}

const reducer1 = (state = initialState1, action: userActionTypes){
    switch(action.type) {
        case action1.case1:
            return {...//some new state1}
        default: return state
    }
}

const reducer2 = (state = initialState2, action: userActionTypes){
    switch(action.type){
        case action2.case2:
            return {...//some new state1}
        default: return state
    }
}

const rootReducer = combineReducers({
    mReducer1: reducer1,
    mReducer2: reducer2
})

ახლა თქვით სადმე, ჩვენ ჩვენს კოდში ვიხმობთ შემდეგს:

newAction = {type: action2.type2, //some other values}
dispatch(newAction);

**ჩემს კითხვას ეხება:** როგორ იცის React-მა, რომელი reducer უნდა შეიძინოს? ვგულისხმობ, რომ ის არ აწვდის action-ს ყველა reducer-ს rootReducer-ში, ხომ არა? ვგულისხმობ, რომ თუ ასე იქნებოდა, მაშინ ყველა default case უსარგებლო იქნებოდა და case გამოთქმებში ყველა case უნიკალური უნდა ყოფილიყო. ეს ხომ შეუძლებელი არ არის, არა?
როგორ იცის React-მა, რომელი reducer უნდა შეიძინოს?

პასუხი #1

როგორ იცის react-ს, რომელი reducer უნდა გამოიძახოს? ჩემი აზრით, ის არ გადასცემს აქციას ყველა reducer-ს, რომელიც rootReducer-შია, ხო?

სწორი კითხვა, რეალურად redux აღინიშნება ყველა თქვენი reducer-ის მოსაპოვებლად.

გაითვალისწინეთ თქვენი ძირითადი რედიუსერი:

const rootReducer = combineReducers({
  mReducer1: reducer1,
  mReducer2: reducer2
})

ეს ქმნის რედუსერების ფუნქციების ხეს. როდესაც მოქმედება იგზავნება მაღაზიაში, ის იხმობს ძირითადი რედუსერს და გადასცემს მიმდინარე state-ს და მიმდინარე action-ს. რედუსერები, მათი მხრივ, რეკურსიულად იხმობენ შემოწირულ კომბინირებულ რედუსერებს, გადასცემენ state-ს და action-ს მანამ, სანამ არ მიაღწევენ ფოთოლს, სადაც შეხვდებით რედუსერის ფუნქციას და გამოითვლება მათი შემდეგი სტატუსი. ისინი ან ქეისს ატარებენ action-ის დასამუშავებლად ან აბრუნებენ სტანდარტულ ქეისს, რომელიც უბრალოდ მათი მიმდინარე სტატუსია. რეკურსია უკან ბრუნდება, აბრუნებს თითოეულ შემდეგი სტატუსის ნაჭერს, კომბინირდება თითოეულ დონეზე, სანამ დაბრუნდებით ძირითადი რედუსერისკენ, რომელიც აბრუნებს მთელს შემდეგ სტატუსის ობიექტს.

რაც გინდა თქვას, ეს თუ ასეა, მაშინ თითოეული default შემთხვევა შეუფასებელი გახდება და case განცხადებების თითოეული შემთხვევა უნიკალური უნდა იყოს. ეს შეუძლებელია, ხომ არა?

გახსოვდეთ, რომ თითოეული reducer ფუნქცია მუშაობს მხოლოდ თავისი მცირე ნაწილით მდგომარეობის, არა მთელი state ობიექტით. ნაგულისხმევი შემთხვევა არსებობს იმისთვის, რომ reducer გამოიტანოს თავისი მიმდინარე მდგომარეობა, რადგან მას არაფერი უნდა გააკეთოს. ყველა reducer შემთხვევა reducer ფუნქციაში უნდა იყოს უნიკალური. თუ ორი ქმედება იწვევს ერთსა და იმავე მდგომარეობის განახლებას, ისინი უნდა იყოს გაერთიანებული.

case "case1":
case "case13":
  // both cases apply the same update