क्या Redux सिर्फ वैश्विक राज्य का महिमामंडन नहीं कर रहा है?


84

इसलिए मैंने एक सप्ताह पहले ही रिएक्ट सीखना शुरू कर दिया था और मुझे अनिवार्य रूप से राज्य की समस्या के बारे में पता चला और घटकों को बाकी ऐप के साथ संवाद करना चाहिए। मैंने चारों ओर खोज की और Redux को महीने का स्वाद प्रतीत हो रहा है। मैं सभी प्रलेखन के माध्यम से पढ़ा और मुझे लगता है कि यह वास्तव में एक बहुत ही क्रांतिकारी विचार है। इस पर मेरे विचार हैं:

राज्य आमतौर पर बहुत बुराई और प्रोग्रामिंग में बग का एक बड़ा स्रोत होने के लिए सहमत है। अपने पूरे ऐप में इसे बिखरने के बजाय Redux कहता है कि क्यों न यह सब एक वैश्विक राज्य वृक्ष में केंद्रित हो गया है जिसे बदलने के लिए आपको क्रियाओं का उत्सर्जन करना होगा? दिलचस्प लगता है। सभी कार्यक्रमों को राज्य की आवश्यकता होती है तो चलो इसे एक अशुद्ध स्थान पर चिपका दें और केवल इसे वहां से संशोधित करें ताकि बग को ट्रैक करना आसान हो। फिर हम प्रतिक्रियाशील घटकों के लिए व्यक्तिगत रूप से अलग-अलग राज्य के टुकड़े भी बांध सकते हैं और उन्हें ऑटो-रिड्रा कर सकते हैं और सब कुछ सुंदर है।

हालाँकि, इस पूरे डिज़ाइन के बारे में मेरे दो सवाल हैं। एक के लिए, राज्य वृक्ष को अपरिवर्तनीय होने की आवश्यकता क्यों है? कहो कि मैं समय यात्रा डिबगिंग, हॉट रीलोड के बारे में परवाह नहीं करता हूं, और अपने ऐप में पूर्ववत / फिर से लागू कर चुका हूं। ऐसा करना इतना बोझिल लगता है:

case COMPLETE_TODO:
  return [
    ...state.slice(0, action.index),
    Object.assign({}, state[action.index], {
      completed: true
    }),
    ...state.slice(action.index + 1)
  ];

इसके अलावा:

case COMPLETE_TODO:
  state[action.index].completed = true;

उल्लेख नहीं करने के लिए मैं सिर्फ सीखने के लिए एक ऑनलाइन व्हाइटबोर्ड बना रहा हूं और प्रत्येक राज्य परिवर्तन कमांड सूची में ब्रश स्ट्रोक जोड़ने के रूप में सरल हो सकता है। थोड़ी देर (सैकड़ों ब्रश स्ट्रोक) के बाद इस पूरे सरणी को डुप्लिकेट करना बहुत महंगा और समय लेने वाला बन सकता है।

मैं एक वैश्विक राज्य वृक्ष के साथ ठीक हूं जो कि यूआई से स्वतंत्र है जो कार्यों के माध्यम से उत्परिवर्तित है, लेकिन क्या वास्तव में अपरिवर्तनीय होने की आवश्यकता है? इस तरह के एक साधारण कार्यान्वयन में क्या गलत है (बहुत मोटा मसौदा? 1 मिनट में लिखा गया)।

var store = { items: [] };

export function getState() {
  return store;
}

export function addTodo(text) {
  store.items.push({ "text": text, "completed", false});
}

export function completeTodo(index) {
  store.items[index].completed = true;
}

यह अभी भी एक वैश्विक राज्य वृक्ष है जो उत्सर्जित क्रियाओं के माध्यम से उत्परिवर्तित होता है लेकिन अत्यंत सरल और कुशल है।


2
"एक के लिए, राज्य के पेड़ को अपरिवर्तनीय होने की आवश्यकता क्यों है?" --- तब आपको यह निर्धारित करने के लिए एक एल्गोरिथ्म प्रदान करना होगा कि क्या डेटा बदल गया है। एक मनमाना डेटा संरचना के लिए इसे लागू करना संभव नहीं है (यदि यह परिवर्तनशील है)। बॉयलरप्लेट को कम करने के लिए ले लो immutablejsऔर उपयोग return state.setIn([action.index, 'completed'], true);करें।
झटके

1
पुनश्च:return state.map(i => i.index == action.index ? {...i, completed: true} : i);
zerkms

जवाबों:


52

क्या Redux सिर्फ वैश्विक राज्य का महिमामंडन नहीं कर रहा है?

