亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何預處理 React Native 組件的提取 redux 數據?

如何預處理 React Native 組件的提取 redux 數據?

鳳凰求蠱 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 返回一個包含返回值的新數組forEachmap

expR.catCounts.forEach(cat => {
  setPiePieces([...piePieces, {value: cat.count / expR.cat * 100, name: cat.category, color: cat.category==="cat1" ? '#E38627' : '#C13C37' }])
})


查看完整回答
反對 回復 2022-08-27
?
臨摹微笑

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}

])


查看完整回答
反對 回復 2022-08-27
  • 2 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號