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

السؤال

نشر (معدل)

لقد وضعت عداد  في useEffact عن طريق usestate  وهو شغال لكن هناك تحذير من أن render يعاد بكثرة في useEffact : ماهو الحل ؟ ملاحظة مكتبة moment i هي للوقت وأعتقد أنها تتحدث بأجزاء الثانية مما يسبب كثرة render

هناك الخطأ مرفق مع ملف js  الذي أعمل عليه , فقط يحتاج مكتبة moment  من اجل اشتغال الوقتTest.zip

 

:Screenshot2023-09-24225253.png.91add1d979f0c3e75e5c459c73eda014.png

تم التعديل في بواسطة Mustafa Suleiman
تعديل عنوان السؤال

Recommended Posts

  • 0
نشر

السبب هو أن الدالة useEffect() يتم تنفيذها كل مرة يتم فيها تحديث حالة المكون today، وحيث أن الدالة useEffect() تحدد حالة المكون today ، فإن ذلك يؤدي إلى حلقة لا نهاية لها من التحديثات.

عليك القيام بالتالي:

  • إضافة حالة المكون today إلى مصفوفة الاعتماديات dependencies الخاصة بالدالة useEffect() من أجل منع تنفيذ الدالة useEffect() كلما تم تحديث حالة المكون today.
  • استخدام هوك useCallback() لإنشاء نسخة من دالة getToday() التي يمكن استخدامها خارج نطاق هوك useCallback().

import { useEffect, useState, useCallback } from 'react';
import { Col, Row } from 'react-bootstrap';
import moment from 'moment';

function Test() {
  const [today, setToday] = useState({});

  const getToday = useCallback(() => {
    const t = moment();

    return {
      time: t.format('hh:mm:ss a'),
      date: t.format('D/MMM/YYYY'),
    };
  }, []);

  useEffect(() => {
    setToday(getToday);
  }, [getToday]);

  return (
    <Row>
      <Col className='colTop'>{today?.date}</Col>
      <Col className='colTop' style={{ fontSize: '1.6rem', textAlign: 'center' }}>
        <h2>{today?.time}</h2>
      </Col>
    </Row>
  );
}

export default Test;

 

  • 0
نشر
بتاريخ 14 دقائق مضت قال Mustafa Suleiman:

السبب هو أن الدالة useEffect() يتم تنفيذها كل مرة يتم فيها تحديث حالة المكون today، وحيث أن الدالة useEffect() تحدد حالة المكون today ، فإن ذلك يؤدي إلى حلقة لا نهاية لها من التحديثات.

عليك القيام بالتالي:

  • إضافة حالة المكون today إلى مصفوفة الاعتماديات dependencies الخاصة بالدالة useEffect() من أجل منع تنفيذ الدالة useEffect() كلما تم تحديث حالة المكون today.
  • استخدام الدالة useMemo() لتخزين نتيجة الدالة moment() لإعادة حساب نتيجة الدالة moment() فقط عند تغير قيمة مدخلاتها.
import React, { useEffect, useState, useMemo, useCallback } from 'react';
import {Col, Row} from 'react-bootstrap'
import moment from 'moment';

function Test() {
  const [today, setToday]= useState({});

  const getToday = useMemo(() => {
    const t = moment();

    return {
      time: t.format('hh:mm:ss a'),
      date: t.format('D/MMM/YYYY'),
    };
  }, []);

  useEffect(() => {
    setToday(getToday());
  }, [getToday]);

  return (
    <Row>
      <Col className='colTop'>{getToday().date}</Col>
      <Col className='colTop' style={{fontSize:'1.6rem',textAlign: "center"}}><h2>{getToday().time}</h2></Col>
    </Row>
  );
}

export default Test;

 

ظهر خطا يقول getToday is not a function at Test.js;

يشير إلى السطر الذي داخل <Col>{getToday().time}</Col>

ttt.png

  • 0
نشر

استخدم هوك useCallback() لإنشاء نسخة من دالة getToday() التي يمكن استخدامها خارج نطاق هوك useCallback().

الكود سيكون كالتالي:

import { useEffect, useState, useCallback } from 'react';
import { Col, Row } from 'react-bootstrap';
import moment from 'moment';

function Test() {
  const [today, setToday] = useState({});

  const getToday = useCallback(() => {
    const t = moment();

    return {
      time: t.format('hh:mm:ss a'),
      date: t.format('D/MMM/YYYY'),
    };
  }, []);

  useEffect(() => {
    console.log(getToday);
    setToday(getToday);
  }, [getToday]);

  return (
    <Row>
      <Col className='colTop'>{today?.date}</Col>
      <Col className='colTop' style={{ fontSize: '1.6rem', textAlign: 'center' }}>
        <h2>{today?.time}</h2>
      </Col>
    </Row>
  );
}

export default Test;

 

  • 0
نشر
بتاريخ 10 دقائق مضت قال Mustafa Suleiman:

استخدم هوك useCallback() لإنشاء نسخة من دالة getToday() التي يمكن استخدامها خارج نطاق هوك useCallback().

الكود سيكون كالتالي:

import { useEffect, useState, useCallback } from 'react';
import { Col, Row } from 'react-bootstrap';
import moment from 'moment';

function Test() {
  const [today, setToday] = useState({});

  const getToday = useCallback(() => {
    const t = moment();

    return {
      time: t.format('hh:mm:ss a'),
      date: t.format('D/MMM/YYYY'),
    };
  }, []);

  useEffect(() => {
    console.log(getToday);
    setToday(getToday);
  }, [getToday]);

  return (
    <Row>
      <Col className='colTop'>{today?.date}</Col>
      <Col className='colTop' style={{ fontSize: '1.6rem', textAlign: 'center' }}>
        <h2>{today?.time}</h2>
      </Col>
    </Row>
  );
}

export default Test;

 

عافاك الله , في جزئية أن الوقت ليس ديناميكيا : هل هناك من حل أضيفه على هذا الكود

بتاريخ 2 دقائق مضت قال يحيى بوحسي:

عافاك الله , في جزئية أن الوقت ليس ديناميكيا : هل هناك من حل أضيفه على هذا الكود

استاذ جزاك الله . لقد توصلت للحل : 

 

import { useEffect, useState, useCallback } from 'react';

import { Col, Row } from 'react-bootstrap';

import moment from 'moment';

 

function Test() {

  const [today, setToday] = useState({});

 

  const getToday=() => {

    const t = moment();

    return {

      time: t.format('hh:mm:ss a'),

      date: t.format('D/MMM/YYYY'),

    };

  };

 

  useEffect(()=>{

    const interval= setInterval(() => {

      setToday(getToday);

  }, 1000);

  return ()=>{

    clearInterval(interval)

  }

},[])


 

  return (

    <Row>

      <Col className='colTop'>{today.date}</Col>

      <Col className='colTop' style={{ fontSize: '1.6rem', textAlign: 'center' }}>

        <h2>{today.time}</h2>

      </Col>

    </Row>

  );

}

 

export default Test;

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...