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

لماذا لا يتم تحديث حالة React باستخدام ميثود set في خطاف useState بشكل فوري؟

Abdelrahman Mostafa10

السؤال

أواجه مشكلة في استخدام دالة useState في React. حيث أحاول تحديث مصفوفة حالة باستخدام دالة set، لكن التغييرات لا تنعكس على الفور، لقد جربت الأمر مع استخدام spread syntax وبدون ذلك أيضًا لكن لم يعمل.

فيما يلي الكود لدي:

  • لدي متغير حالة يسمى movies وهو فارغ في البداية.
  • أقوم باسترداد بيانات من API على كمبيوتر آخر.
  • أريد دفع البيانات المستردة (result) إلى مصفوفة movies باستخدام setMovies.
<div id="root"></div>

<script type="text/babel" defer>
// import React, { useState, useEffect } from "react";
// import ReactDOM from "react-dom";
const { useState, useEffect } = React; // web-browser variant

const StateSelector = () => {
  const initialValue = [
    {
      category: "",
      photo: "",
      description: "",
      id: 0,
      name: "",
      rating: 0
    }
  ];

  const [movies, setMovies] = useState(initialValue);

  useEffect(() => {
    (async function() {
      try {
        // const response = await fetch("http://192.168.1.164:5000/movies/display");
        // const json = await response.json();
        // const result = json.data.result;
        const result = [
          {
            category: "cat1",
            description: "desc1",
            id: "1546514491119",
            name: "randomname2",
            photo: null,
            rating: "3"
          },
          {
            category: "cat2",
            description: "desc1",
            id: "1546837819818",
            name: "randomname1",
            rating: "5"
          }
        ];
        console.log("result =", result);
        setMovies(result);
        console.log("movies =", movies);
      } catch (e) {
        console.error(e);
      }
    })();
  }, []);

  return <p>hello</p>;
};

const rootElement = document.getElementById("root");
ReactDOM.render(<StateSelector />, rootElement);
</script>

<script src="https://unpkg.com/@babel/standalone@7/babel.min.js"></script>
<script src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>

ما أتوقعه:

  • يجب إضافة متغير result إلى مصفوفة movies.
  • يجب إعادة عرض المكون مع الحالة المحدثة.

ما يحدث بالفعل:

  • الحالة لا تتغير كما هو متوقع.
  • لا يبدو أن المكون يتم إعادة عرضه.
تم التعديل في بواسطة Abdelrahman Mostafa10
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

المشكلة هنا أن useState لا يقوم بتحديث الحالة بشكل مباشر، بل يقوم بدمج التحديثات بشكل تفريغي.

لذلك بعد الدعوة إلى setMovies لن يتم عرض الحالة المحدثة مباشرة.

يمكنك استخدم استدعاء دالة useEffect مع توقيع movies:

useEffect(() => {
  console.log('movies', movies);
}, [movies]);

لذا يجب الانتظار حتى يتم تطبيق التحديث ثم استخدامه.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...