正如其他人提到的,因为它是一个功能组件,所以您需要使用它
useState
而不是
this.setState
import createEngine, {
DiagramModel,
DefaultNodeModel,
DefaultLinkModel
} from '@projectstorm/react-diagrams';
import * as React from 'react';
import { CanvasWidget } from '@projectstorm/react-canvas-core';
import { DemoCanvasWidget } from '../helpers/DemoCanvasWidget';
const data_json = require('../client-demo-simple/data.json');
const all_tables = data_json.base.tables;
console.log(all_tables);
export default () => {
const [state, setState] = React.useState({ node_level: [] });
const addNodeToState = (nodeId, newNode) => setState({ ...state, [`node_${nodeId}`]: newNode });
var engine = createEngine();
var model = new DiagramModel();
let test_node = null;
for (let n = 0; n < all_tables.length; n++) {
let table_name = all_tables[n].name;
let table_description = all_tables[n].description;
let table_fields = all_tables[n].fields;
let random_number_1 = Math.floor(Math.random() * 101);
let random_number_2 = Math.floor(Math.random() * 101);
let random_number_3 = Math.floor(Math.random() * 101);
test_node = new DefaultNodeModel({
name: table_name,
color: 'rgb(' + random_number_1 + ',' + random_number_2 + ',' + random_number_3 + ')'
});
addNodeToState(n, test_node);
test_node.setPosition(100, 100);
for (let n = 0; n < table_fields.length; n++) {
let field_name = table_fields[n].name;
test_node.addOutPort(field_name);
}
model.addAll(test_node);
}
engine.setModel(model);
model.setLocked(true);
return (
<DemoCanvasWidget>
<CanvasWidget engine={engine} />
</DemoCanvasWidget>
);
};
小心使用
setState
在这里,因为它将覆盖整个状态。如果你想编辑这个状态的其他部分,你可能会想做其他的函数来确保你总是先扩展现有的状态,例如。
const updateSomething = (key, value) => setState({...state, [key]: value })