मैं चाहूंगा कि उपयोगकर्ता टूडू आइटम की एक सूची को सॉर्ट करने में सक्षम हो। जब उपयोगकर्ता ड्रॉपडाउन से किसी आइटम का चयन करता है, तो यह सेट हो जाएगा, sortKeyजो नए संस्करण का निर्माण करेगा setSortedTodosऔर बदले में useEffectकॉल और कॉल को ट्रिगर करेगा setSortedTodos।
नीचे दिए गए उदाहरण ठीक उसी तरह से काम करते हैं जैसे मैं कैसे चाहता हूं, हालांकि एस्लिंट मुझे निर्भरता सरणी में जोड़ने के todosलिए प्रेरित कर useEffectरहा है, और अगर मैं ऐसा करता हूं तो यह एक अनंत लूप का कारण बनता है (जैसा कि आप उम्मीद करेंगे)।
const [todos, setTodos] = useState([]);
const [sortKey, setSortKey] = useState('title');
const setSortedTodos = useCallback((data) => {
const cloned = data.slice(0);
const sorted = cloned.sort((a, b) => {
const v1 = a[sortKey].toLowerCase();
const v2 = b[sortKey].toLowerCase();
if (v1 < v2) {
return -1;
}
if (v1 > v2) {
return 1;
}
return 0;
});
setTodos(sorted);
}, [sortKey]);
useEffect(() => {
setSortedTodos(todos);
}, [setSortedTodos]);
लाइव उदाहरण:
मुझे लगता है कि ऐसा करने का एक बेहतर तरीका होना चाहिए जो कि खुश रहना चाहता है।
eslintफेंक रहा है?
[<>]? जेएसएक्स सहित स्टैक स्निपेट्स रिएक्ट का समर्थन करते हैं; यहाँ एक कैसे करना है । इस तरह से लोग यह देख सकते हैं कि उनके प्रस्तावित समाधानों में अनंत लूप की समस्या नहीं है ...
todosनिर्भरता सरणी में जोड़ने की आवश्यकता है useEffect, और आप देख सकते हैं कि आपको क्यों नहीं करना चाहिए। :-)
sortकॉलबैक सिर्फ हो सकता है:return a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());जिसे लोकल की तुलना करने का फायदा है, अगर पर्यावरण के पास उचित स्थानीय जानकारी है। यदि आप चाहें, तो आप इस पर भी विनाश कर सकते हैं: pastebin.com/7X4M1XTH