Reactコンポーネントのコンストラクタで引数としてオブジェクトを渡しています。私は、コンストラクタでこれに結合する方法についていくつかの記事を読んで、私は、私は渡されたオブジェクトの関数を呼び出すいてUncaught TypeError:***はReactコンポーネントの関数ではありません
Uncaught TypeError: _this.layout.getWbsLayout is not a function
at new Wbs (Wbs.tsx:50)
at react-dom.js:4749
at measureLifeCyclePerf (react-dom.js:4529)
at ReactCompositeComponentWrapper._constructComponentWithoutOwner (react-dom.js:4748)
at ReactCompositeComponentWrapper._constructComponent (react-dom.js:4734)
at ReactCompositeComponentWrapper.mountComponent (react-dom.js:4642)
at Object.mountComponent (react-dom.js:11542)
at ReactCompositeComponentWrapper.performInitialMount (react-dom.js:4825)
at ReactCompositeComponentWrapper.mountComponent (react-dom.js:4712)
at Object.mountComponent (react-dom.js:11542)
:その後、私は、オブジェクトの機能のいずれかを呼び出したいが、このエラーメッセージが表示されます議論として、私はここにこれが当てはまるとは確信しておらず、依然としてbind is not a function
という似たようなメッセージがあります。
私のコードは、Wbs
がルートのリアクションコンポーネントです。WbsLayout
は、Wbsのコンストラクタのパラメータとして渡すオブジェクトです。
コンストラクタでエラーが発生したときthis.layout.getWbsLayout()
代わりにComponentDidMount
で関数を呼び出しようとしましたが、同じエラーが発生しました。ここで
import * as React from 'react';
import WbsLayout from "../layout/WbsLayout";
interface WbsProps {}
interface WbsState {
wbsElements: any[];
wbsEdges: any[]
}
class Wbs extends React.Component<WbsProps, WbsState>{
public cy: Cy.Instance;
private layout: WbsLayout;
private s: snap.Paper;
private renderer: WbsRenderer;
public state : WbsState;
constructor(props: WbsProps, layout: WbsLayout) {
super(props);
this.layout = layout;
this.cy = this.layout.cy;
// this does show a json object in the console, hence layout can be accessed
console.log(layout.cy.elements().jsons());
this.layout.getWbsLayout(); //The error happens here
// initial state
this.state = {
wbsElements: [],
wbsEdges: [],
};
}
public render() {
const wbsElements: any = this.state.wbsElements.map((element: any) => (
<WbsElement
key={element.wbsElementBox.nodeId}
wbsElementBox={...element.wbsElementBox}
wbsElementTitle={...element.wbsElementTitle}
wbsElementId={...element.wbsElementId}
/>
));
const wbsEdges: any = this.state.wbsEdges.map((edge: any) => (
<WbsEdge
key={edge.edgeId}
edgeId={edge.edgeId}
sourceWbsElementData={...edge.sourceWbsElementData}
targetWbsElementData={...edge.targetWbsElementData}
/>
));
return (
<svg>
{wbsElements}
{wbsEdges}
</svg>
);
}
}
export default Wbs;
はWbsLayout
です: コンソール:私はWBS'コンストラクタでJSONオブジェクトを見ることができます
let graph: any = {
nodes: [],
edges: []
};
let layout: WbsLayout = new WbsLayout(graph);
let wbs = new Wbs(null, layout);
:
エクスポートクラスWbsLayout {
public cy: Cy.Instance;
constructor(graph: any, Options?: Options) {
this.cy = cytoscape({
headless: true,
elements: graph
});
}
public getWbsLayout(): any {
const wbsElements: any = this.cy.collection("node[visibility = 'visible']").map((n: Cy.CollectionNodes) =>
({
wbsElementBox: {
nodeId: n.data().id,
x: n.data().x,
y: n.data().y,
width: n.data().width,
height: n.data().height
},
wbsElementTitle: {
text: n.data().title
},
wbsElementId: {
text: n.data().wbsId
}
})
);
const wbsEdges: any = [
{
edgeId: '5',
sourceWbsElementData: {
nodeId: '1',
x:464.359375,
y:30,
width:100,
height:40,
layoutStyle: 0
},
targetWbsElementData: {
nodeId:'1.5',
x:867.875,
y:100,
width:130.84375,
height:40,
layoutStyle: 1
}
}
];
return {
wbsElements,
wbsEdges
};
}
....
}
export default WbsLayout;
は、ここで私はWBSをインスタンス化する方法です.log(layout.cy.elements()。jsons());
レンダリングで 'wbsElements'と' wbsEdges'関数を実行するべきだと考えてください – Li357
おそらく 'React.createElement'はコンポーネントをインスタンス化するときにコンストラクタに' WbsLayout'インスタンスを渡さないからです。 – Li357
どのように 'layout'をコンストラクタに渡していますか?あなたが何かを渡したいのであれば、 'props'を使ってやります。 –