React.createElement方法使用详解
大家看到createElement方法,自然就想到了document.createElement()了。没错,这两个方法的名字是一样的。但是,这里我们要介绍的是React.createElement()而不是document.createElement()。
下面我们直接进入正题
React.createElement
首先我们看官方给出的解释
ReactElement createElement(
string/ReactClass type,
[object props],
[children ...]
)
React.createElement方法创建并返回一个给定类型的ReactElement元素。type参数可以是一个html标签名称字符串,也可以是一个ReactClasss。这个type参数对于createElement来说是必须的。第二个参数是该标签的属性,这个参数是可选的。第三个参数是该元素的子节点,同样也是可选的。
下面我们分别就第一个参数类型来做简单的介绍。
type参数 为html标签名称
type参数可以是一个html标签名称,也可以是一个ReactClass。首先我们看使用html标签的例子。这个例子来自官网,接下来所有的例子都是围绕这个例子进行改写。
例一
var child1 = React.createElement('li', null, 'First Text Content');
var child2 = React.createElement('li', null, 'Second Text Content');
var child3 = React.createElement('li', null, 'Third Text Content');
var root = React.createElement('ul', { className: 'my-list' }, child1, child2, child3);
ReactDOM.render(
root,
document.getElementById('content')
);
这个例子很简单,第一个参数是html标签的名称ul和li。我们看前三个createElement的第二个参数和第三个参数,因为上面不需要第二个参数,但是需要有第三个参数作为li的文本内容,也就是li的子内容,所以第二个参数赋值为null。
但是对于创建ul元素的createElement方法来说,同样第一个参数是html标签名称ul,第二个参数是一个props对象{ className: 'my-list'}。当然这里我们也可以添加其他的属性例如{ className: 'my-list', name:’ulname’}。这些属性可以通过this.props.name来调用。但是奇怪的是第二个参数以后有多个参数,这怎么解释。是不是createElement不止三个参数,从第二个参数往后,该节点有多少个子节点那就有多少个参数。可以这么认为,但是我们对上面的例子稍加改造就可以看出其实说createElement有三个参数也没有问题。
例二
var child1 = React.createElement('li', null, 'First Text Content');
var child2 = React.createElement('li', null, 'Second Text Content');
var child3 = React.createElement('li', null, 'Third Text Content');
var root = React.createElement('ul', { className: 'my-list' }, [child1, child2, child3]);
ReactDOM.render(
root,
document.getElementById('content')
);
我们将第二个参数以后的参数都放在数组里,这样就可以认为第三个参数是一个数组,数组中的元素就是该节点的所有子节点。
从这我们可以看出其实React的使用非常的灵活。
type参数 为ReactClass
我们看上面的例子,type参数为html标签名称。使用方法其实挺简单的,需要注意的是第二个参数和第三个参数。下面我们来看一下type类型为ReactClass的使用方法。
例三
var cli = React.createClass({
render:function(){
return (
<li>
{this.props.text}
</li>
)
}
})
var child1 = React.createElement(cli, {key:'F',text:'First Text Content'});
var child2 = React.createElement(cli, {key:'S',text:'Second Text Content'});
var child3 = React.createElement(cli, {key:'T',text:'Third Text Content'});
var root = React.createElement('ul', { className: 'my-list' }, [child1, child2, child3]);
ReactDOM.render(
root,
document.getElementById('content')
);
在这里我们看第一个参数cli就是createClass的返回值。需要注意的是,对于前三个li的createElement第二个参数要加上key:’value’ 这里的value彼此都不相同,如果不指定此属性——虽然也能按照逻辑正常显示——会报如下的警告
Warning: Each child in an array or iterator should have a unique "key" prop. Check the top-level render call using <ul>. See https://fb.me/react-warning-keys for more information.
当然如果上述例子中我们只创建了一个li元素,没有child2和child3,只有child1,那第二个参数的key属性也得指定,否则同样也是会报如上的警告。
对于例三我们也可以进行如下的改写
例四
var cli = React.createClass({
render:function(){
return (
<li>
{this.props.children}
</li>
)
}
})
var child1 = React.createElement(cli, {key:'F'},'First Text Content');
var child2 = React.createElement(cli, {key:'S'},'Second Text Content');
var child3 = React.createElement(cli, {key:'T'},'Third Text Content');
var root = React.createElement('ul', { className: 'my-list' }, [child1, child2, child3]);
ReactDOM.render(
root,
document.getElementById('content')
);
同样在createElement中指定第三个参数,在createClass中使用this.props.children进行引用。
上面就是React.createElement的使用方法,可以看出其使用方式非常灵活,在实际生产中我们应该选择适合于自己的方式方便快捷的进行开发。
相关文章
修复 Java 中的 NoSuchElementException 错误
发布时间:2023/11/13 浏览次数:178 分类:Java
-
本文介绍 Java 中的 NoSuchElementException 错误。异常是在程序执行期间发生的事件。发生异常时会影响正常的程序流程,导致程序异常终止。本文将讨论 java.util.NoSuchElementException 以及如何在 Java 中
Java 异常 Exception in Thread Main Java.Util.NoSuchElementException: No Line Fo
发布时间:2023/07/16 浏览次数:486 分类:Java
-
本篇文章介绍如何解决Java中的异常 Exception in thread "main" java.util.NoSuchElementException: No line found。java.util.NoSuchElementException 是运行时未经检查的异常
在 Java 中使用 Scanner 时没有此类元素异常
发布时间:2023/07/13 浏览次数:81 分类:Java
-
本篇文章将介绍如何在 Java 中使用 Scanner 时解决 NoSuchElementException 错误。在 Java 中使用 Scanner 时没有此类元素异常 Scanner 类用于在 Java 程序中获取用户输入。 它使用多种实用方法,如 next()、
修复 Python 中错误 ValueError: Setting an Array Element With a Sequence
发布时间:2023/07/09 浏览次数:1175 分类:Python
-
在 Python 中,当您尝试将无效的数据类型分配给数组时,会发生 ValueError: setting an array element with a sequence。 当您尝试将多个值分配给数组上的单个位置时,也可能会发生这种情况。
在 Angular 中使用 TypeScript 的 getElementById 替换
发布时间:2023/04/14 浏览次数:259 分类:Angular
-
本教程指南提供了有关使用 TypeScript 在 Angular 中替换 document.getElementById 的简要说明。这也提供了在 Angular 中 getElementById 的最佳方法。
Node.js 与 React JS 的比较
发布时间:2023/03/27 浏览次数:173 分类:Node.js
-
本文比较和对比了两种编程语言,Node.js 和 React。React 和 Node.js 都是开源 JavaScript 库的示例。 这些库用于构建用户界面和服务器端应用程序。
AngularJS 中的 getElementById 和 querySelector
发布时间:2023/03/24 浏览次数:106 分类:Angular
-
在本教程中,我们将了解我们在使用 Angular 元素、document.getElementById 和 querySelector 时遇到的不同问题以及如何解决它们。