一个 的 元件 强> 是一个简单的对象,用DOM节点或其他组件描述您想要在屏幕上显示的内容。元素可以在其道具中包含其他元素。创建React元素很便宜。一旦创建了一个元素,它就永远不会发生变异。 React元素的对象表示如下,
const element = React.createElement( 'div', {id: 'login-btn'}, 'Login' )
上面的createElement返回如下对象,
{ type: 'div', props: { children: 'Login', id: 'login-btn' } }
最后使用ReactDOM.render渲染到DOM,如下所示,
<div id='login-btn'>Login</div>
而a 的 零件 强> 可以用几种不同的方式声明。它可以是一个带有render()方法的类。或者,在简单的情况下,可以将其定义为函数。在任何一种情况下,它都将props作为输入,并返回一个元素树作为输出。 JSX最后被编译为createElement。
function Button ({ onLogin }) { return React.createElement( 'div', {id: 'login-btn', onClick: onLogin}, 'Login' ) }
组件是用于创建元素的工厂。
一个 React Element 你会认为是一个基本的html(dom to be precise)元素。它只是一种创建元素而不使用备受争议的jsx格式的方法。
React Element
一个 React Component 是你可以考虑作为一个对象。它有它的方法,支持 React lifecycles 并且通常是不可用的(至少还没有找到任何重用,欢迎举例)。它必然需要一个渲染功能。
React Component
React lifecycles
一个 React Class 就是你所说的课程。功能明智 React Class 和 React Component 是一样的只有语法才是真正的变化 React Component 是根据 ES6 syntax 。另一个主要变化是除非使用箭头函数,否则不再支持函数的默认绑定。 Mixins 也不再受支持 ES6 。
React Class
ES6 syntax
Mixins
ES6
React Element只是一个普通的旧JavaScript Object 没有自己的方法。它基本上有四个属性:
Object
type
String
key
ref
props
React Element不是React Component的实例。它只是一个简化的“描述”React组件实例(或取决于 type 要创建的HTML标记应该是这样的。
描述React组件的React元素不知道它最终呈现的DOM节点 - 这个关联是抽象的,并且在渲染时将被解析。
React Elements可以包含子元素,因此能够形成表示Virtual DOM树的元素树。
自定义React组件由。创建 React.createClass 或通过扩展 React.Component (ES2015)。如果实例化React组件,则需要a props Object 并返回一个实例,称为React Component Instance。
React.createClass
React.Component
React组件可以包含状态,并且可以访问React Lifecycle方法。它必须至少有一个 render 方法,在调用时返回React元素(-tree)。请注意,您永远不会自己构建React组件实例,但让React为您创建它。
render
React Element - 这是一个简单的对象,它描述了一个DOM节点及其可以说的属性或属性。它是一个不可变的描述对象,您不能在其上应用任何方法。
例如 -
<button class="blue"></button>
React Component - 它是一个接受输入并返回React元素的函数或类。它必须保持对其DOM节点和子组件实例的引用。
const SignIn = () => ( <div> <p>Sign In</p> <button>Continue</button> <button color='blue'>Cancel</button> </div> );
有 三 这里涉及的相关事物,有自己的名字:
这有点令人惊讶,因为如果你习惯了其他UI框架,你可能会认为只有两种东西,大致对应于类(比如 Widget )和实例(如 new Widget() )。在React中并非如此;组件实例是 不 与元素相同的东西,它们之间也没有一对一的关系。为了说明这一点,请考虑以下代码:
Widget
new Widget()
import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; class MyComponent extends React.Component { constructor(props) { super(props); console.log('This is a component instance:', this); } render() { const another_element = <div>Hello, World!</div>; console.log('This is also an element:', another_element); return another_element; } } console.log('This is a component:', MyComponent) const element = <MyComponent/>; console.log('This is an element:', element); ReactDOM.render( element, document.getElementById('root') );
在上面的代码中:
MyComponent
element
null
another_element
"div"
React团队的博客文章详细探讨了React具有这三个不同概念的设计原因 反应组件,元素和实例 ,我建议阅读。
最后,应该注意的是,虽然官方文档严格使用术语“组件”来引用函数或类,而“组件实例”引用实例,但其他来源不一定遵守这个术语;在GitHub上阅读Stack Overflow答案或讨论时,您应该会看到“组件”使用(错误地)表示“组件实例”。
将Component视为一个类,将Element视为一个实例。而已!