اذهب إلى المحتوى

السؤال

نشر

قمت بإنشاء مكون pagination استنادًا إلى عدد السجلات المستلمة من الواجهة البرمجية API ، وهو يعمل بشكل جيد في حالة فشل الواجهة البرمجية أو عدم توفر أي استجابة، ولكن الصفحة تتعطل.

أتوقع أنه عندما لا تكون هناك استجابة من الواجهة البرمجية، يجب عرض رسالة خطأ في واجهة المستخدم تقول "لا توجد سجلات متاحة"، فحاليًا إذا فشلت الواجهة البرمجية، يصبح إجمالي عدد الصفحات المعرف داخل وظيفة paginationRange وآخر صفحة غير معرف والصفحة تتعطل.

const DepositRates = () => {
    const [nriRates, setNriRates] = useState([]);
    const [currentPage, setCurrentPage] = useState(1);
    const getNriRates = async () => {
        try {
            const res = await axios.get(`API_URL`, {

            })
            setNriRates(res?.data?.data);
        }
        catch (err) {
            console.log("nri rates ", err);
        }
    }
    useEffect(() => {
        getNriRates();
    }, []);
    const range = (start, end) => {
        let length = end - start + 1;
        return Array.from({ length }, (_, idx) => idx + start);
    };
    const paginationRange = () => {
        const totalPageCount = Math.ceil(nriRates.length / 10);
        return range(1, totalPageCount);
    }
    let lastPage = paginationRange()[paginationRange().length - 1]
    return (
        <>
            <table>
                <thead>
                    <tr>
                        <th>Bank Name</th>
                    </tr>
                </thead>
                <tbody>
                    {nriRates.slice((currentPage - 1) * 10, currentPage * 10)?.map(item =>
                        <tr>
                            <td>{item.BankName}</td>
                        </tr>)}
                </tbody>
            </table>
            <div className="pagination">
                {currentPage !== 1 &&
                    <a
                        style={{ cursor: "pointer" }}
                        onClick={() => setCurrentPage(currentPage - 1)}>
                        <i className="previous"></i>
                    </a>
                }
                {paginationRange().map((page) => {
                    return (
                        <a
                            style={{ cursor: "pointer" }}
                            onClick={() => setCurrentPage(page)}
                            className={currentPage === page ? "active" : ""} >
                            {page}
                        </a>
                    )
                })}
                {currentPage !== lastPage &&
                    <a
                        style={{ cursor: "pointer" }}
                        onClick={() => setCurrentPage(currentPage + 1)}>
                        <i className="next"></i>
                    </a>
                }
            </div>
        </>
    )
}

Recommended Posts

  • 0
نشر (معدل)
بتاريخ منذ ساعة مضت قال Abdelrahman Mostafa10:
const getNriRates = async () => {
        try {
            const res = await axios.get(`API_URL`, {

            })
            setNriRates(res?.data?.data);
        }
        catch (err) {
            console.log("nri rates ", err);
        }
    }
    useEffect(() => {
        getNriRates();
    }, []);

بالتأكيد عند فشل الواجهة البرمجية ستكون قيمة الكائن nriRates = undefined، لذلك حاول تغيير السطر التالي:

//setNriRates(res?.data?.data);

setNriRates(res?.data?.data || []);

هذا سيعود بمصفوفة فارغة في حالة لم يجد res أو data

ملحوظة أخرى ليس لها علاقة بالمشكلة الحالية ولكنها تهم كل من يستخدم الوجهات البرمجية api:

في أغلب الأحيان تعود الواجهة البرمجية باستجابة ولكن قد تكون الاستجابة قيمتها غير 200، مثل غير موجود (400)، لذلك قد يقع الكثير من المبرمجين في هذا الخطأ ويعتقد أن الواجهة عندما تفشل فإنه res سيكون غير معرف، ولكن أحيانًا تعود باستجابة 400 أو 500 نتيجة عدم تواجدها أو انشغال الخادم ومثل هذه المشاكل، ولكنه قد عاد باستجابة فعليًا.

لذلك،

نصيحتي لكل المبرمجين، عندما تريد معرفة نجاح أو فشل الواجهة البرمجية api لا تسأل عن res له قيمة أم ليس له قيمة، ولكن يجب عليك السؤال عن قيمته، فإذا كانت 200 يعني نجاح الأمر، أما القيم الأخرى تدخل على فشل الأمر.

تم التعديل في بواسطة El Sayed El Tohamy

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...