निश्चित रूप से यह है। लेकिन आपके द्वारा उपयोग किए जाने वाले प्रत्येक डेटाबेस के लिए समान होल्ड है। Redux को इन-मेमोरी डेटाबेस के रूप में व्यवहार करना बेहतर है - जो आपके घटक प्रतिक्रियात्मक रूप से निर्भर कर सकते हैं।

किसी भी उप-पेड़ को बहुत ही कुशल बदल दिया गया है, क्योंकि यह एक पहचान की जाँच के लिए नीचे सरलीकृत कर देता है।

हां, आपका कार्यान्वयन कुशल है, लेकिन पूरे आभासी डोम को हर बार पेड़ को किसी तरह से हेरफेर करने के लिए फिर से प्रस्तुत करना होगा।

यदि आप रिएक्ट का उपयोग कर रहे हैं, तो यह अंततः वास्तविक डोम के खिलाफ एक अंतर करेगा और न्यूनतम बैच-अनुकूलित जोड़तोड़ करेगा, लेकिन पूर्ण टॉप-डाउन री-रेंडरिंग अभी भी अक्षम है।

एक अपरिवर्तनीय पेड़ के लिए, स्टेटलेस घटकों को बस यह जांचना होगा कि क्या सबट्री (एस) यह निर्भर करता है, पिछले मूल्य (ओं) की तुलना में पहचान में भिन्नता है, और यदि ऐसा है - तो रेंडरिंग को पूरी तरह से टाला जा सकता है।


3
हालांकि यह समय से पहले अनुकूलन का एक सा नहीं है? इसके अलावा, हम कैसे जानते हैं कि अपरिवर्तनीय वस्तुओं को लगातार डुप्लिकेट करने की लागत डोम को फिर से प्रदान करने से कम है (यह भी प्रतिक्रिया के वर्चुअल डोम इस लागत को बहुत कम नहीं करेगा?)
रयान पेस्केल

3
खैर, GUI इस तरह के अनुकूलन को लंबे समय तक लाइब्रेर करता है (संदर्भ: bitquabit.com/post/the-more-things-change ) प्लस एक अपरिवर्तनीय डेटा संरचना का प्रबंधन उतना महंगा नहीं है जितना आप सोच सकते हैं - उदाहरण के लिए यदि एक नोड बदल जाता है, माता-पिता की केवल एक श्रृंखला को श्रृंखला की आवश्यकता होती है - बाकी नोड्स अप्रभावित रहते हैं। इसलिए हम हर कार्रवाई के लिए संपूर्ण डेटा संरचना की नकल नहीं कर रहे हैं - हम उन उप-घटकों का पुन: उपयोग करते हैं जो एक नया डेटा संरचना बनाने के लिए नहीं बदले हैं।
लोरफॉन

4
वर्चुअल डोम की प्रतिक्रिया भी बिल्कुल काला जादू नहीं है - रिएक्ट डॉक्स से कोटिंग: "एक पेड़ को दूसरे में बदलने के लिए न्यूनतम संख्या में संचालन उत्पन्न करना एक जटिल और अच्छी तरह से अध्ययन की गई समस्या है - कला एल्गोरिदम की स्थिति में एक जटिलता है। of O (n3) जहां n ट्री में नोड्स की संख्या है। "
लॉरफॉन

2
इसका कारण यह है कि रिएक्ट अभ्यास में बेहतर प्रदर्शन करने में सक्षम है क्योंकि: रिएक्ट अनुमानों पर निर्भर करता है - इसलिए: "यदि आप स्थिर कुंजी प्रदान नहीं करते हैं (उदाहरण के लिए Math.random () का उपयोग करके), तो सभी उप-पेड़ जा रहे हैं हर एक बार फिर से प्रस्तुत किया जा सकता है। उपयोगकर्ताओं को कुंजी चुनने का विकल्प देकर, उनके पास खुद को पैर में गोली मारने की क्षमता है। " जिस तरह आप स्थिर कुंजियों को प्रदान करके रिएक्ट की मदद कर सकते हैं, उसी तरह आप अपरिवर्तनीय डेटा प्रॉप्स प्रदान करके रिएक्ट की मदद कर सकते हैं।
लोरफेन

1
ब्रश स्ट्रोक के अपने सरणी के बारे में - कृपया देखें: facebook.github.io/immutable-js/docs/#/List डॉक्स से उद्धरण: सूचियाँ अनुक्रमित सघन संग्रह का आदेश देती हैं, एक जावास्क्रिप्ट ऐरे की तरह। सूचियाँ लागू होती हैं, दोनों अंत (पुश, पॉप) और शुरुआत (अपशिफ्ट, शिफ्ट) से कुशल जोड़ और हटाने के साथ।
लोरफॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.