2015-10-29 12 views
9

मैंने रेडक्स के साथ रेडक्स का उपयोग करना शुरू कर दिया है और मैं बिल्कुल इसे प्यार करता हूं। हालांकि, वर्तमान में मेरी समस्या यह है कि राज्य के अलावा, मेरे पास भी अधिक जानकारी है जो मुझे अपने पूरे एप्लिकेशन में स्टोर/उपयोग करने की आवश्यकता है।मॉडलों के साथ रेडक्स का उपयोग

इस विशिष्ट मामले में मेरे पास एक एपीआई से प्राप्त राज्य के साथ एक मॉडल है। इस मॉडल में स्वयं के बारे में कुछ जानकारी भी है, उदा। आप "name" => "blabla का नाम" पर एक संपत्ति कैसे प्रदर्शित करते हैं। मैं समझता हूं कि रेडक्स का उपयोग करके राज्य के साथ कैसे काम करना है, लेकिन मुझे यह देखने में परेशानी है कि इस अन्य जानकारी के साथ क्या करना है जिसे मुझे अभी भी पूरे एप्लिकेशन में प्रसारित करने की आवश्यकता है लेकिन वास्तव में यह स्थिति नहीं है।

+0

पहली नज़र में, जो मेरे लिए राज्य की तरह लगता है। राज्य में 'नाम' डालने के लिए आपको क्या आपत्ति है? –

+0

नाम ही वास्तव में राज्य है, हालांकि उस नाम की संपत्ति का "लेबल" राज्य नहीं है। यह मॉडल में गुणों के बारे में जानकारी है। –

+0

यदि नाम के "लेबल" को किसी घटक में प्रोप के रूप में उपयोग किया जाता है, तो मैं कहूंगा कि यह राज्य है। –

उत्तर

11

रेडक्स के अनुसार, राज्य एकमात्र "सत्य का स्रोत" है। और इसमें डुप्लिकेशन नहीं होना चाहिए (जो विसंगतियों का कारण बनता है)।

तो आपके राज्य को name स्टोर करना चाहिए, लेकिन गणना लेबल संपत्ति नहीं है।

दरअसल, "ब्लैब्ला का नाम" आपके नाम मूल्य के एक फ़ंक्शन (गणितीय अर्थ में) है, और यदि वे भिन्न हैं (उदाहरण के लिए, यदि किसी बिंदु पर === 'foo' पर लेबल है लेकिन लेबल ' 'Foo का नाम' के बजाय 'बार का नाम'), तो आपको एक समस्या है ...

तो मैं क्या करूँगा, बस अपने राज्य (उस मामले में नाम) में न्यूनतम स्टोर करें, और गणना करें सीधे घटक में लेबल, जहां आपको इसकी आवश्यकता है।

यदि आपको फिर से उपयोग करने की आवश्यकता है, तो एक घटक बनाएं जो केवल अपना नाम प्रोप के रूप में लेता है, और "ब्लब्बाबा का नाम" (यदि नाम = blabla मुझे लगता है) के साथ एक स्ट्रिंग प्रस्तुत करें।

यदि आपको अधिक जटिल गणना की आवश्यकता है (कहें कि आपके पास एकाधिक लेबल, दिनांक गणना आदि हैं), तो आप हमेशा एक ऐसा फ़ंक्शन बना सकते हैं जो आपके राज्य को इनपुट में ले ले, और गणना में आपके "मॉडल" को आउटपुट में थकाएं।

Redux प्रकृति में बहुत कार्यात्मक है, इसलिए आप इसे भी गले लगाने सकता है :)

+0

मेरा मानना ​​है कि मैं इस दृष्टिकोण को पसंद करता हूं। –

+0

हम राज्य को अपने आप को एक अपरिवर्तनीय मॉडल क्यों नहीं दे सकते? – Nishant

6

मैं जानता हूँ कि मैं पार्टी के लिए की देर तरह कर रहा हूँ, लेकिन मैंने सोचा था कि किसी को जवाब का उपयोग हो सकता है।

  • राज्य:: जो संरचना सेट (या 'स्कीमा') के आंकड़ों के क्या अब तक अब कुछ वर्षों के लिए प्रतिक्रिया के साथ काम करने के बाद मुझे इस के लिए काम करते है एक संरचना एक तरह से इस तरह है कि है।
  • क्रियाएं: इस स्थिति में बदलाव करें। ये क्रियाएं सिंक या एसिंक ऑपरेशंस को संभाल सकती हैं।
  • सागा: वे async क्रियाओं को संभालते हैं।
  • चयनकर्ता: वे उस डेटा की संरचना को संभालते हैं जिसे मुझे दृश्य/एपीआई के लिए चाहिए।
  • स्थिरांक: अन्य डेटा जो समय के माध्यम से नहीं बदलेगा और इससे मेरे राज्य में जोड़ने का कोई मतलब नहीं है।

