Как я могу обновить состояние после манипулирования массивом aka .reduce () с хуками useEffect, useState? - PullRequest
0 голосов
/ 21 мая 2019

Я получаю данные из firebase в useEffect.

В useEffect я храню свои данные (которые являются массивом) в состоянии, используя useState.

Я хочу использовать эти данные в моемМетод рфк рендеринга, но сначала нужно уменьшить () его.Я пытался уменьшить его в оригинальном useEffect (то же, где я извлекаю данные), в другом useEffect или даже в моем методе рендеринга.

Ничто из этого не могло сделать это на самом деле.Мой аргумент накопителя остается пустым в моей функции приведения.Пожалуйста, мне действительно нужна помощь в этом.

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(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')
      }, [])

*/

1 Ответ

0 голосов
/ 21 мая 2019

У вас проблема с функцией .reduce().Вы передаете пустой массив в качестве начального значения reduce.Если record.user является строкой, то вы пытаетесь добавить к значению массива индекс строки.Вот почему у вас есть пустой результат.Измените второй аргумент из пустого массива [] на пустой объект {}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...