我是React的新手,所以如何放置UI元素会让我逃脱。
但是我不太清楚。在黑框中,应该有一组垂直堆叠的复选框(我已经制作过的组件),在蓝框中,是同一组复选框,但水平放置。在红色框中,有一个Google散点图(我也已经设置了)。
使用react Columns我以为我可以使用两个Columns进行设置。但是后来我意识到,我必须以某种方式将复选框作为父项,所以这不是解决方案。
然后我想“为什么不使用网格?”因此我发现Google在其Material包中有网格(这很好,因为我以任何方式使用它),因此我导入了该网格,但仍然无法完全正确:
我该如何解决?
我的代码如下:
return(
<div>
<Grid container spacing={0}>
<Grid item xs={3}>
<CheckboxContainer checkboxes={checkboxes}/>
</Grid>
<Grid item xs={9}>
<Chart
height="400px"
chartType="ScatterChart"
loader={<div>Loading Chart</div>}
data={[
['Level','Y'],
[-4,-1],
[-3,3],
[-2,-2],
[-1,1],
[0,5],
[1,14],
[2,5],
[3,3.5],
[4,7],
]}
options={{
title: 'Transparency',
hAxis: { title: 'Level', minValue: -9, maxValue: 9 },
vAxis: { title: 'Y', minValue: -9, maxValue: 9 },
legend: 'none',
}}
rootProps={{ 'data-testid': '1'}}
/>
</Grid>
<Grid item xs={12}>
<CheckboxContainer checkboxes={checkboxes} />
</Grid>
</Grid>
</div>
)
答案 0 :(得分:1)
您可以使用纯CSS轻松创建此布局,方法是将flexbox用于水平和垂直复选框,将float用作散点图。
render() {
return (
<div className="page">
<div className="main">
<div className="sidebar">
<div>
Check this
<input type="checkbox"/>
</div>
<div>
Check this
<input type="checkbox"/>
</div>
</div>
<div className="main">
<div>
Check this
<input type="checkbox"/>
</div>
<div>
Check this
<input type="checkbox"/>
</div>
</div>
</div>
<div className="footer">
Scatter plot here
</div>
</div>
);
.page {
width: 100vw;
}
.main {
display: flex;
}
.sidebar {
display: flex;
flex-direction: column;
width: 20%;
}
.footer {
float: right;
width: 80%;
}
在JSFiddle中查看此代码。
答案 1 :(得分:0)
这取决于您在项目中使用CSS的方式,但是使用create-react-app and material-ui的最新版本,我得到以下结果:
这是使用的代码:
import React from 'react';
import PropTypes from 'prop-types';
import Grid from '@material-ui/core/Grid';
import Checkbox from '@material-ui/core/Checkbox';
import { Chart } from "react-google-charts";
import { withStyles } from '@material-ui/core/styles';
import withRoot from '../withRoot';
const styles = theme => ({
root: {
textAlign: 'center',
paddingTop: theme.spacing.unit * 20,
},
column1: {
display:'flex',
flexDirection:'column',
},
row2: {
textAlign:'right',
}
});
class Index extends React.Component {
state = {
open: false,
checkedA: true,
checkedB: true,
checkedF: true
};
handleClose = () => {
this.setState({
open: false,
});
};
handleClick = () => {
this.setState({
open: true,
});
};
handleChange = name => event => {
this.setState({ [name]: event.target.checked });
};
getCheckboxes = () => {
return (
<>
<Checkbox
checked={this.state.checkedA}
onChange={this.handleChange('checkedA')}
value="checkedA"
/>
<Checkbox
checked={this.state.checkedB}
onChange={this.handleChange('checkedB')}
value="checkedB"
color="primary"
/>
<Checkbox value="checkedC" />
<Checkbox disabled value="checkedD" />
<Checkbox disabled checked value="checkedE" />
<Checkbox
checked={this.state.checkedF}
onChange={this.handleChange('checkedF')}
value="checkedF"
indeterminate
/>
<Checkbox defaultChecked color="default" value="checkedG" />
</>
);
}
render() {
return(
<div>
<Grid container spacing={0}>
<Grid item xs={3} className={this.props.classes.column1}>
{this.getCheckboxes()}
</Grid>
<Grid item xs={9}>
<Chart
height="400px"
chartType="ScatterChart"
loader={<div>Loading Chart</div>}
data={[
['Level','Y'],
[-4,-1],
[-3,3],
[-2,-2],
[-1,1],
[0,5],
[1,14],
[2,5],
[3,3.5],
[4,7],
]}
options={{
title: 'Transparency',
hAxis: { title: 'Level', minValue: -9, maxValue: 9 },
vAxis: { title: 'Y', minValue: -9, maxValue: 9 },
legend: 'none',
}}
rootProps={{ 'data-testid': '1'}}
/>
</Grid>
<Grid item xs={12} className={this.props.classes.row2}>
{this.getCheckboxes()}
</Grid>
</Grid>
</div>
);
}
}
Index.propTypes = {
classes: PropTypes.object.isRequired,
};
export default withRoot(withStyles(styles)(Index));