ReactJS 反应网格布局切换静态 属性
ReactJS react-grid-layout toggle static property
我已经学习 React 几天了,这次我想创建一个可拖动小部件的网格,我在 github 上找到了这个库:react-grid-layout那。
这一次,我尝试在单击 button
时切换可拖动或 static
属性,但我在这样做时遇到了一些麻烦。
这是我的 App.js
:
import React, { Component } from 'react';
import {InputText} from 'primereact/components/inputtext/InputText';
import GridLayout from 'react-grid-layout';
import './App.css';
class App extends Component {
render() {
var layout = [
{i: 'a', x: 0, y: 0, w: 10, h: 4},
{i: 'b', x: 1, y: 0, w: 3, h: 2},
{i: 'c', x: 4, y: 0, w: 1, h: 2}
];
return (
<React.Fragment>
<button onClick={this.toggleStatic (layout)}>Enable</button>
<GridLayout className="layout" layout={layout} cols={30} rowHeight={30} width={1200} onDragStop={this.onDragStop}>
<div key="a">a</div>
<div key="b">b</div>
<div key="c">c</div>
</GridLayout>
</React.Fragment>
);
}
toggleStatic(layout) {
console.log('Layout', layout);
}
onDragStop(layout) {
layout[0].static = true;
console.log(layout);
}
}
export default App;
我的index.js
:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import 'react-grid-layout/css/styles.css';
import 'react-resizable/css/styles.css';
import 'primereact/resources/themes/omega/theme.css';
import 'primereact/resources/primereact.min.css';
ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker();
还有我的 index.css
:
body {
margin: 0;
padding: 0;
font-family: sans-serif;
}
.react-grid-item:not(.react-grid-placeholder) {
background-color: #ccc;
border: 1px solid black;
}
.layout {
background-color: #333;
}
.title {
font-weight: bold;
}
如果我检查我的控制台,在重新加载页面后我会立即 layout
登录,在任何点击之前:
Layout […]
0: Object { i: "a", x: 0, y: 0, … }
1: Object { i: "b", x: 1, y: 0, … }
2: Object { i: "c", x: 4, y: 0, … }
length: 3
__proto__: Array []
但是如果我将 button
更改为:
<button onClick={this.toggleStatic}>Enable</button>
即从中删除参数 layout
,我在控制台中得到以下输出:
Layout Proxy
<target>: Object { … }
<handler>: Object { … }
现在,当拖动任何组件时,我的代码将第一个小部件的 static
更改为 true
,我试图在单击按钮时更改它。
我在图书馆的问题上发现了这个 post:Assign static dinamically/programatically,但他们正在使用 react-redux
。
我发现他们也在用这个:
const mapStateToProps = state => {
return {
...state.dashboard.asMutable()
};
};
但我不确定那有什么用。
关于至少将 layout
var 接收到 toggleStatic
中的任何建议对我来说可能就足够了。
{this.toggleStatic (layout)}
将在 render
而不是 onClick
上触发函数,因此您必须更改:
<button onClick={this.toggleStatic (layout)}>Enable</button>
至:
<button onClick={() => this.toggleStatic(layout)}>Enable</button>
然后当您单击按钮时,您将获得布局。
在state
中添加布局:
// ...
class App extends Component {
state = {
layout: [
{i: 'a', x: 0, y: 0, w: 10, h: 4},
{i: 'b', x: 1, y: 0, w: 3, h: 2},
{i: 'c', x: 4, y: 0, w: 1, h: 2}
]
}
render() {
return (
<React.Fragment>
<button onClick={() => this.toggleStatic(this.state.layout)}>Enable</button>
<GridLayout className="layout" layout={this.state.layout} cols={30} rowHeight={30} width={1200} onDragStop={this.onDragStop}>
<div key="a">a</div>
<div key="b">b</div>
<div key="c">c</div>
</GridLayout>
</React.Fragment>
);
}
// ...
然后在 toggleStatic
函数中执行如下操作:
toggleStatic(layout){
var newLayout = layout.map(l => {
return {...l, static: !l.static || true}
})
this.setState({
layout: newLayout
})
}
我已经学习 React 几天了,这次我想创建一个可拖动小部件的网格,我在 github 上找到了这个库:react-grid-layout那。
这一次,我尝试在单击 button
时切换可拖动或 static
属性,但我在这样做时遇到了一些麻烦。
这是我的 App.js
:
import React, { Component } from 'react';
import {InputText} from 'primereact/components/inputtext/InputText';
import GridLayout from 'react-grid-layout';
import './App.css';
class App extends Component {
render() {
var layout = [
{i: 'a', x: 0, y: 0, w: 10, h: 4},
{i: 'b', x: 1, y: 0, w: 3, h: 2},
{i: 'c', x: 4, y: 0, w: 1, h: 2}
];
return (
<React.Fragment>
<button onClick={this.toggleStatic (layout)}>Enable</button>
<GridLayout className="layout" layout={layout} cols={30} rowHeight={30} width={1200} onDragStop={this.onDragStop}>
<div key="a">a</div>
<div key="b">b</div>
<div key="c">c</div>
</GridLayout>
</React.Fragment>
);
}
toggleStatic(layout) {
console.log('Layout', layout);
}
onDragStop(layout) {
layout[0].static = true;
console.log(layout);
}
}
export default App;
我的index.js
:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import 'react-grid-layout/css/styles.css';
import 'react-resizable/css/styles.css';
import 'primereact/resources/themes/omega/theme.css';
import 'primereact/resources/primereact.min.css';
ReactDOM.render(<App />, document.getElementById('root'));
registerServiceWorker();
还有我的 index.css
:
body {
margin: 0;
padding: 0;
font-family: sans-serif;
}
.react-grid-item:not(.react-grid-placeholder) {
background-color: #ccc;
border: 1px solid black;
}
.layout {
background-color: #333;
}
.title {
font-weight: bold;
}
如果我检查我的控制台,在重新加载页面后我会立即 layout
登录,在任何点击之前:
Layout […]
0: Object { i: "a", x: 0, y: 0, … }
1: Object { i: "b", x: 1, y: 0, … }
2: Object { i: "c", x: 4, y: 0, … }
length: 3
__proto__: Array []
但是如果我将 button
更改为:
<button onClick={this.toggleStatic}>Enable</button>
即从中删除参数 layout
,我在控制台中得到以下输出:
Layout Proxy
<target>: Object { … }
<handler>: Object { … }
现在,当拖动任何组件时,我的代码将第一个小部件的 static
更改为 true
,我试图在单击按钮时更改它。
我在图书馆的问题上发现了这个 post:Assign static dinamically/programatically,但他们正在使用 react-redux
。
我发现他们也在用这个:
const mapStateToProps = state => {
return {
...state.dashboard.asMutable()
};
};
但我不确定那有什么用。
关于至少将 layout
var 接收到 toggleStatic
中的任何建议对我来说可能就足够了。
{this.toggleStatic (layout)}
将在 render
而不是 onClick
上触发函数,因此您必须更改:
<button onClick={this.toggleStatic (layout)}>Enable</button>
至:
<button onClick={() => this.toggleStatic(layout)}>Enable</button>
然后当您单击按钮时,您将获得布局。
在state
中添加布局:
// ...
class App extends Component {
state = {
layout: [
{i: 'a', x: 0, y: 0, w: 10, h: 4},
{i: 'b', x: 1, y: 0, w: 3, h: 2},
{i: 'c', x: 4, y: 0, w: 1, h: 2}
]
}
render() {
return (
<React.Fragment>
<button onClick={() => this.toggleStatic(this.state.layout)}>Enable</button>
<GridLayout className="layout" layout={this.state.layout} cols={30} rowHeight={30} width={1200} onDragStop={this.onDragStop}>
<div key="a">a</div>
<div key="b">b</div>
<div key="c">c</div>
</GridLayout>
</React.Fragment>
);
}
// ...
然后在 toggleStatic
函数中执行如下操作:
toggleStatic(layout){
var newLayout = layout.map(l => {
return {...l, static: !l.static || true}
})
this.setState({
layout: newLayout
})
}