这是官网上的一个简单的例子

const name = 'Josh Perez';
const element = <h1>Hello, {name}</h1>; ReactDOM.render(
element,
document.getElementById('root')
);

从中可以看到:

     jsx    是可以在里面写js代码的,
    在{   }里面写js代码   
在这里我解释一下,为什么可以在react里的HTML标签里面的{}里写js代码
 
Babel 将JSX编译成 React.createElement() 调用。
而react就是运用了这个方法,例如
 
首先写一小段HTML代码
 
<ul  title='aa'>
<li>hello</li>
</ul>

这段代码在react里,因为我们使用react的时候都会引入react,因此react会自动解析成

React.createElement('ul',{
title:'aa'
},React.createElement('li',{},'hello'))

这两段代码所表示出来的结果是一样的

由此可以看出,react会将jsx花括号中的内容转化成js代码

这样,

你可以用 花括号 把任意的 JavaScript表达式嵌入到 JSX 中
 
同时也要注意,是可以将任意的JavaScript表达式嵌入其中,但是还是不能嵌入JavaScript语句,例如不能嵌入if  else语句,但是可以嵌入三元表达式
 
这就是 JSX ,他是 JavaScrip 的一种扩展语法。我们推荐在 React 中使用这种语法来描述 UI 信息。JSX 可能会让你想起某种模板语言,但是它具有 JavaScrip 的全部能力

从本质上讲,JSX 只是为 React.createElement(component, props, ...children) 函数提供的语法糖。

因为 JSX 被编译为 React.createElement 的调用,所以 React 库必须在你 JSX 代码的作用域中。

官网建议给组件以大写字母开头的方式命名。如果你已经有以小写字母开头的组件,需要在 JSX 中使用前,将其赋值给以大写字母开头的变量。

因为在react中,组件的引用必须是首字母大写,否则无法达到想要的结果

JSX 中的 props(属性)

属性有以下几种形式

1、你可以传递任何一个用 {} 包裹的 JavaScript 表达式作为 props(属性)

//JavaScript 表达式作为 props(属性)
<MyComponent foo={ + + + } />

2、你可以传入一个字符串字面量作为一个 props(属性)

<MyComponent message="hello world" />

<MyComponent message={'hello world'} />

3、如果你没给 prop(属性) 传值,那么他默认为 true

<MyTextBox autocomplete />

<MyTextBox autocomplete={true} />

4、如果你已经有一个 object 类型的 props,并且希望在 JSX 中传入,你可以使用扩展操作符 ...传入整个 props 对象。

function App1() {
return <Greeting firstName="Ben" lastName="Hector" />;
} function App2() {
const props = {firstName: 'Ben', lastName: 'Hector'};
return <Greeting {...props} />;
}

JSX 中的 Children(子元素)

1、您可以在开放标签和闭合标签中放入一个字符串,那么 props.children 就是那个字符串。这对于内置很多 HTML 元素时非常有用

<MyComponent>Hello world!</MyComponent>

2、通过使用 {} 包裹,你可以将任何的 JavaScript 元素而作为 children(子元素) 传递

<MyComponent>foo</MyComponent>

<MyComponent>{'foo'}</MyComponent>

3、props.children 的值可以是回调函数

// Calls the children callback numTimes to produce a repeated component
function Repeat(props) {
let items = [];
for (let i = ; i < props.numTimes; i++) {
items.push(props.children(i));
}
return <div>{items}</div>;
} function ListOfTenThings() {
return (
<Repeat numTimes={}>
{(index) => <div key={index}>This is item {index} in the list</div>}
</Repeat>
);
}

4、falsenullundefined,和 true 都是有效的的 children(子元素) 。但是并不会被渲染,下面的JSX表达式渲染效果是相同的,都是空

<div />

<div></div>

<div>{false}</div>

<div>{null}</div>

<div>{undefined}</div>

<div>{true}</div>

在有条件性渲染 React 元素时非常有用。如果 showHeader 为 true 时,<Header />会被渲染

<div>
{showHeader && <Header />}
<Content />
</div>

如果本文对您有帮助,请抬抬您的小手,点下右下角的推荐, ^-^,当然如果看了这篇博客对您有帮助是我最开心的事,毕竟赠人玫瑰,手有余香, ^-^,如果这篇博客没有帮助到您,那就只能说一声抱歉啦

