Mohamed Rahal نشر 24 سبتمبر 2023 أرسل تقرير نشر 24 سبتمبر 2023 لقد وضعت عداد في useEffact عن طريق usestate وهو شغال لكن هناك تحذير من أن render يعاد بكثرة في useEffact : ماهو الحل ؟ const [today, setToday]= useState({}); useEffect(()=>{ const t= moment(); setToday({time: t.format('hh:mm:ss a') , date: t.format('D/MMM/YYYY')}) },[moment(), timings]) return( <Row> <Col >{today.date}</Col> <Col >{today.time}</Col> </Row> ) 1 اقتباس
0 Adnane Kadri نشر 24 سبتمبر 2023 أرسل تقرير نشر 24 سبتمبر 2023 رسالة الخطأ تشرح نفسها، تحدث المشكلة عندما يكون هنالك متغير حالة يتم تجاوز قيمته في كل render داخل الخطاف useEffect، وفي نفس الوقت يتم إعادة تنفيذ الشيفرة ما داخل الخطاف useEffect كل مرة يتم فيها تغيير قيمته. الأمر الذي يحدث حلقة لا نهائية من التنفيذات. يمكنك تقييد عملية تحديث الحالة بناءا على الحالة السابقة: useEffect(() => { const t = moment(); setToday((prevToday) => { // تحديث الحالة بناءً على الحالة السابقة return { time: t.format('hh:mm:ss a'), date: t.format('D/MMM/YYYY'), }; }); }, [moment(), timings]); أيضا ان كان المتغير timings يتم تغييره هو الآخر بحسب قيمة today فستحتاج ازالته هو الآخر من مصفوفة الاعتماديات: useEffect(() => { const t = moment(); setToday((prevToday) => { // تحديث الحالة بناءً على الحالة السابقة return { time: t.format('hh:mm:ss a'), date: t.format('D/MMM/YYYY'), }; }); }, [moment()]); 1 اقتباس
0 Mohamed Rahal نشر 24 سبتمبر 2023 الكاتب أرسل تقرير نشر 24 سبتمبر 2023 بتاريخ 2 دقائق مضت قال Adnane Kadri: رسالة الخطأ تشرح نفسها، أين تحدث المشكلة عندما يكون هنالك متغير حالة يتم تجاوز قيمته في كل render داخل الخطاف useEffect، وفي نفس الوقت يتم إعادة تنفيذ الشيفرة ما داخل الخطاف useEffect كل مرة يتم فيها تغيير قيمته. الأمر الذي يحدث حلقة لا نهائية من التنفيذات. يمكنك تقييد عملية تحديث الحالة بناءا على الحالة السابقة: useEffect(() => { const t = moment(); setToday((prevToday) => { // تحديث الحالة بناءً على الحالة السابقة return { time: t.format('hh:mm:ss a'), date: t.format('D/MMM/YYYY'), }; }); }, [moment(), timings]); أيضا ان كان المتغير timings يتم تغييره هو الآخر بحسب قيمة today فستحتاج ازالته هو الآخر من مصفوفة الاعتماديات: useEffect(() => { const t = moment(); setToday((prevToday) => { // تحديث الحالة بناءً على الحالة السابقة return { time: t.format('hh:mm:ss a'), date: t.format('D/MMM/YYYY'), }; }); }, [moment()]); شكرا جزيلا اقتباس
0 Mustafa Suleiman نشر 24 سبتمبر 2023 أرسل تقرير نشر 24 سبتمبر 2023 مشكلة تحذير maximum update depth exceeded تحدث عندما يستدعي المكون setstate أكثر من 100 مرة في دورة حياة واحدة، وذلك عندما يكون المكون مرتبطًا بحدث أو مكون آخر يطلق تغييرات بشكل متكرر. وأنت تحصل على التحذير لأنك تستدعي setstate في كل مرة يتم فيها استدعاء useEffect، وذلك لأنك تربط useEffect بـ moment() و timings، حيث يتم تحديث moment() بشكل متكرر، مما يؤدي إلى استدعاء useEffect بشكل متكرر. وكحل بسيط استخدم useCallback لإنشاء دالة ثابتة من moment() و timings، من أجل تقليل عدد المرات التي يتم فيها استدعاء useEffect. import { useEffect, useState, useCallback } from 'react'; import { Col, Row } from 'react-bootstrap'; import moment from 'moment'; function Test() { const [today, setToday] = useState({}); const memoizedMoment = useCallback(() => moment(), []); // const memoizedTimings = useCallback(() => timings, []); useEffect(() => { const t = memoizedMoment(); setToday({ time: t.format('hh:mm:ss a'), date: t.format('D/MMM/YYYY'), }); }, [memoizedMoment]); return ( <Row> <Col>{today.date}</Col> <Col>{today.time}</Col> </Row> ); } export default Test; اقتباس
السؤال
Mohamed Rahal
لقد وضعت عداد في useEffact عن طريق usestate وهو شغال لكن هناك تحذير من أن render يعاد بكثرة في useEffact : ماهو الحل ؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.