আমি চাই যে ব্যবহারকারী টোড আইটেমগুলির একটি তালিকা বাছাই করতে সক্ষম হবে। ব্যবহারকারীরা যখন ড্রপডাউন থেকে কোনও আইটেম নির্বাচন করেন এটি সেট করে sortKeyযা এর নতুন সংস্করণ তৈরি করবে এবং ফলস্বরূপ কল এবং কলটি setSortedTodosট্রিগার করবে ।useEffectsetSortedTodos
নীচের উদাহরণটি ঠিক কীভাবে আমি চাই তা কাজ করে তবে এসলিন্ট আমাকে নির্ভরতা অ্যারেতে যুক্ত 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());পরিবেশে যুক্তিসঙ্গত লোকেল তথ্য থাকলে লোকাল তুলনা করার সুবিধাও রয়েছে। আপনি যদি পছন্দ করেন তবে এটিতেও কাঠামো