react中的jsx详细理解的更多相关文章

  1. React中diff算法的理解

    React中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DO ...

  2. react中this.setState的理解

    this.setState作用? 在react中要修改this.state要使用this.setState,因为this.state只是一个对象,单纯的修改state并不会触发ui更新.所以我们需要用 ...

  3. 在 React 中使用 JSX 的好处

    优点: 1.允许使用熟悉的语法来定义 HTML 元素树: 2.提供更加语义化且移动的标签: 3.程序结构更容易被直观化: 4.抽象了 React Element 的创建过程: 5.可以随时掌控 HTM ...

  4. react中对于context的理解

    一.context旧版的基本使用 1.context的理解 当不想在组件树中通过逐层传递props或state的方式来传递数据时,可使用context来实现跨层级的组件数据传递. 2.context的 ...

  5. React生命周期简单详细理解

    前言 学习React,生命周期很重要,我们了解完生命周期的各个组件,对写高性能组件会有很大的帮助. Ract生命周期 React 生命周期分为三种状态 1. 初始化 2.更新 3.销毁 初始化 1.g ...

  6. react中key值的理解

    react利用key来识别组件,它是一种身份标识标识,相同的key react认为是同一个组件,这样后续相同的key对应组件都不会被创建有了key属性后,就可以与组件建立了一种对应关系,react根据 ...

  7. React.js深入学习详细解析

    今天,继续深入学习react.js. 目录: 一.JSX介绍 二.React组件生命周期详解 三.属性.状态的含义和用法 四.React中事件的用法 五.组件的协同使用 六.React中的双向绑定   ...

  8. React中JSX的理解

    React中JSX的理解 JSX是快速生成react元素的一种语法,实际是React.createElement(component, props, ...children)的语法糖,同时JSX也是J ...

  9. 深入理解react中的虚拟DOM、diff算法

    文章结构: React中的虚拟DOM是什么? 虚拟DOM的简单实现(diff算法) 虚拟DOM的内部工作原理 React中的虚拟DOM与Vue中的虚拟DOM比较 React中的虚拟DOM是什么?   ...

随机推荐

  1. fastText入门

    简介fastText是Facebook AI Research在2016年提出的文本分类和词训练的工具.它最大的特点:模型非常简单,训练速度快,并且能够达到与深度学习旗鼓相当的精度. 最近在做一个给微 ...

  2. MongoDB之shard_副本集和分片部署

    机器角色分配和拓扑环境如下: -------------------配置副本集s1-------------------------------1.创建目录在s1h1上创建如下目录[root@node ...

  3. vue项目中的路径别名

    每次写引入组件的路径,如果路径嵌套比较深,那么会比较麻烦,我们可以在webpack.base.conf.js,中设置路径的别名,默认webpack设置src的别名为@ 建议配置src下一级目录的别名, ...

  4. 用C++调用C的库函数(转载)

    转自:http://linhs.blog.51cto.com/370259/140927 C++调用C的库函数时,如果头文件定义得不恰当,可能会出现明明某函数在obj文件中存在,但是却发生链接失败的情 ...

  5. ecb-2.40与cedet-1.1的兼容(转载)

    转自:http://blog.csdn.net/cnsword/article/details/7474119 今天凑热闹把fedora升级到了17,emacs升级到了24,但是悲剧了,显示cedet ...

  6. 洛谷 - P1379 - 八数码难题 - bfs

    https://www.luogu.org/problemnew/show/P1379 #include <bits/stdc++.h> using namespace std; #def ...

  7. python 面向对象十二 元类

    一.类也是对象 只要使用关键字class,Python解释器在执行的时候就会创建一个对象.下面的代码段: class ObjectCreator(object): pass 将在内存中创建一个对象,名 ...

  8. 51Nod 1179 最大的最大公约数(暴力大法好)

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; ; in ...

  9. Linux源码编译处理

    1. 解决依赖问题 查询需要的依赖软件,提前安装好若使用命令行安装,一般使用默认路径:使用源码安装,则自定义安装路径,后续可能需要进行路径配置PS:可能需要在Makefile等配置文件中添加相关库文件 ...

  10. AtCoder Grand Contest 003 F - Fraction of Fractal

    题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_f 题目大意: 给定一个\(H×W\)的黑白网格,保证黑格四连通且至少有一个黑格 定义分形如下 ...