将数据网格传递给子组件的反应网格布局不起作用
React Grid Layout with data-grid passed down to a child component not working
我想使用 React Grid Layout 在 React 中实现可调整大小的组件。我稍微玩了一下以了解它的工作原理,然后将其安装到我的项目中,但我似乎无法让它工作,因为我的子组件甚至没有 class react-grid-item .
我正在使用数据网格将网格道具传递给我的子组件。我看不出我做错了什么。
import React, {Component} from 'react';
import ChartHolder from '../components/charts/chart-holder';
import RGL, { WidthProvider } from "react-grid-layout";
const ReactGridLayout = WidthProvider(RGL);
class TabContent extends Component {
constructor(props){
super(props);
}
handleChartResize = (layout) => {
console.log('this is the layout', layout);
}
render(){
let tabsChartData = this.props.tabsData.currentActiveTabData[0].data;
let chartData = tabsChartData.map((data, index)=>{
return(
<ChartHolder
key={`${this.props.tabsData.currentActiveTabData[0].tab.id}_${index}`}
id={index}
position={data.position}
/>);
});
return (
<div
className="tab-content"
>
<ReactGridLayout
cols={2}
rowHeight={450}
width={1000}
onLayoutChange={this.handleChartResize}
isDraggable={false}
isResizeable={true}
>
{chartData}
</ReactGridLayout>
</div>
);
}
}
这是我添加数据网格的 chartHolder 组件:
import React, {Component} from 'react';
import {css} from 'react-emotion';
import GridLoader from '../spinners/grid-loader';
import Plot from 'react-plotly.js';
import _ from 'lodash';
import Chart from './Chart';
import styled from 'styled-components';
const ChartChildGrid = styled.div`
background-color: white;
padding: 5px;
margin: 5px;
`;
class ChartHolder extends Component {
render() {
return(
<ChartChildGrid
index={this.props.id}
draggable={true}
onDragStart={this.handleDragStart}
onDragEnd={this.handleDragEnd}
onDragOver={this.handleDragOver}
onDragLeave={this.handleDragLeave}
onDrop={this.handleDragDrop}
data-grid={this.props.position}
>
<div
className="chart-holder-header"
>
<span
onClick={()=>this.props.handleRemoveChart(this.props.id)}
className="close-tab"
>
×
</span>
</div>
<div className="chart-holder-body" >
{_.isEmpty(this.props.data) && <GridLoader/>}
{
!_.isEmpty(this.props.data) &&
<Chart
data={this.props.data}
width={this.props.width}
/>
}
</div>
</ChartChildGrid>
);
}
}
export default ChartHolder;
我已经删除了代码的大部分专有部分,但这并没有按预期工作,因为我无法调整 chartHolder 组件的大小,它甚至没有任何 class 之类的 cssTransforms 和 react-resizable 之类的我在示例中看到。
它确实按照我的预期控制了正确的布局,但似乎无法调整大小。
我设法让它工作了。如果有人面临同样的挑战,问题是因为出于某种原因 react-grid-layout 不接受定制组件。你必须把它包裹在 div.
周围
https://github.com/STRML/react-grid-layout/issues/576 以上 link 帮助我发现了这个问题。
你其实可以使用自定义组件,但你必须将一些必需的道具传递给它。这在问题 #299
中得到解决
在 GridLayout 内部像这样使用您的自定义组件...
<GridLayout>
<div key="1">...</div>
<div key="2">...</div>
<CustomComponent key="3" />
</GridLayout>
在您的 customComponent
内部,您需要渲染以下道具。
<div {...this.props} className={this.props.className}>
content goes here...
</div>
我想使用 React Grid Layout 在 React 中实现可调整大小的组件。我稍微玩了一下以了解它的工作原理,然后将其安装到我的项目中,但我似乎无法让它工作,因为我的子组件甚至没有 class react-grid-item .
我正在使用数据网格将网格道具传递给我的子组件。我看不出我做错了什么。
import React, {Component} from 'react';
import ChartHolder from '../components/charts/chart-holder';
import RGL, { WidthProvider } from "react-grid-layout";
const ReactGridLayout = WidthProvider(RGL);
class TabContent extends Component {
constructor(props){
super(props);
}
handleChartResize = (layout) => {
console.log('this is the layout', layout);
}
render(){
let tabsChartData = this.props.tabsData.currentActiveTabData[0].data;
let chartData = tabsChartData.map((data, index)=>{
return(
<ChartHolder
key={`${this.props.tabsData.currentActiveTabData[0].tab.id}_${index}`}
id={index}
position={data.position}
/>);
});
return (
<div
className="tab-content"
>
<ReactGridLayout
cols={2}
rowHeight={450}
width={1000}
onLayoutChange={this.handleChartResize}
isDraggable={false}
isResizeable={true}
>
{chartData}
</ReactGridLayout>
</div>
);
}
}
这是我添加数据网格的 chartHolder 组件:
import React, {Component} from 'react';
import {css} from 'react-emotion';
import GridLoader from '../spinners/grid-loader';
import Plot from 'react-plotly.js';
import _ from 'lodash';
import Chart from './Chart';
import styled from 'styled-components';
const ChartChildGrid = styled.div`
background-color: white;
padding: 5px;
margin: 5px;
`;
class ChartHolder extends Component {
render() {
return(
<ChartChildGrid
index={this.props.id}
draggable={true}
onDragStart={this.handleDragStart}
onDragEnd={this.handleDragEnd}
onDragOver={this.handleDragOver}
onDragLeave={this.handleDragLeave}
onDrop={this.handleDragDrop}
data-grid={this.props.position}
>
<div
className="chart-holder-header"
>
<span
onClick={()=>this.props.handleRemoveChart(this.props.id)}
className="close-tab"
>
×
</span>
</div>
<div className="chart-holder-body" >
{_.isEmpty(this.props.data) && <GridLoader/>}
{
!_.isEmpty(this.props.data) &&
<Chart
data={this.props.data}
width={this.props.width}
/>
}
</div>
</ChartChildGrid>
);
}
}
export default ChartHolder;
我已经删除了代码的大部分专有部分,但这并没有按预期工作,因为我无法调整 chartHolder 组件的大小,它甚至没有任何 class 之类的 cssTransforms 和 react-resizable 之类的我在示例中看到。 它确实按照我的预期控制了正确的布局,但似乎无法调整大小。
我设法让它工作了。如果有人面临同样的挑战,问题是因为出于某种原因 react-grid-layout 不接受定制组件。你必须把它包裹在 div.
周围https://github.com/STRML/react-grid-layout/issues/576 以上 link 帮助我发现了这个问题。
你其实可以使用自定义组件,但你必须将一些必需的道具传递给它。这在问题 #299
中得到解决在 GridLayout 内部像这样使用您的自定义组件...
<GridLayout>
<div key="1">...</div>
<div key="2">...</div>
<CustomComponent key="3" />
</GridLayout>
在您的 customComponent
内部,您需要渲染以下道具。
<div {...this.props} className={this.props.className}>
content goes here...
</div>