我如何在数组操作后更新状态 aka .reduce() 与挂钩 useEffect,useState?
How can I update state after array manipulation aka .reduce() with hooks useEffect, useState?
我在 useEffect 中从 firebase 获取数据。
在 useEffect 中,我使用 useState 将我的数据(它是一个数组)存储在一个状态中。
我想在我的 rfc 呈现方法中使用此数据,但首先需要对其进行 reduce()。我试图在原始 useEffect(与我获取数据的位置相同)、另一个 useEffect 甚至我的渲染方法中减少它。
None 其中实际上可以做到。我的累加器参数在我的 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(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')
}, [])
*/
.reduce()
函数有问题。您将一个空数组作为初始值传递给 reduce
。如果 record.user
是一个字符串,那么您尝试使用字符串索引添加到数组值。这就是为什么你的结果是空的。将第二个参数从空数组 []
更改为空对象 {}
我在 useEffect 中从 firebase 获取数据。
在 useEffect 中,我使用 useState 将我的数据(它是一个数组)存储在一个状态中。
我想在我的 rfc 呈现方法中使用此数据,但首先需要对其进行 reduce()。我试图在原始 useEffect(与我获取数据的位置相同)、另一个 useEffect 甚至我的渲染方法中减少它。
None 其中实际上可以做到。我的累加器参数在我的 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(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')
}, [])
*/
.reduce()
函数有问题。您将一个空数组作为初始值传递给 reduce
。如果 record.user
是一个字符串,那么您尝试使用字符串索引添加到数组值。这就是为什么你的结果是空的。将第二个参数从空数组 []
更改为空对象 {}