如何将array.reduce()与react hook useState,useEffect配合使用?

时间:2019-05-20 20:44:17

标签: reactjs hook reduce

编辑:请在下面找到我的整个组件代码。在useEffect上没有刷新“数据”状态……到底是什么!!

我从useEffect的firebase中获取数据。在useEffect中,我使用useState将数据(数组)存储在一种状态下。 我想在我的rfc render方法中使用此数据,但首先需要reduce()它。 我试图在原始useEffect(在我获取数据的地方),其他useEffect甚至在我的render方法中减少它。这些都不可能真正做到。我的累加器参数在我的reduce函数中保持空白。 拜托,我真的需要一些帮助。


 import React, { useState, useEffect } from 'react'
import { Grid, Paper, Typography, Table, TableBody, TableCell, TableHead, TableRow } from '@material-ui/core'
import firebase from './../firebase'

const db = firebase.firestore()

export default function Scores(props) {

    let { match } = props
    let [currentEvent, setcurrentEvent] = useState(null)
    let [records, setRecords] = useState([])
    let [data, setdata] = useState(null)




    useEffect(() => {
        console.log("effet 1")
        db.collection('events').doc(match.params.id)
          .onSnapshot(doc => {

            setcurrentEvent(currentEvent = { ...doc.data(), uid: doc.id })
            setRecords(records = doc.data().records)
          })

      }, [])

      useEffect(() => {
            console.log(records)
          let x = records.reduce((result, record) => {
              console.log(record)
            result[record.user] = result[record.user] || []
            result[record.user].push(record.time.seconds)
            console.log(result)
            return result
        }, [])
          console.log(x)
          setdata(data = x)

      }, [records])






      if (!currentEvent) {
          return (<h1>data loading ...</h1>)
      }

      return (
          <Paper style={{margin: 8, padding: 8}}>
              <Typography variant='h4'>
                {data.length}
              </Typography>

              <Typography>

              </Typography>


              <Table >
                <TableHead>
                    <TableRow>
                        <TableCell>Participant</TableCell>
                        <TableCell align="right">run 1</TableCell>
                        <TableCell align="right">run 2</TableCell>
                        <TableCell align="right">run 3</TableCell>

                    </TableRow>
                </TableHead>
                <TableBody>


                </TableBody>
            </Table>

          </Paper>
      )




}



/*
useEffect(() => {
          console.log("hi")
          console.log(records)
        let data = records.reduce((result, record) => {
            result[record.user] = result[record.user] || []
            result[record.user].push(record.time.seconds)
            console.log('coucou')
            return result
        }, [])
        setRecords(records = 'coucou')
      }, [])

*/

2 个答案:

答案 0 :(得分:1)

您似乎正在处理返回函数中的所有内容,useEffect的工作方式类似于componentWillUnmount-如docs

中所述

尝试在返回函数之前运行reduce逻辑:

useEffect(() => {
    let records = [];
    let x = records.reduce((result, record) => {
      result[record.user] = result[record.user] || []
      result[record.user].push(record.time.seconds)
      return result
  }, [])
  setdata(data = x)
  }, [records])

答案 1 :(得分:0)

data = df_ru[df_ru['region_name'].isin([region_name_input])]

这不是您应该使用 setdata(data = x) 钩子的方式。在这一行中,您尝试为状态变量赋值,作为状态更新函数的参数。

它应该看起来像这样 useState

More info here ...

检查您的开发工具是否有错误(TypeError:Assignment to constant variable。)。