我在JSX文件和构造函数中创建了一个React组件:
this.state = {data: [[200,100],[50,60],[100,300]] };
这完全没问题。它运行得很好。
但是,如果我添加:
this.state = {linedata: [{x:200,y:100},{x:50,y:60},{x:100,y:300}] };
我明白了:
d3.js:265 Uncaught TypeError: Cannot read property 'length' of undefined
我很遗憾为什么会这样。数据应该以某种方式格式化吗?
答案 0 :(得分:3)
您是否尝试在初始分配后重新分配Sub Tester()
Const S_MATCH As String = "td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']"
Dim e, tbl, bHit As Boolean
'...
'load page etc
'...
'get all the matching rows and cycle though them
For Each e In IEDoc.querySelectorAll(S_MATCH)
'did we get to the table of interest yet?
If Not bHit Then
Set tbl = e.ParentNode.ParentNode.ParentNode.ParentNode. _
ParentNode.ParentNode.ParentNode
If IsPartUsageTable(tbl) Then bHit = True
End If
If bHit Then
'we reached the table of interest, so
' do something with e
End If
Next
End Sub
Function IsPartUsageTable(tbl) As Boolean
Dim e, rv As Boolean
For Each e In tbl.getElementsByClassName("SectionHead")
If Element.innerHTML = "Part Usage" Then
rv = True
Exit For
End If
Next
IsPartUsageTable = rv
End Function
?你永远不应该手动设置组件状态;而是使用this.setState
。
答案 1 :(得分:1)
在React中,每个组件的state
都是一个简单的JavaScript对象。在您的第一个示例中,由于您说组件呈现得很好,因此您的组件似乎使用了data
的{{1}}属性。
如果您将其更改为this.state
,则this.state.linedata
将为this.state.data
。您应该更新您的组件,以便从undefined
而不是this.state.linedata
读取。
您编写this.state.data
函数的方式以及在代码中使用d3的方式的更多示例将有助于您提供更精确和有用的答案。