ฉันต้องการให้ผู้ใช้สามารถเรียงลำดับรายการสิ่งที่ต้องทำ เมื่อผู้ใช้เลือกรายการจากเมนูแบบเลื่อนมันจะตั้งค่าsortKey
ซึ่งจะสร้างรุ่นใหม่setSortedTodos
และในทริกเกอร์เปิดและโทรuseEffect
setSortedTodos
ด้านล่างนี้เป็นตัวอย่างการทำงานว่าฉันต้องการ แต่ 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