以下列形式编写import语句时会发生什么:
import React, { Component } from 'react';
导入模块的解构是在解构对象以实现Component
而不是需要React.Component
时发生的吗?或者它是使用具有完全不同语法的命名导出导入的,尽管它确实类似于解构?
一个重要的推论问题:与import React, { Component } ...
相比,Component
模块React
会不必从import React ...
模块加载Component
两次(假设为1. private string path;// = Application.dataPath + "/Resources/";
2. private string filename = "Magnelli_0.27.txt";
3. private TextAsset asset;
4. private string str;
5. private string[] names;
6. private Vector3 ViewPosition;
7. private double ViewZPosition;
8.
9. private int length;
10. private double[] arrZ;
11. private double[] arrCV;
12.
13. // Use this for initialization
14. void Start () {
15. Screen.sleepTimeout = SleepTimeout.NeverSleep;
16. //AssetDatabase.ImportAsset(path);
17. //LoadTextFile();
18.
19. path = Application.dataPath + "/Resources/";
20. asset = Resources.Load ("Magnelli_0.27")as TextAsset;
21. str = asset.ToString();
22. names = str.Split('\n');
23. length = names.Length;
24.
25. Debug.Log ("length: " + length);
26. //Debug.Log ("str: " + str);
27. Debug.Log ("names[0]: " + names[0] + "names[1]: " + names[1]);
28. //Debug.Log (asset.text);
29. }
30.
31. // Update is called once per frame
32. void Update () {
33.
34. ViewPosition = GameObject.FindWithTag("MainCamera").transform.position;
35. ViewZPosition = ViewPosition.z;
36.
37. StreamReader reader = new StreamReader (path + filename);
38.
39. TextReader txtreader = new StringReader (asset.text);
40.
41. StringReader streader = new StringReader (asset.text);
42.
43. string txt = "";
44.
45. arrZ = new double[length];
46. arrCV = new double[length];
47.
48. for (int i = 0; i < length; ++i) {
49.
50. txt = streader.ReadLine();
51. //Debug.Log ("txt: " + txt);
52. string[] sprite = txt.Split (' ');
53.
54. foreach (string b in sprite) {
55. //Debug.Log ("b: " + b);
56. }
57.
58.
59.
60. arrZ[i] = Convert.ToDouble(sprite[0]);
61. arrCV[i] = Convert.ToDouble(sprite[1]);
62. }
63.
64. // clear memories
65. reader.Dispose();
66.
67. for (int i = 0; i < length; i++) {
68.
69. if ((arrZ[i])*100-0.2 < ViewZPosition & (arrZ[i])*100+0.2 > ViewZPosition)
70. {
71.
72. GetComponent<Text>().text = "redshift z : " + ViewZPosition*0.01 + "\nComoving Volume : " + arrCV[i] + " Gpc³";
73. }
74. }
75.
76. reader.Close ();
77. txtreader.Close ();
78.
79. }
是更大的React库的组成部分)?
答案 0 :(得分:3)
回答你的第一个问题:
不,这不是对象解构。语法可能已设置为相关的方式,但没有确认它们是故意使其相关的。每the ECMAScript 2015 Language Specification:
第15.2.2节进口
<强>语法强>
[...]
ImportClause : [...] ImportedDefaultBinding , NamedImports
[...]
NamedImports : { } { ImportsList } { ImportsList , }
这是完全独立的语法。
回答你的第二个问题:
是的,它会导入两次,一次React
,默认导出为React.Component
,一次为Component
作为命名导出。每the specification:
第12.2.2节静态语义:BoundNames
[...]
ImportClause : ImportedDefaultBinding , NamedImports
让
names
成为ImportedDefaultBinding
的BoundNames。附加
names
NamedImports
的BoundNames的元素。- 醇>
返回
names
。
正如您所看到的,您使用import React, { Component }
导入的名称被绑定两次,这意味着您将React
作为默认导出,因此React.Component
,然后绑定名称{{1还会附加到导入的名称。你基本上在两个不同的绑定或名称下得到它两次。
应该注意,只有绑定名称不同。 Component
和React.Component
引用相同的对象,只是使用不同的绑定,因为您使用命名导出导入。导入Component
后,React
已导入。所有React.Component
都会创建一个与已导入对象的新绑定。
答案 1 :(得分:2)
import
语法中没有发生解构。即使它看起来有点类似 - 它是一个单独的语法。
导入的标识符绑定到模块初始化期间创建的对象。所以实际上你得到2个绑定到同一个对象,这需要你额外的1个参考,仅此而已。
无论您在源代码树中导入模块多少次,它都只会初始化一次,所有值只创建一次。并且所有import
语句基本上都是&#34; bind&#34;到内存中的值而不创建重复项。