টিএল; ডিআর
combineReducers()
বা অনুরূপ ম্যানুয়াল কোড ছাড়াই , হ্রাসকারীকে initialState
সর্বদা জয় করে state = ...
কারণ হ্রাসকারীর কাছে state
পাস হয় initialState
এবং হয় না undefined
, সুতরাং ES6 আর্গুমেন্ট সিনট্যাক্স এই ক্ষেত্রে প্রয়োগ হয় না।
সঙ্গে combineReducers()
আচরণ আরো nuanced হয়। যাদের হ্রাসকারীদের রাজ্য নির্দিষ্ট করা হয়েছে তারা initialState
তা গ্রহণ করবে state
। অন্যান্য হ্রাসকারীরা পাবেন undefined
এবং সে কারণেstate = ...
তারা নির্দিষ্ট করা ডিফল্ট যুক্তিতে ফিরে আসবে ।
সাধারণভাবে, initialState
হ্রাসকারক দ্বারা নির্দিষ্ট রাষ্ট্রের উপর জয়লাভ করে। এটি হ্রাসকারীদের প্রাথমিক ডেটা নির্দিষ্ট করতে দেয় যা তাদের ডিফল্ট আর্গুমেন্ট হিসাবে উপলব্ধি করে , তবে আপনি যখন কিছু ধ্রুবক স্টোরেজ বা সার্ভার থেকে স্টোরটি হাইড্রেট করছেন তখন বিদ্যমান ডেটা (সম্পূর্ণ বা আংশিক) লোড করার অনুমতি দেয়।
প্রথমে এমন একটি মামলা বিবেচনা করা যাক যেখানে আপনার একক রিডুসার রয়েছে।
বলুন আপনি ব্যবহার করবেন না combineReducers()
।
তারপরে আপনার রিডুসারটি দেখতে দেখতে এটির মতো হতে পারে:
function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT': return state + 1;
case 'DECREMENT': return state - 1;
default: return state;
}
}
এখন ধরা যাক আপনি এটির সাথে একটি দোকান তৈরি করেন।
import { createStore } from 'redux';
let store = createStore(counter);
console.log(store.getState());
প্রাথমিক অবস্থা শূন্য। কেন? কারণ দ্বিতীয় যুক্তি createStore
ছিল undefined
। এটি state
আপনার রিডুসারকে প্রথমবারের মতো পাস হয়েছে। যখন রেডাক্স সূচনা করে তখন এটি রাজ্য পূরণের জন্য "ডামি" ক্রিয়া প্রেরণ করে। সুতরাং আপনার counter
হ্রাসকারীকে state
সমান সাথে ডাকা হয়েছিল undefined
। এটি হ'ল ডিফল্ট যুক্তিটিকে "সক্রিয়" করে। সুতরাং, state
এখন 0
ডিফল্ট state
মান ( state = 0
) অনুসারে। এই রাষ্ট্রটি ( 0
) ফিরিয়ে দেওয়া হবে।
আসুন একটি ভিন্ন দৃশ্য বিবেচনা করুন:
import { createStore } from 'redux';
let store = createStore(counter, 42);
console.log(store.getState());
এবার কেন 42
, এবং না 0
? কারণ দ্বিতীয় যুক্তি হিসাবে createStore
ডাকা হয়েছিল 42
। এই যুক্তিটি state
ডামি অ্যাকশনের পাশাপাশি আপনার হ্রাসকারীর কাছে প্রেরণ হয়ে যায় । এবার, state
অপরিজ্ঞাত নয় (এটি 42
!), সুতরাং ES6 ডিফল্ট আর্গুমেন্ট সিনট্যাক্সের কোনও প্রভাব নেই। state
হয় 42
, এবং 42
হ্রাসকারক থেকে ফিরিয়ে দেওয়া হয়।
এখন আপনি যেখানে ব্যবহার করেন এমন একটি মামলা বিবেচনা করুন combineReducers()
।
আপনার দু'জন হ্রাসকারী রয়েছে:
function a(state = 'lol', action) {
return state;
}
function b(state = 'wat', action) {
return state;
}
উত্পাদিত হ্রাসকারকটি combineReducers({ a, b })
দেখতে দেখতে এরকম:
function combined(state = {}, action) {
return {
a: a(state.a, action),
b: b(state.b, action)
};
}
আমরা যদি কল createStore
ছাড়া initialState
, এটা আরম্ভ করতে যাচ্ছে state
করার {}
। অতএব, state.a
এবং state.b
হতে হবে undefined
সময় এটি কল দ্বারা a
এবং b
reducers। উভয় a
এবং b
হ্রাসকারী তাদের আর্গুমেন্ট undefined
হিসাবে গ্রহণ করবে এবং যদি তারা ডিফল্ট মান নির্দিষ্ট করে দেয় তবে সেগুলি ফিরিয়ে দেওয়া হবে। state
state
এইভাবে সম্মিলিত হ্রাসকারক { a: 'lol', b: 'wat' }
প্রথম অনুরোধে একটি রাষ্ট্রের বস্তুটি ফেরত দেয়।
import { createStore } from 'redux';
let store = createStore(combined);
console.log(store.getState());
আসুন একটি ভিন্ন দৃশ্য বিবেচনা করুন:
import { createStore } from 'redux';
let store = createStore(combined, { a: 'horse' });
console.log(store.getState());
এখন আমি initialState
যুক্তি হিসাবে উল্লেখ করেছি createStore()
। সম্মিলিত হ্রাসকারক থেকে ফিরে আসা রাষ্ট্রটি আমি হ্রাসকারীর জন্য নির্ধারিত প্রাথমিক অবস্থার সাথে ডিফল্ট আর্গুমেন্টের সাথে মিশ্রিত করে যা রেডিউসার নিজেই বেছে নিয়েছিল।a
'wat'
b
আসুন স্মরণ করা যাক সম্মিলিত হ্রাসকারী কী করে:
function combined(state = {}, action) {
return {
a: a(state.a, action),
b: b(state.b, action)
};
}
এই ক্ষেত্রে, state
নির্দিষ্ট করা হয়েছিল যাতে এটি পিছনে পড়ে না {}
। এটি a
সমান ক্ষেত্র সহ একটি বস্তু ছিল 'horse'
, তবে b
ক্ষেত্র ছাড়াই । এই কারণেই a
হ্রাসকারক এটি 'horse'
হিসাবে গ্রহণ করেছে state
এবং আনন্দের সাথে এটি ফিরিয়ে দিয়েছে, তবে b
রিডিউসারটি এটি undefined
হিসাবে পেয়েছে state
এবং এভাবেই এটি ডিফল্ট ধারণাটি ফিরে আসে state
(আমাদের উদাহরণে, 'wat'
)। এভাবেই আমরা বিনিময়ে পাই { a: 'horse', b: 'wat' }
।
সংক্ষিপ্তসার হিসাবে, আপনি যদি রেডাক্স কনভেনশনগুলিতে অবিচল থাকেন এবং হ্রাসকারীদের যখন তাদের যুক্তি undefined
হিসাবে ডাকা হবে তখন প্রাথমিক অবস্থাটি ফিরিয়ে আনুন state
(এটি বাস্তবায়নের সহজতম উপায় হল state
ES6 ডিফল্ট আর্গুমেন্ট মান নির্দিষ্ট করা ), আপনি যাচ্ছেন সম্মিলিত হ্রাসকারীদের জন্য একটি দুর্দান্ত দরকারী আচরণ। আপনি ফাংশনে যে initialState
বস্তুটি পাস করবেন তাতে তারা সংশ্লিষ্ট মানটিকে পছন্দ করবে createStore()
তবে আপনি যদি কোনওটি পাস না করেন, বা যদি সংশ্লিষ্ট ক্ষেত্রটি সেট না করা state
হয় তবে তার পরিবর্তে রিডুসার দ্বারা নির্দিষ্ট ডিফল্ট আর্গুমেন্টটি বেছে নেওয়া হবে।এই পদ্ধতিরটি ভালভাবে কাজ করে কারণ এটি বিদ্যমান ডেটার সূচনা এবং হাইড্রেশন উভয়ই সরবরাহ করে, তবে পৃথক হ্রাসকারীদের যদি তাদের ডেটা সংরক্ষণ না করা হয় তবে তাদের রাষ্ট্র পুনরায় সেট করতে দেয়। অবশ্যই আপনি এই প্যাটার্নটি পুনরাবৃত্তভাবে প্রয়োগ করতে পারেন, আপনি combineReducers()
অনেক স্তরে ব্যবহার করতে পারেন , এমনকি হ্রাসকারীদের কল করে এবং রাষ্ট্র গাছের প্রাসঙ্গিক অংশটি দিয়ে ম্যানুয়ালি হ্রাসকারীদের রচনা করতে পারেন ।
combineReducers
। আপনাকে আবার অনেক ধন্যবাদ।