我试图在React中了解'Components'。
我有几个问题,所以我想我的社区是最好的问题。
1 - 当我们这样做时:
var foo = React.createClass ({
...
});
Console.log告诉我这是一个构造函数。所以当我们做<foo />
时,我们正在创建一个foo的实例(对象),对吗?
2 - 我特别对this
感到困惑,这是一个例子:
var bar = React.createClass ({
render = function () {
if (this.props.xyz) {
...
}
}
});
现在<bar />
是foo的子组件。当bar
实例被实例化时,this
应该引用'bar',不是吗?为什么它仍然引用foo
?
3 - 假设我创建了<foo />
的多个实例。我们如何存储对每个特定对象的引用?
答案 0 :(得分:1)
Foo
是一个组件类,<Foo />
创建了所谓的 React元素,它是您希望React呈现的组件类的轻量级描述; <Foo />
实际上变成了React.createElement(Foo)
,它返回一个简单的对象。它实际上并不是在那时创建一个实例。 React在协调阶段查看这些元素,并在幕后实例化所需的组件。
有关术语的详细信息,请参阅React (Virtual) DOM Terminology。
Bar
从其render方法返回描述Foo
的React元素,则 Foo
只是Bar
的子组件。在任何情况下,this
都指向当前的Bar
组件,this.props.xyz
指的是当前Bar
组件的道具。例如,如果你做了
var Foo = React.createClass ({
render: function() {
return <Bar xyz="test" />;
}
});
然后在Bar
内,this.props.xyz
将是值“test”,它从其父{{1}传递给Bar
(就像函数的参数一样) }。
如果确实需要,您可以使用refs来访问组件实例,但特别是在开始时,我建议不要这样做。这通常不是在React中完成任务的正确方法,您只需要在相对罕见的情况下访问组件实例。
答案 1 :(得分:0)
正确。 foo
就像一个构造函数,但在场景下,当您键入React.createElement(foo, null)
时,它会使用<foo />
。
this
在这种情况下会引用bar
的实例,而不是构造函数。
要保留foo
的多个实例,只需将它们保存在常规变量中即可。
a = React.createElement(foo, null); //or a = <foo />
b = React.createElement(foo, null); //or b = <foo />
PS:约定为CamelCase
班级名称(foo
成为Foo
)