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

السؤال

نشر

أنا أعمل على مشروع موقع تواصل اجتماعي لغرض التدريب وقمت بعمل دالة الإعجاب وعدم الإعجاب بالمنشورات بشكل جيد وعندما أضغط على "like" للنشر يعمل بشكل جيد للغاية وتتغير أيقونة الإعجاب إلى أيقونة ممتلئة(أيقونة تم الإعجاب)، لكن عندما أقوم بتحديث الصفحة يختفي الإعجاب كما لو أنه لم يكن موجوداً ، ولا أعرف السبب، لقد حاولت عمل الإعجاب من الباك إند وهو يعمل بشكل جيد وحتى الأيقونة تتغير في الصفحة عندما أفعل ذلك من الباك إند وتبقى كذلك حتى بعد تحديث الصفحة، ولكن عندما أضغط إعجاب من الصفحة مباشرة يختفي الإعجاب بمجرد تحديث الصفحة هذا يعني أن المشكلة في الفرونت إند.

هذا هو كود الإعجاب في ملف Post.jsx:

const [like, setLike] = useState([post.like.includes(userId) ? anotherLikeIcon : likeIcon]);
const [count, setCount] = useState(post.like.length);

const handleLike = async() => {


if(like == likeIcon){
        await fetch(`http://localhost:5000/api/post/${post._id}/like`, 
        {
            method:"PUT", 
            headers:{
                'Content-Type':"application/Json",
                token:accessToken
            }})
        setLike(anotherLikeIcon);
        setCount(count+1)
    } else {
        await fetch(`http://localhost:5000/api/post/${post._id}/like`, 
        {
            method:"PUT", 
            headers:{
                'Content-Type':"application/Json",
                token:accessToken
            }})
        setLike(likeIcon);
        setCount(count-1)
    }
}

فقط للعلم أنني وضعت الرمز المميز التوكن في المتغير AccessToken كـstring في نفس الملف ومع ذلك لم تُحل المشكلة

Recommended Posts

  • 0
نشر

سوف تحتاج تهيئة حالة تعبر عما ان كان المستخدم معجبا بالفعل بالمنشور أو لا، ولتسمها مثلا: 

const (isLiked, setIsLiked) = useState(() => checkLiked())

const checkLiked = () => {
    /**
    * أي شيفرة يمكنك انطلاقا منها فحص ما ان كان المستخدم معجبا بالمنشور أو لا
    */ 
    
    return someBooleanValue; // أعد true أو false 
}

بحيث تقوم الوظيفة checkLiked بفحص الإعجاب (سواءا بطلبية من الباك أند أو من خلال فحص كائن معين أو أي طريقة كانت).

فالقيمة الافتراضية لمتغير الحالة isLiked تتغير هي الأخرى.

الآن سيسهل استخدام هذا المتغير في التصيير الشرطي لزر الإعجاب ووظيفته: 

<ToggleLikeButton onClick={isLiked ? removeLike : addLike} />
const addLike = () => {
     // وظيفة اضافة الإعجاب
}

const removeLike = () => {
    // وظيفة الغاء الإعجاب
}

 

  • 0
نشر

المشكلة هنا أن الحالة لا تعود مخزنة عند تحديث الصفحة، لذلك يختفي الإعجاب.

  • إرسال الحالة الحالية للإعجاب (like) من الباك إند عند تحميل الصفحة، بحيث تستقبلها الصفحة وتضبط الحالة. كما في التعليق السابق
  •  تخزين الحالة على الكلاينت محليا باستخدام localStorage أو sessionStorage.

مثال تطبيق localStorage:

// Save state 
localStorage.setItem('like', true);

// Get state on load
const like = localStorage.getItem('like');

هذا سيحتفظ بالحالة حتى بعد تحديث الصفحة. يمكن أيضا إضافة التوكن لتأكيد المستخدم.

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...