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

السؤال

نشر

السلام عليكم.

أقدم طريقتين من كتابة الكود.

الكود الأول:

import React, { useEffect } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { fetchBooks } from '../../redux/apiCalls/bookApiCall'
import { Oval } from "react-loader-spinner";

function Books({ currentPage }) {
  const dispatch = useDispatch()

  const {books, loading} = useSelector(state => state.book)

  useEffect(() => {
    dispatch(fetchBooks(currentPage))
  }, [dispatch, currentPage])

  if (loading) {
    <Oval
      height={120}
      width={120}
      color="rgb(247, 96, 14)"
      wrapperStyle={{
        height: "70vh",
        display: "flex",
        alignItems: "center",
        justifyContent: "center",
      }}
      wrapperClass=""
      visible={true}
      ariaLabel="oval-loading"
      secondaryColor="#E2E2E2"
      strokeWidth={3}
      strokeWidthSecondary={3}
    /> 
  }
  
  return (
    <div className='books'>
        <h1 className='books-title'>Explore Books</h1>
        <div className="books-container">
                {
                  books.data?.map((book, index) => (
                    <div className="books-card" key={index}>
                      <img src={book?.image.url} className='books-card-img' alt=''/>
                      <div className="over">
                        <h2 className="over-title">{book?.title}</h2>
                        <h3 className="over-auth">{book?.author}</h3>
                        <button className="over-btn">SHOW BOOK</button>
                      </div>
                    </div>
                  ))
                }  
        </div>
    </div>
  )
}

export default Books

الكود الثاني:

import React, { useEffect } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { fetchBooks } from '../../redux/apiCalls/bookApiCall'
import { Oval } from "react-loader-spinner";

function Books({ currentPage }) {
  const dispatch = useDispatch()

  const {books, loading} = useSelector(state => state.book)

  useEffect(() => {
    dispatch(fetchBooks(currentPage))
  }, [dispatch, currentPage])
  
  return (
    <div className='books'>
        <h1 className='books-title'>Explore Books</h1>
        <div className="books-container">
                {
                  loading ? (<Oval
                    height={120}
                    width={120}
                    color="rgb(247, 96, 14)"
                    wrapperStyle={{
                      height: "70vh",
                      display: "flex",
                      alignItems: "center",
                      justifyContent: "center",
                    }}
                    wrapperClass=""
                    visible={true}
                    ariaLabel="oval-loading"
                    secondaryColor="#E2E2E2"
                    strokeWidth={3}
                    strokeWidthSecondary={3}
                  /> ) : (books.data?.map((book, index) => (
                    <div className="books-card" key={index}>
                      <img src={book?.image.url} className='books-card-img' alt=''/>
                      <div className="over">
                        <h2 className="over-title">{book?.title}</h2>
                        <h3 className="over-auth">{book?.author}</h3>
                        <button className="over-btn">SHOW BOOK</button>
                      </div>
                    </div>
                  )))
                }  
        </div>
    </div>
  )
}

export default Books

الكود الثاني يعمل بشكل جيد حيث يتم إستدعاء Loader Component إلى حين جلب البيانات من الخادم. بينما الكود الأول لم يفعل.

شخصيا أعتقد أنه لا فرق بينهما.

لكن لماذا فعل الكود الثاني ولم يفعل الكود الأول.

شكرا.

Recommended Posts

  • 0
نشر

الفارق الأساسي هو كيفية التعامل مع حالة التحميل loading state.

tفي الكود الأول، تقوم بالتحقق من حالة التحميل loading ولكنك لم تقم بإرجاع الـLoader كجزء من الـJSX، أي الكود داخل الشرط if (loading) لا يعتبر جزءًا من النتيجة المرجعة من الدالة Books.

بينما في الكود الثاني، تقوم باستخدام تعبير ثلاثي للتحقق من حالة التحميل loading، وإن كانت الحالة loading، يتم إرجاع الـLoader كجزء من الـJSX، وإذا لم تكن الحالة loading يتم عرض الكتب.

لذا الكود الثاني يعيد الـLoader كجزء من النتيجة المرجعة من الدالة Books، بينما الكود الأول لا يعيد أي شيء في حالة التحميل، مما يعني أن العنصر Oval لن يتم عرضه.

إذن في الكود الأول عليك تعديل الجزء الخاص بحالة التحميل ليعيد الـLoader كجزء من النتيجة المرجعة من الدالة Books:

if (loading) {
  return (
    <Oval
      height={120}
      width={120}
      color="rgb(247, 96, 14)"
      wrapperStyle={{
        height: "70vh",
        display: "flex",
        alignItems: "center",
        justifyContent: "center",
      }}
      wrapperClass=""
      visible={true}
      ariaLabel="oval-loading"
      secondaryColor="#E2E2E2"
      strokeWidth={3}
      strokeWidthSecondary={3}
    /> 
  );
}

من أجل عرض الـLoader عندما تكون الحالة loading هي true.

  • 0
نشر

في الكود الأول، يقوم الشرط if (loading) بفحص حالة التحميل، ولكن لا يقوم بإرجاع أي مكون React ليتم عرضه في واجهة المستخدم. هذا يعني أن Oval لا يتم عرضه فعليًا.

في الكود الثاني، يتم استخدام التعبير الشرطي loading ? ... : ... داخل return لإرجاع الـOval مباشرة عندما تكون حالة التحميل true. وبالتالي، يتم عرض الـLoader Component بشكل صحيح عند تحميل البيانات.

يمعني اخر الكود الثاني يعمل بشكل صحيح لأن الشرط الذي يتحقق من حالة التحميل (loading) يوجد داخل التعبير الشرطي في دالة return، مما يسمح بعرض الـLoader Component مباشرة. بينما في الكود الأول، الشرط if (loading) لا يعيد أي مكون للواجهة، وبالتالي لا يتم عرض الـLoader Component.

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...