功能组件中的道具
props in functional component
我不太熟悉在功能组件中使用props,我想基本上是在一个功能组件中连接两个功能,并使用其中的数据。
这是我的代码。我想从数据库中获取数据并使用 map 方法将其显示在卡片中。
import {React, useEffect, useState} from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Card from '@material-ui/core/Card';
import CardActions from '@material-ui/core/CardActions';
import CardContent from '@material-ui/core/CardContent';
import Button from '@material-ui/core/Button';
import Typography from '@material-ui/core/Typography';
import clueData from './ClueData';
import client from '../api/client';
import { Chip, Container, Grid } from '@material-ui/core';
const RenderClues=(index)=> {
const classes= useStyles();
const [data, setData] = useState([]);
useEffect(() => {
const fetchData = async () => {
const result = await client.get('api/admin/mission')
setData(result.data.Missions);
}
fetchData();
}, []);
return (
<Card key={index} data={data} style={{ marginBottom: 10, padding: 10 }}>
<CardContent>
<div className={classes.container}>
<Typography className={classes.title} color="textSecondary" variant="ul" >
Clue : {data.cluename}
</Typography>
<Chip size="small" label={clue.isSolved? "solved" : "unsolved" } />
</div>
</CardContent>
<CardActions style={{ display: 'flex', justifyContent: 'space-between'}}>
<Button variant="contained" size="small" href="/photo-clue">View</Button>
<Typography color="textSecondary">
{data.points}
</Typography>
</CardActions>
</Card>
);
}
function Clues(props) {
return (
<Container maxWidth="md">
<Grid item xs={12} >
{props.data.map(RenderClues)}
</Grid>
</Container>
);
}
export default Clues;
const useStyles = makeStyles({
title: {
fontSize: 20,
color:"olive",
fontWeight: 'bold',
textAlign: 'left',
},
pos: {
marginBottom: 12,
},
points: {
float:"right",
},
container: {
display: 'flex',
flexDirection: 'row',
justifyContent: 'space-between',
marginBottom: 10,
}
});
但是我在这里使用道具的方式有问题,因为我收到了这个错误:
“无法读取未定义的 属性 'map'。”
感谢任何帮助。谢谢!
Map 函数接受键和项目。
例如:
props.data.map((key, items) => RenderClues)
问题是 props.data 在呈现时未定义。如果异步更新,请尝试此操作。
{props?.data?.map(RenderClues)}
首先,您应该 运行 fetchData()
在 Clues 函数中。获取数据后,将您的数据作为道具传递给 RenderClues,如下所示:
<Grid item xs={12} >
data.map((dataItem) => {
<RenderClues key={something uniq} data={dataItem} />
})
</Grid>
顺便说一下,您必须将 RenderClues 更改为 RenderClues = (props) => {your code}
并在 RenderClues 中使用道具。在上面的代码中,我假设您是这样获取数据的。你也需要改变它
我不太熟悉在功能组件中使用props,我想基本上是在一个功能组件中连接两个功能,并使用其中的数据。
这是我的代码。我想从数据库中获取数据并使用 map 方法将其显示在卡片中。
import {React, useEffect, useState} from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Card from '@material-ui/core/Card';
import CardActions from '@material-ui/core/CardActions';
import CardContent from '@material-ui/core/CardContent';
import Button from '@material-ui/core/Button';
import Typography from '@material-ui/core/Typography';
import clueData from './ClueData';
import client from '../api/client';
import { Chip, Container, Grid } from '@material-ui/core';
const RenderClues=(index)=> {
const classes= useStyles();
const [data, setData] = useState([]);
useEffect(() => {
const fetchData = async () => {
const result = await client.get('api/admin/mission')
setData(result.data.Missions);
}
fetchData();
}, []);
return (
<Card key={index} data={data} style={{ marginBottom: 10, padding: 10 }}>
<CardContent>
<div className={classes.container}>
<Typography className={classes.title} color="textSecondary" variant="ul" >
Clue : {data.cluename}
</Typography>
<Chip size="small" label={clue.isSolved? "solved" : "unsolved" } />
</div>
</CardContent>
<CardActions style={{ display: 'flex', justifyContent: 'space-between'}}>
<Button variant="contained" size="small" href="/photo-clue">View</Button>
<Typography color="textSecondary">
{data.points}
</Typography>
</CardActions>
</Card>
);
}
function Clues(props) {
return (
<Container maxWidth="md">
<Grid item xs={12} >
{props.data.map(RenderClues)}
</Grid>
</Container>
);
}
export default Clues;
const useStyles = makeStyles({
title: {
fontSize: 20,
color:"olive",
fontWeight: 'bold',
textAlign: 'left',
},
pos: {
marginBottom: 12,
},
points: {
float:"right",
},
container: {
display: 'flex',
flexDirection: 'row',
justifyContent: 'space-between',
marginBottom: 10,
}
});
但是我在这里使用道具的方式有问题,因为我收到了这个错误: “无法读取未定义的 属性 'map'。”
感谢任何帮助。谢谢!
Map 函数接受键和项目。 例如:
props.data.map((key, items) => RenderClues)
问题是 props.data 在呈现时未定义。如果异步更新,请尝试此操作。
{props?.data?.map(RenderClues)}
首先,您应该 运行 fetchData()
在 Clues 函数中。获取数据后,将您的数据作为道具传递给 RenderClues,如下所示:
<Grid item xs={12} >
data.map((dataItem) => {
<RenderClues key={something uniq} data={dataItem} />
})
</Grid>
顺便说一下,您必须将 RenderClues 更改为 RenderClues = (props) => {your code}
并在 RenderClues 中使用道具。在上面的代码中,我假设您是这样获取数据的。你也需要改变它