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

السؤال

نشر

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

في الكود التالي المتغير buttonColor حالته دائما true عند تحديث الصفحة

الكود

function ImageCard(props) {
  const navigate = useNavigate();
  const [error, setError] = useState("");
  const [like, setLike] = useState([]);
  const {
    photo,
    title,
    author,
    createdAt,
    avatar,
    imageId,
    likes,
    edit_remove,
    handleRemove,
    userId,
  } = props;
  const user = JSON.parse(localStorage.getItem("user"));
  const imgSrc = photo && require(`../../assets/images/${photo}`);
  const avatarSrc = avatar
    ? require(`../../assets/profile/${avatar}`)
    : defaultUser;
  const [numLikes, setNumLikes] = useState(likes?.length);
  const [buttonColor, setButtonColor] = useState(likes.some((item) => item.user === userId));

  /**
   * HandleLike An Image
   */
  const handleLikeImage = async (id) => {
    if (!user) {
      navigate("/login");
      return;
    }

    await axios
      .put(`/api/images/like/${id}`, like, {
        headers: {
          "Content-Type": "application/json",
          "x-auth-token": user.data.token,
        },
      })
      .then((res) => {
        setLike(res.data);
        setNumLikes(res.data.likes.length);
        setButtonColor(!buttonColor);
      })
      .catch((err) => {
        setError(err.response.data.msg);
        setTimeout(() => {
          setError(null);
        }, 1500);
      });
  };
  console.log(buttonColor)
  return (
    <div className="menu">
      {edit_remove ? (
        <>
          <div className="delete change" onClick={() => handleRemove(imageId)}>
            <i className="fa-solid fa-trash"></i>
          </div>
          <div className="edit change">
            <Link to={`/edit-photo/${imageId}`}>
              <i className="fa-solid fa-pen-to-square"></i>
            </Link>
          </div>
        </>
      ) : (
        ""
      )}
      <div className="menu-img">
        <img src={imgSrc} alt={`${title}`} className="img" />
        <span className="read-more">
          <Link to={`/${imageId}`}>
            <i className="fa-regular fa-square-plus"></i>
          </Link>
        </span>
      </div>
      <div className="menu-description">
        <img src={avatarSrc} alt="avatar" className="avatar" />
        <div className="menu-info">
          <h3 className="title">{title}</h3>
          <p className="date">
            created by: <span>{author}</span> at:
            <span>{moment(createdAt).format("DD-MM-YYYY")}</span>
          </p>
        </div>
      </div>

      <div className="menu-like">
        <div
          className={buttonColor ? "like isLike" : "like"}
          onClick={() => {
            handleLikeImage(imageId);
          }}
        >
          <i className="fa-solid fa-thumbs-up"></i>
        </div>
        {numLikes === 0 ? "" : <div className="dislike">{numLikes}</div>}
      </div>
    </div>
  );
}

يعني حتى و إن كانت قيمة

likes.some((item) => item.user === userId)

تساوي false فعند تحديث الصفحة تتحول قيمة buttonColor إلى true

شكرا على المساعدة

Recommended Posts

  • 0
نشر

على حسب تحليلي للكود أعتقد أن المشكلة تكمن في كيفية تحديث قيمة buttonColor بعد استدعاء handleLikeImage. 

أي السطر الذي يحدث فيه المشكل هو :

setButtonColor(!buttonColor);

المشكلة المحتملة هي أن buttonColor قد لا يتم تحديثها بشكل صحيح عند استدعاء هذا السطر، رغم أن:

likes.some((item) => item.user === userId)

قد تعود بقيمة false.
حاول تغيير الدالة للتأكد من أن التحديث يتم بناء على القيمة السابقة بشكل صحيح.

setButtonColor(prevButtonColor => !prevButtonColor);

اما في حالة إذا كنت تقوم بتحديث likes بشكل غير مباشر (على سبيل المثال، استجابة لطلب HTTP)، فقد يكون من المفيد استخدام useEffect للتأكد من أن buttonColor يتم تحديثه بشكل صحيح بعد تحديث likes:

useEffect(() => {
  setButtonColor(likes.some((item) => item.user === userId));
}, [likes, userId]);

بحيث يجب عليك استدعاء هذا الكود خارج نطاق الدالة handleLikeImage.

 

  • 0
نشر
بتاريخ 35 دقائق مضت قال Chihab Hedidi:

على حسب تحليلي للكود أعتقد أن المشكلة تكمن في كيفية تحديث قيمة buttonColor بعد استدعاء handleLikeImage. 

أي السطر الذي يحدث فيه المشكل هو :

setButtonColor(!buttonColor);

المشكلة المحتملة هي أن buttonColor قد لا يتم تحديثها بشكل صحيح عند استدعاء هذا السطر، رغم أن:

likes.some((item) => item.user === userId)

قد تعود بقيمة false.
حاول تغيير الدالة للتأكد من أن التحديث يتم بناء على القيمة السابقة بشكل صحيح.

setButtonColor(prevButtonColor => !prevButtonColor);

اما في حالة إذا كنت تقوم بتحديث likes بشكل غير مباشر (على سبيل المثال، استجابة لطلب HTTP)، فقد يكون من المفيد استخدام useEffect للتأكد من أن buttonColor يتم تحديثه بشكل صحيح بعد تحديث likes:

useEffect(() => {
  setButtonColor(likes.some((item) => item.user === userId));
}, [likes, userId]);

بحيث يجب عليك استدعاء هذا الكود خارج نطاق الدالة handleLikeImage.

 

شكرا

نفس المشكل أخي

لا شيء تغير.

  • 0
نشر
بتاريخ 4 ساعة قال محمود سعداوي2:

شكرا

نفس المشكل أخي

لا شيء تغير.

جرب ايضا استخدام useEffect لتحديث buttonColor بناءً على قيمة likes و userId، وتأكد من وجود useEffect` خارج نطاق الدالة handleLikeImage.

   useEffect(() => {
     setButtonColor(likes.some((item) => item.user === userId));
   }, [likes, userId]);

و تحقق من القيم بعد تحديث likes، ضع console.log لقيم likes و userId بعد استدعاء handleLikeImage`للتحقق من أن القيم لا تتغير بشكل غير متوقع.

const handleLikeImage = async (id) => {
  if (!user) {
    navigate("/login");
    return;
  }

  try {
    const res = await axios.put(`/api/images/like/${id}`, like, {
      headers: {
        "Content-Type": "application/json",
        "x-auth-token": user.data.token,
      },
    });

    setLike(res.data);
    setNumLikes(res.data.likes.length);
  } catch (err) {
    setError(err.response.data.msg);
    setTimeout(() => {
      setError(null);
    }, 1500);
  }
};

useEffect(() => {
  setButtonColor(likes.some((item) => item.user === userId));
}, [likes, userId]);

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...