मैं चाहूंगा कि उपयोगकर्ता टूडू आइटम की एक सूची को सॉर्ट करने में सक्षम हो। जब उपयोगकर्ता ड्रॉपडाउन से किसी आइटम का चयन करता है, तो यह सेट हो जाएगा, 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