【发布时间】:2019-12-21 01:12:23
【问题描述】:
我正在使用 Material-UI 作为我的电子商务应用程序的前端。
我有一个空的购物车状态数组,它将采用稍后将被解析的“字符串化对象”。选择组件上的每个 handleChange() 都应将一个对象(字符串化对象)添加到购物车数组中。
handleChange() 将对象嵌套在自身内部,即 [ob1,[obj2, [obj3, [etc[etc]]]]] - 但我需要 [obj1, obj2, obj3, etc]...
代码--
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Card from '@material-ui/core/Card';
import CardActionArea from '@material-ui/core/CardActionArea';
import CardActions from '@material-ui/core/CardActions';
import CardContent from '@material-ui/core/CardContent';
import CardMedia from '@material-ui/core/CardMedia';
import Button from '@material-ui/core/Button';
import Typography from '@material-ui/core/Typography';
import IconButton from '@material-ui/core/IconButton';
import Icon from '@material-ui/core/Icon';
import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@material-ui/core/MenuItem';
import FormHelperText from '@material-ui/core/FormHelperText';
import FormControl from '@material-ui/core/FormControl';
import Select from '@material-ui/core/Select';
import soda from "./soda.jpg";
import * as firebase from 'firebase';
const useStyles = makeStyles(theme=>({
card: {
maxWidth: 345,
marginTop: 170,
marginLeft: 70,
},
media: {
height: 0,
},
formControl: {
margin: theme.spacing(1),
minWidth: 120,
},
selectEmpty: {
marginTop: theme.spacing(2),
},
}));
export default function MediaCard() {
const classes = useStyles();
const [age, setAge] = React.useState('');
let [cart, setCart]= React.useState([]);
const inputLabel = React.useRef(null);
const [labelWidth, setLabelWidth] = React.useState(0);
React.useEffect(() => {
}, []);
const handleChange = event =>{
Array.prototype.flat(cart)
setCart([cart].concat(event.target.value));
console.log(cart);
};
let item = {
itemDescription:"CBD FLOWER",
itemName: "CBD",
increments: {
gram: {
price: 10,
weight: 1,
name: "CBD",
},
eighth: {
price: 30,
weight: 3.5,
name: "CBD",
},
quarter: {
price: 70,
weight: 7,
name: "CBD",
},
half: {
price: 140,
weight: 14,
name: "CBD",
},
ounce: {
price: 300,
weight: 28,
name: "CBD",
},
}
};
let stringified = JSON.stringify(item.increments.gram);
/*let getDiv = document.getElementById('testo');
let getInput = getDiv.getElementsByTagName('input');
for (let i = 0, n = getInput.length; i < n; i = i+1){
console.log(getInput[i].value);
}*/
return (
<Card className={classes.card}>
<CardActionArea>
<CardMedia
component="img"
alt={item.itemName}
height="500"
image={soda}
src={soda}
title="CBD SODA"
/>
<CardContent>
<Typography gutterBottom variant="h5" component="h2">
{item.itemName}
</Typography>
<Typography variant="body2" color="textSecondary" component="p">
A refreshing drink filled w/ 28.8% CBD
</Typography>
</CardContent>
</CardActionArea>
<CardActions>
<div id="testo">
<FormControl className={classes.formControl}>
<InputLabel id="demo">Choose</InputLabel>
<Select
labelId="demo"
id="selectedItem"
value={age}
onChange={handleChange}
displayEmpty
className={classes.selectEmpty}
>
<MenuItem value={JSON.stringify(item.increments.gram)}>10</MenuItem>
<MenuItem value={JSON.stringify(item.increments.eighth)}>30</MenuItem>
<MenuItem value={JSON.stringify(item.increments.quarter)}>90</MenuItem>
<MenuItem value={JSON.stringify(item.increments.half)}>140</MenuItem>
<MenuItem value={JSON.stringify(item.increments.ounce)}>300</MenuItem>
</Select>
<FormHelperText>Quantity + Price</FormHelperText>
</FormControl>
<div id="seperator">
<Button variant="outlined" color="primary">
Add To Cart
</Button>
</div>
</div>
</CardActions>
</Card>
);
}
之后我试图展平阵列,但没有。我也试过 Array.prototype.push(),请帮忙,lol
【问题讨论】:
-
Array#flat是要走的路,但如果你必须在没有任何转译器的情况下支持跨浏览器,请上网查找递归数组展平函数 -
我以为所有浏览器都支持Array.prototype.flat()???
-
如果它发布得足够久,我们可以将它命名为
Array#flatten,而不会被一些过时的库抢走它;)。您可以随时在 mdn 上查找兼容性表以确认 -
@SonicStrains 看看:caniuse.com/#search=flat。如果您担心浏览器支持,可以尝试lodash.flattenDeep
标签: javascript reactjs material-ui state