0

我在这个问题上堆积了很长时间,需要一些帮助来解决它。

我正在构建一种销售应用程序,并尝试在一个页面中设置所有内容,以便用户可以获得他的成就与他的目标

在这个屏幕中,我试图设置一张桌子。除了代码假设设置要运行的表格内容外,一切正常。尽管我尽了最大努力让它在用户通过屏幕后重新渲染,但它一直没有重新渲染,我必须手动重新渲染

如果完成屏幕不断重新渲染导致应用程序崩溃。我确定这是我的代码中的一个问题

任何人都可以解决这个问题,我将不胜感激

    import React, { useCallback, useEffect, useState } from 'react';
    import {
        View,
        Text,
        StyleSheet,
        Dimensions,
        ScrollView,
        RefreshControl
    } from 'react-native';
    import { useDispatch, useSelector } from 'react-redux';
    import Colors from '../../constants/Colors';
    import * as salesActions from '../../store/sales/actions/sales';
    import Spinner from '../../components/Spinner';
    import * as targetActions from '../../store/forecast/forecast';
    import { Table, Row } from 'react-native-table-component';
    import productsData from '../../data/ProductsData';
    import { thousands } from '../../components/Thousands';
    
    const {width, height} = Dimensions.get('window');
    
    const widthArrayHeader = [width / 3.5, width / 3.6, width / 3.6, width / 8.2];
    const headerNamesWidth = [width / 3.5, width / 7.2, width / 7.2, width / 7.2 , width /7.2, width / 8.2];
    
    const MonthlySalesScreen = props => {
    
        useEffect(() => {
            dispatch(targetActions.fetchTarget());
        }, [dispatch])
    
        const month = props.navigation.getParam('month');
    
        const { 
            totalYearSales,
            monthTarget, 
            monthValue,
        } = useSelector(state => state.sales);
        const [isLoading, setIsLoading] = useState(false);
        const [salesValues, setSalesValues ] = useState([]);
        const [monthSales, setMonthSales ] = useState([]);
        const [tableContent, setTableContent ] = useState([]);
        const [totalSales, setTotalSales ] = useState(null);
    
        const [currentMonthSales, setCurrentMonthSales ] = useState([]);
    
        const dispatch = useDispatch();
    
        useEffect(() => {
            setIsLoading(true);
            dispatch(salesActions.fetchSales(month))
            setIsLoading(false);
        }, [dispatch])
    
        const getSalesData = useCallback(async() => {
            setIsLoading(true);
            const monthlySales = await totalYearSales.filter(x => {
                return x.monthName === month
            })
            setCurrentMonthSales(monthlySales);
            setIsLoading(false);
        }, [totalYearSales])
    
        useEffect(() => {
            getSalesData()
        }, [getSalesData])
    
    
        const getMonthSales = useCallback(async() => {
            const sum = await currentMonthSales.reduce((sum, current) => {
                let sumItem = sum.find(x => x.itemName === current.itemName);
                if (!sumItem) 
                sum.push(current)
                else {
                    sumItem.itemName = sumItem.itemName;
                    sumItem.quantity = parseInt(sumItem.quantity) + parseInt(current.quantity)
                }
    
                return sum
            }, []);
    
            setMonthSales(sum)
        } , [currentMonthSales])
    
        useEffect(() => {
            getMonthSales();
        }, [getMonthSales])
    
        useEffect(() => {
            dispatch(salesActions.getTargetData(month));
        }, [dispatch])
    
        const getSalesValueHandler = useCallback(async () => {
            let salesValue = [];
            let totalSales = [];
            await monthSales.map((sal) => {
                productsData.map((pro) => {
                    if (sal.itemName === pro.product) {
                        salesValue.push({
                            itemName : sal.itemName,
                            salesUnits : sal.quantity,
                            salesValue : parseFloat(sal.quantity) * parseFloat(pro.price)
                        })
                        totalSales.push(parseFloat(sal.quantity) * parseFloat(pro.price))
                    }
                })
            })
            setSalesValues(salesValue);
            setTotalSales(totalSales.reduce((a,b) => a + b, 0));
        }, [monthSales])
    
        useEffect(() => {
            getSalesValueHandler()
        }, [getSalesValueHandler])
    
        const getTableData = useCallback(() => {
            let tableData = [];
            if (salesValues.length > 0) {
                salesValues.map((sale) => {
                    monthTarget.map((target) => {
                        if (sale.itemName === target.itemName) {
                            tableData.push([
                                sale.itemName,
                                thousands(parseInt(target.targetUnits)),
                                thousands(parseFloat(target.targetValue).toFixed(2)),
                                thousands(parseInt(sale.salesUnits)),
                                thousands(parseFloat(sale.salesValue).toFixed(2)),
                                `${((parseFloat(sale.salesValue)) / (parseFloat(target.targetValue)) * 100).toFixed(2)}%`
                            ])
                        }
                    })
                })
                        var difference =  (monthTarget.map(
                            name => name.itemName
                        )).filter(x => !(salesValues.map(
                            sale => sale.itemName
                        )).includes(x));
                
                    const differenceItems = difference.map((str) => {
                        return {itemName : str}
                    })
        
                     monthTarget.map((data) => {
                     differenceItems.map((dif) => {
                       if (data.itemName === dif.itemName) {
                           tableData.push([
                               data.itemName,
                               data.targetUnits,
                               parseFloat(data.targetValue).toFixed(2),
                               '0',
                               '0',
                               '0.00%'
                           ])
                       }
                   })
               })
            } else if (salesValues.length === 0)  {
                monthTarget.map((data) => {
                    tableData.push([
                        data.itemName,
                        data.targetUnits,
                        parseFloat(data.targetValue).toFixed(2),
                        '0',
                        '0',
                        '0.00%'
                    ])
                })
            }
           setTableContent(tableData)
        }, [getSalesData, getMonthSales, getSalesValueHandler, monthTarget, salesValues])
    
        
        useEffect(() => {
            getTableData()
        }, [salesValues, monthTarget])
    
        const headerData = ['', 'Target' , 'Sales', ''];
        const headerNames = ['Item' , 'Units' , 'Value' , 'Units' , 'Value' , 'Ach'];
        const lastRow = [
            'Total',  
            thousands(parseFloat(monthValue).toFixed(2))  , 
            thousands(parseFloat(totalSales).toFixed(2)), 
            `${thousands((((parseInt(totalSales) / parseInt(monthValue)).toFixed(2)) * 100).toFixed(0))}%`
        ]
    

4

0 回答 0