我们应该在多个地方渲染 React 组件吗?

Should we render react component at multiple places?

所以,我有一个名为 Balance 组件的组件,我想在导航栏和页面(摘要页面)组件上显示它。

但我想阻止它发出两次 api 请求。

balanceSlice代码:

import {createSlice, createAsyncThunk} from '@reduxjs/toolkit';

export const updateBalance = createAsyncThunk(
  'balance/fetchBalance',
  async () => {
    const response = await fetchBalance();
    return response.data;
  }
);

const initialState = {
    value: 0
};

export const balanceSlice = createSlice({
    name: 'balance',
    initialState,
    reducers: {
    },
    extraReducers: () => {...}
});

export const selectBalance = (state) => state.balance.value;

export default balanceSlice.reducer;

这是余额的代码

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

import {updateBalance, selectBalance} from './balanceSlice';


function Balance() {
    const balance = useSelector(selectBalance);
    const dispatch = useDispatch();


    useEffect(() => {
        dispatch(updateBalance());
      console.log('component ran')
    }, [dispatch]);

    return (
        <>
          {balance}  
        </>
    );
}

export default Balance;

因为我想在多个地方重用这个组件,所以我没有在这个组件中添加任何样式。样式是在摘要页面和导航栏中完成的。 updateBalance 正在从 api 请求新余额。我正在使用 redux 工具包,我正在尝试遵循单一职责原则并使组件更小、可重用和可测试。

是否推荐多处渲染平衡组件? 导航条代码:

import Balance from './../../features/balance/Balance';
    function TopNavbar() {
    return (
    <Navbar>
    <span className={styles.navbar__text__span}><Balance /></span>
    </Navbar>
    );
    }

同样,我在 summaryPage 组件中导入 Balance 组件并渲染它。这是推荐的方法还是我应该简单地从 balanceSlice 导入 selectBalance 并将其显示在导航栏中?

您可以在任何需要的地方渲染平衡组件。 平衡组件看起来像这样。

function Balance() {
    const balance = useSelector(selectBalance);
    const dispatch = useDispatch();

    useEffect(() => {
        if (balance.status === 'ready') {
            dispatch(updateBalance());
        }
        console.log('component ran')
    }, [dispatch]);

    return (
        <>
            {balance.value ?? 0}
        </>
    );
}

在 updateBalance 操作中,您应该将余额状态设置为 'fetching' 并调用 api。 api调用结束后,可以将余额状态设置为'fetched',将余额值设置为获取的值。我猜的就这些了。