ฉันต้องการให้ผู้ใช้สามารถเรียงลำดับรายการสิ่งที่ต้องทำ เมื่อผู้ใช้เลือกรายการจากเมนูแบบเลื่อนมันจะตั้งค่าsortKeyซึ่งจะสร้างรุ่นใหม่setSortedTodosและในทริกเกอร์เปิดและโทรuseEffectsetSortedTodos
ด้านล่างนี้เป็นตัวอย่างการทำงานว่าฉันต้องการ แต่ eslint จะแจ้งให้ฉันเพื่อเพิ่มtodosไปยังuseEffectอาร์เรย์ dependancy และถ้าผมทำมันทำให้เกิดห่วงอนันต์ (ตามที่คุณคาดว่าจะได้)
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 มีความสุข
eslintการขว้างปา?
[<>]ปุ่มแถบเครื่องมือ)? Stack Snippets รองรับ React รวมถึง JSX; นี่เป็นวิธีการอย่างใดอย่างหนึ่ง ด้วยวิธีนี้ผู้คนสามารถตรวจสอบได้ว่าวิธีแก้ปัญหาที่เสนอของพวกเขาไม่มีปัญหาวนวนไม่สิ้นสุด ...
todosในอาร์เรย์ที่พึ่งพาuseEffectและคุณสามารถดูว่าทำไมคุณไม่ควร :-)
sortโทรกลับสามารถทำได้เพียง:return a[sortKey].toLowerCase().localeCompare(b[sortKey].toLowerCase());ซึ่งมีข้อดีของการทำโลแคลเปรียบเทียบหากสภาพแวดล้อมมีข้อมูลโลแคลที่สมเหตุสมผล ถ้าคุณชอบคุณสามารถทำลายมันได้เช่นกัน: pastebin.com/7X4M1XTH