Я не понимаю приведенный ниже фрагмент кода в reactjs с использованием redux.js и redux-инструментарий, проблема в том, как состояние обновляется с помощью useEffeec()?

#javascript #reactjs #redux #react-redux

Вопрос:

 import { Fragment, useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';

import Cart from './components/Cart/Cart';
import Layout from './components/Layout/Layout';
import Products from './components/Shop/Products';
import { uiActions } from './store/ui-slice';
import Notification from './components/UI/Notification';

let isInitial = true;

function App() {
  const dispatch = useDispatch()
  const showCart = useSelector(state => state.ui.cartIsVisible)
  const cart = useSelector(state => state.cart)
  const notification = useSelector(state => state.ui.notification)

  // when sending a put request, the data on the server will be replaced with the data we are sending
  // unlike post request, where we append new data everytime we send a request 
  useEffect(() => {
    const sendCartData = async () => {
      dispatch(uiActions.showNotification({
        status: 'pending',
        title: 'sending...',
        message: 'sending cart data!'
      }))
      console.log('1');
      const response = await fetch('https://cart-306dd-default-rtdb.firebaseio.com/cart.json', {
        method: 'PUT',
        body: JSON.stringify(cart),
      })
      
      if(!response.ok){
        throw new Error('Sending cart data failed')
      }
      console.log('2');

      dispatch(uiActions.showNotification({
        status: 'success',
        title: 'success!',
        message: 'sent cart data successfully!'
      }))
      console.log('3');
    }

    if(isInitial){
      isInitial = false;
      return 
    }

    sendCartData().catch(error => {
      dispatch(uiActions.showNotification({
        status: 'error',
        title: 'error!',
        message: 'sending cart data failed!'
      }))
    })
  }, [cart, dispatch])
  // react-redux ensures that dispatch function will never change

  return (
    <Fragment>
      {notification amp;amp; 
        <Notification 
          status={notification.status}
          title = {notification.title}
          message = {notification.message} 
        />}
      <Layout>
        {showCart amp;amp; <Cart />}
        <Products />
      </Layout>
    </Fragment>
  );
}

export default App;
 

итак, в этом коде, когда функция useEffect() запускается в первый раз, потому что данные корзины были изменены, и запускается первая функция dispatch (), которая в конечном итоге приведет к обновлению состояния, но тогда функция useEffect() не должна завершаться, и весь компонент должен быть повторно отрисован.
Предположим, что функция useEffect() не завершается, даже если консоль.журналы, которые я хранил в коде, работают совсем по-другому :
из макета

 Layout.js:5 from layout
App.js:27 1
Notification.js:14 from notification
Layout.js:5 from layout
App.js:36 2
Notification.js:14 from notification
Layout.js:5 from layout
App.js:43 3
 

я не понимаю этот код, после первого console.log() происходит повторная визуализация компонента, затем обрабатывается запрос fetch (), а затем снова выполняется повторная визуализация, затем вызывается третий console.log (), я хочу знать причину этого, пожалуйста, может ли кто-нибудь помочь?????