大家看到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为javascript对象,所以可以传递,React.createElement(cli,
如果是字符串形式的reactClass呢?比如引入带有reactClass的jsx文件里带有
var hartBar = React.createClass({。。。
var reactEle = React.createElement( eval('hartBar'), {name:"aaa",lable:"bbb"}, null );
在这里我们看第一个参数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的使用方法,可以看出其使用方式非常灵活,在实际生产中我们应该选择适合于自己的方式方便快捷的进行开发。
相关推荐
《React.js技术详解:从phone-rep_React.js项目入手》 React.js,作为Facebook推出的一款用于构建用户界面的JavaScript库,已经成为了现代Web开发的重要组成部分。本篇文章将基于"phone-rep_React.js"项目,深入...
一.JSX简介 ...Babel 会把 JSX 转译成一个名为 React.createElement() 函数调用。 以下两种示例代码完全等效: const element = ( Hello, world! ); const element = React.createElement( 'h1
#### React基础概念详解 **1. JSX** JSX(JavaScript XML)是一种JavaScript的语法扩展,它允许开发者在JavaScript代码中编写类似HTML的标签语法。这种语法扩展极大地提高了UI组件的可读性和可维护性。在React中,...
React.createElement("div", null, React.createElement("h1", null, "Hello, ", name)); ``` **4. 兼容性与版本** `pyjsx-0.0.5`版本表明这是该库的一个早期版本,可能会有潜在的不稳定性或未实现的功能。"py3-...
以下是一些基于提供的面试题及答案的React知识点详解: 1. **Keys的作用**:在React中,keys帮助React识别列表中元素的变更。它们是唯一的标识符,用于Diff算法,使得React能跟踪哪些元素被添加、删除或更改,减少...
React.createElement()函数和JSX语法用于创建组件。 5. **React状态管理**:在React应用中,状态管理和数据流至关重要。可以使用React的props和state来管理组件内部的状态,或者使用Redux、MobX等第三方库进行全局...
在本资源"react-interview:卡老师视频详解React面试题"中,卡老师为我们深入剖析了React面试中可能遇到的问题,旨在帮助求职者或者开发者更好地理解React的核心概念和技术要点。以下是对React面试中常见知识点的详细...
- React使用JSX或React.createElement来创建虚拟DOM,并通过类组件或函数组件来定义组件,一般通过props接收外部传入的数据,通过state来维护组件状态。 - Vue则使用模板语法(如{{}}、指令等)来编写HTML结构,并...
2. `React.createElement()`:在函数式组件内部,我们通常使用JSX语法来创建React元素。实际上,JSX会被编译成`React.createElement()`函数调用。 3. Hook的引入:React 16.8版本引入了Hook,使得函数式组件也能...
组件可以通过`React.createElement`函数创建,或者使用JSX语法直接书写。 ```jsx function Welcome(props) { return <h1>Hello, {props.name}; } ``` 2. 类组件与函数组件:React支持两种类型的组件,函数组件和...
文档对象(Document Object)在JavaScript中扮演着...配合`jQuery`或现代框架(如React, Vue, Angular),`document`对象的使用将更加简洁高效。学习并掌握`document`对象,是每个JavaScript开发者进阶路上的必修课。
### JavaScript 省市地三级联动知识点详解 #### 一、概述 在现代Web开发中,经常需要实现省市地(或称省市县)三级联动功能,以方便用户选择地址信息。这种功能通常应用于表单填写场景,如用户注册、订单填写等...
### 常用JS实用大全知识点详解 #### 广告框与幻灯片效果实现 在Web开发中,实现广告框或幻灯片效果是非常常见的需求...此外,对于复杂的交互需求,推荐使用前端框架(如React、Vue.js等)来构建更加健壮的应用程序。
我们通常使用`addEventListener`方法将事件监听器绑定到元素,如`document.getElementById("myBtn").addEventListener("click", function() {...});`。 JavaScript还有强大的DOM操作能力,Document Object Model是...
**JavaScript 实现无刷新分页详解** 在网页开发中,分页是一种常见的数据展示方式,尤其是在处理大量数据时。传统的分页通常通过页面跳转实现,但这种方式会导致页面整体刷新,用户体验相对较差。随着前端技术的...
【JavaScript图片轮播特效详解】 在网页设计中,图片轮播和焦点图是常见的交互元素,它们能够...对于更复杂的场景,可以使用现有的库或框架,如jQuery、Swiper.js或React-Slick等,它们提供了更完善的轮播功能和优化。
5. **前端框架和库**:虽然描述中没有明确提及,但考虑到现代前端开发趋势,项目可能使用了如jQuery、React、Vue等库或框架简化前端开发,提高代码复用性和可维护性。 6. **HTML和CSS**:HTML用于构建网页结构,CSS...
- **DOM操作**:通过`document.querySelector`、`document.createElement`等方法对DOM元素进行增删改查,实现动态内容更新。 - **动画效果**:利用`requestAnimationFrame`实现平滑的动画过渡,比如轮播图的切换...
var serviceDeskButton = document.createElement('div'); serviceDeskButton.id = 'serviceDeskButton'; serviceDeskButton.className = 'service-desk-button'; document.body.appendChild(serviceDeskButton)...