तो कहा कि मेरी क्षुधा के प्रवाह को कुछ इस तरह है: एक ACTION भेजा जाता है => कि कार्रवाई एक SAGA async है सुन रहा है और यह लाने कार्रवाई निष्पादित => इस गाथा अपडेट करने के लिए बचाता है STATE => [अब से घटकों की परत परत] => यदि मेरे दृश्य को किसी भिन्न प्रारूप में मेरे राज्य से डेटा की आवश्यकता है, तो मैं इसे SELECTOR के माध्यम से भेजता हूं जो उस प्रारूप को बदल देगा => फिर मैं इस नए पार्स किए गए डेटा को संलग्न करता हूं मेरा कंटेनर घटक।

एक अन्य प्रवाह एक ऐसा हो सकता है जिसमें आपको स्थिर डेटा की आवश्यकता हो जो आपके state में नहीं है। इस कारण से मैं इसे किसी ऑब्जेक्ट में एक अलग फ़ाइल में सहेजता हूं और इसे सीधे मेरे कंटेनर घटक में आयात करता हूं (मैं अपने बच्चों/प्रस्तुति घटकों में सीधे कुछ भी आयात नहीं करता हूं। केवल अन्य घटक। डेटा को एक अलग परत में संभाला जाता है अवयव)।

एक तीसरा प्रकार का प्रवाह जो मैं अभी सोच सकता हूं वह तब होता है जब आपको अपने एपीआई में पोस्ट करने की आवश्यकता होती है और किसी भी कारण से ऐसा करने से पहले आपके राज्य में डेटा को कुछ पार्सिंग की आवश्यकता होती है। उस स्थिति में मैं वही करूँगा जो पहले उदाहरण में है लेकिन दूसरी तरफ: ACTION => को प्रेषित करने के लिए SAGA => द्वारा प्रबंधित किया जाता है, मैं अपने डेटा के लिए पहले से ही संरचित डेटा लाऊंगा (सगाओं में एक है चयनकर्ताओं का उपयोग करने में आपकी सहायता के लिए select नामक विधि) => तो मैं async ऑपरेशन => तदनुसार राज्य को अपडेट करूंगा।

बस मामले में आप नहीं जानते कि मैं चयनकर्ताओं या कहानियों की कुछ लिंक मतलब:

1

मुझे लगता है कि मॉडल के रूप में आवश्यक हैं किसी भी अन्य सिस्टम के लिए एक Redux आधारित ऐप के लिए।

मॉडल सिस्टम की शब्दावली हैं। मॉडल कोडबेज में सैनिटी लाते हैं। उनके बिना एक कोडबेस पागल विकृत विचारों की एक श्रृंखला की तरह दिखता है।

आप ReactJS + Redux ऐप्स में मॉडलों की आवश्यकता को भरने के लिए राज्य कार्यों का उपयोग कर सकते हैं। मॉडल जैसे डेटा और विधियों को पकड़ते हैं, इन ऑब्जेक्ट्स केवल उन कार्यों को पकड़ते हैं जिन्हें राज्य पर लागू किया जा सकता है।

यहां पढ़ें: https://medium.com/@nshnt/state-functions-for-modeling-with-redux-a9b9d452a631

todo_reducer.js:

import TODO from './todo_state'; 

const todoListReducer = (state=TODO.initialState(), action)=>{ 
    switch(action.type){ 

    case 'ADD_TODO' : 
     return TODO.addTask(state, action.taskName); 

    case 'FINISHED_TODO': 
     return TODO.setFinished(state, action.taskID); 

    case 'PENDING_TODO': 
     return TODO.setPending(state, action.taskID); 

    default : 
     return state; 
    } 
}; 

export default todoListReducer; 

कार्य करने-state.js:

export default { 
    initialState:() => [], 

    addTask: (todoList, name)=> todoList.concat({id: todoList.length, name: name}), 

    setFinished: (todoList, taskId) => (
     todoList.map(task=> task.id === taskId ? {...task, complete: true} : task) 
), 

    setPending: (todoList, taskId) => (
     todoList.map(task=> task.id === taskId ? {...task, complete: false} : task) 
), 

    pending: todoList=> todoList.filter(task=> !task.complete) 

}; 

मैं भी

यहाँ राज्य कार्यों के साथ प्रसिद्ध Redux TODO अनुप्रयोग उदाहरण है घटक में इन राज्य कार्यों का उपयोग करें, अगर घटक को राज्य के कुछ हेरफेर की आवश्यकता है।

todo_list.js:

import React from 'react'; 
import {connect} from 'react-redux'; 
import TODO from './todo_state'; 

const TodoList = ({tasks, showCompletedTasks, toggleTodo})=> { 
    const toListElement = (task) => (
     <li key={task.id}> 
     <input type="checkbox" checked={task.complete} onChange={(e)=> toggleTodo(task)}/> 
     <label>{task.name} {task.complete ? "Complete" : "Pending"}</label> 
     </li> 
); 
    const visibleTaskList = 
     (showCompletedTasks ? tasks 
     : TODO.pending(tasks)).map(toListElement); 

    return (
     <ul className="todo-list"> 
     {visibleTaskList} 
     </ul> 
); 
} 
..... 
export default connect(mapStateToProps, mapDispatchToProps)(TodoList); 
संबंधित मुद्दे