鳳凰求蠱
2022-08-27 15:21:42
我有一個用 expo 構建的反應原生應用程序。這是一個預算應用程序。我正在嘗試顯示給定月份支出類型的餅圖。我的邏輯如下:通過調度()從redux中檢索支出Effect將支出與其他字段一起推送到將提供給餅圖的數組。提供給餅圖,并將該數組作為道具。我正在經歷的事情:在 use 中通過 dispatch() 從 redux 中檢索支出Effect嘗試將其他字段的支出推送到數據數組。嘗試將此數組提供給餅圖。餅圖呈現完全空白。(此時記錄數組顯示它也是空的)(在 useEffect 鉤子中記錄數組顯示非空數組)我的代碼:import React, {useEffect} from 'react';import { StyleSheet, StatusBar, View, Text, AsyncStorage, Button, Dimensions } from 'react-native';import {useSelector,useDispatch} from 'react-redux';import {getExp, clearExp} from './../actions/expActions.js';import _uniqueId from 'lodash/uniqueId';import { getRecurrExp } from '../actions/recurrExpActions.js';import { PieChart } from "react-native-chart-kit";export default function Report() { const expR = useSelector(state => state.expR) const recurrExpR = useSelector(state => state.recurrExpR) const dispatch = useDispatch(); const screenWidth = Dimensions.get("window").width const chartConfig ={ backgroundColor: "#e26a00", backgroundGradientFrom: "#fb8c00", backgroundGradientTo: "#ffa726", decimalPlaces: 2, // optional, defaults to 2dp color: (opacity = 1) => `rgba(255, 255, 255, ${opacity})`, labelColor: (opacity = 1) => `rgba(255, 255, 255, ${opacity})`, style: { borderRadius: 16 }, propsForDots: { r: "6", strokeWidth: "2", stroke: "#ffa726" } } var piePieces = []; const getAllExps = () => { dispatch(getExp()) dispatch(getRecurrExp()) } useEffect(() => { getAllExps() expR.catCounts.map(cat => { piePieces.push({value: cat.count / expR.cat * 100, name: cat.category, color: cat.category==="cat1" ? '#E38627' : '#C13C37' }) }) console.log(piePieces) //Log's a filled array },[]) // Deprecated, saving for const clearAsyncStorage = async() => { AsyncStorage.clear() } const clearExpTest = () => { dispatch(clearExp()) }
2 回答

蠱毒傳說
TA貢獻1895條經驗 獲得超3個贊
我的猜測是,這與重新渲染組件有關。由于您正在推動而不是重新分配,因此它不會重新呈現。piePieces
我還建議使用useSate for piePieces來規避這個確切的問題。
將使用狀態添加到導入
import React, {useEffect, useState} from 'react';
組件頂部定義餅圖
const [piePieces, setPiePiecse] = useState([]);
您可以使用 map 返回一個包含返回值的新數組forEach
map
expR.catCounts.forEach(cat => { setPiePieces([...piePieces, {value: cat.count / expR.cat * 100, name: cat.category, color: cat.category==="cat1" ? '#E38627' : '#C13C37' }]) })

臨摹微笑
TA貢獻1982條經驗 獲得超2個贊
對于將來的任何人,Bloatlords的答案都是正確的,但會導致在每個循環中設置狀態的異步問題。
為了解決這個問題,設置狀態的正確方法是:
setPiePieces(piePieces => [...piePieces, {value: ((cat.count / expR.cat) * 100),
name: cat.category,
color: (cat.category.localeCompare("cat1") ? "green" : "yellow"),
legendFontColor: "black", legendFontSize: 15}
])
添加回答
舉報
0/150
提交
取消