一、基础

1、JSX是什么

JSX是一种像下面这样的语法:

const element =

Hello, world!

;

它是一种JavaScript语法扩展,在React中可以方便地用来描述UI。

本质上,JSX为我们提供了创建React元素方法(React.createElement(component, props, ...children))的语法糖(syntactic sugar)。上面的代码实质上等价于:

var element = React.createElement(

"h1",

null,

"Hello, world!"

);

2、JSX代表JS对象

JSX本身也是一个表达式,在编译后,JSX表达式会变成普通的JavaScript对象。

你可以在if语句或for循环中使用JSX,你可以将它赋值给变量,你可以将它作为参数接收,你也可以在函数中返回JSX。

例如下面的代码:

function getGreeting(user) {

if (user) {

return

Hello, {formatName(user)}!

;

}

return

Hello, Stranger.

;

}

上面的代码在if语句中使用JSX,并将JSX作为函数返回值。实际上,这些JSX经过编译后都会变成JavaScript对象。

经过babel会变成下面的js代码:

function test(user) {

if (user) {

return React.createElement(

"h1",

null,

"Hello, ",

formatStr(user),

"!"

);

}

return React.createElement(

"h1",

null,

"Hello, Stranger."

);

}

3、在JSX中使用JavaScript表达式

在JSX中插入JavaScript表达式十分简单,直接在JSX中将JS表达式用大括号括起来即可。例如:

function formatName(user) {

return user.firstName + ' ' + user.lastName;

}

const user = {

firstName: 'Harper',

lastName: 'Perez'

};

const element = (

Hello, {formatName(user)}!

);

ReactDOM.render(

element,

document.getElementById('root')

);

上面的代码中用到了函数调用表达式fromatName(user)。

在JavaScript中,表达式就是一个短语,Javascript解释器会将其计算出一个结果,常量就是最简单的一类表达式。常用的表达式有:

变量名;

函数定义表达式;

属性访问表达式;

函数调用表达式;

算数表达式;

关系表达式;

逻辑表达式;

需要注意的是,if语句以及for循环不是JavaScript表达式,不能直接作为表达式写在{}中,但可以先将其赋值给一个变量(变量是一个JavaScript表达式):

function NumberDescriber(props) {

let description;

if (props.number % 2 == 0) {

description = even;

} else {

description = odd;

}

return

{props.number} is an {description} number

;

}

4、JSX属性值

你可以使用引号将字符串字面量指定为属性值:

const element =

注意这里的”0”是一个字符串字面量。

或者你可以将一个JavaScript表达式嵌在一个大括号中作为属性值:

const element = ;

这里用到的是JavaScript属性访问表达式,上面的代码将编译为:

const element = React.createElement("img", { src: user.avatarUrl });

5、JSX的Children

首先JSX可以是一个不包含Children的empty tag。如:

const element = ;

JSX也可以像HTML标签一样包含Children:

const element = (

Hello!

Good to see you here.

);

这种写法在生成React元素的时候给我们带来了很大的便利,而且能够更加直观地描述UI。不然我们需要像下面这样创建和上面代码等价的React元素:

const element = React.createElement(

"div",

null,

React.createElement(

"h1",

null,

"Hello!"

),

React.createElement(

"h2",

null,

"Good to see you here."

)

);

tip: React DOM结点使用骆驼拼写法给属性命名

例如:class在JSX中应写作className,tabindex应写作tabIndex。

另外关于JSX的children需要注意的是:

React自定义组件的chilren是不会像固有的HTML标签的子元素那样自动render的,我们看下面的例子:

代码1

class Test extends React.Component {

render() {

return (

Here is a list:

  • Item 1
  • Item 2

)

}

};

ReactDOM.render(

,

document.getElementById('test')

);

以上代码定义的组件中都是build-in组件,类似div、p、ul、li等。它们中的子元素会直接render出来,像下面这样:

但是如果你使用用户定义组件,比如:

class Test extends React.Component {

render() {

return (

Here is a list:

  • Item 1
  • Item 2

)

}

};

class Em extends React.Component {

render() {

return (

}

}

ReactDOM.render(

,

document.getElementById('test')

);

并不能得到跟上面代码1一样的结果,我们得到的只是一个空的div标签:

如果你想得到和代码1一样的结果,需要显示地指定props.children,像下面这样:

class Test extends React.Component {

render() {

return (

Here is a list:

  • Item 1
  • Item 2

)

}

};

class Em extends React.Component {

render() {

return (

{this.props.children}

);

}

}

ReactDOM.render(

,

document.getElementById('test')

);

得到下面的结果:

6、JSX可自动防范注入攻击

在JSX中嵌入接收到的内容是安全的,比如:

const danger = response.potentialDanger;

cosnt ele =

{title}

在默认情况下,React DOM会将所有嵌入JSX的值进行编码。这样可以有效避免xss攻击。

我们将以下代码编译后引入html:

class Test extends React.Component {

render() {

let v = "

return (

{v}

)

}

};

ReactDOM.render(

,

document.getElementById('test')

);

得到结果是:

可以看到通过JSX插入的文本自动进行了HTML转义,所以这里插入的是一段文本,而不是

作为对比,换作使用DOM元素的innerHTML属性:

document.getElementById("test").innerHTML="

jsx怎么往js里传参数_JSX语法使用详解——终极版相关推荐

  1. JSX语法使用详解——终极版

    一.基础 1.JSX是什么 JSX是一种像下面这样的语法: const element = <h1>Hello, world!</h1>; 它是一种JavaScript语法扩展 ...

  2. jsx怎么往js里传参数_实践Vue 3.0做JSX(TSX)风格的组件开发

    作者:莫夭 转发链接:https://zhuanlan.zhihu.com/p/102668383 前言 我日常工作都是使用React来做开发,但是我对React一直不是很满意,特别是在推出React ...

  3. jsx怎么往js里传参数_在vue中使用jsx语法的使用方法

    什么是JSX? JSX就是Javascript和XML结合的一种格式.React发明了JSX,利用HTML语法来创建虚拟DOM.当遇到 我为什么要在vue中用JSX? 想折腾一下呗,开玩笑.最开始是因 ...

  4. jsx怎么往js里传参数_给js文件传参数(详解)

    一.利用全局变量 这是最简单的一种方式,比如Google Adsense: 缺点是引入了全局变量.其中引入文件的方式还有两个变体: // 变体1:用document.write输出 document. ...

  5. jsx怎么往js里传参数_Angular、React 当前,Vue.js 优劣几何?

    在过去一年里,前端开发发展迅速,前端工程师的薪资亦是水涨船高.2019 更是热度不减,而作为近年来尤为热门的前端框架,Vue.js 自是积累了大量关注.那么,Vue.js 是适合你的框架吗? 以下为译 ...

  6. mysql启动参数(/etc/my.cnf)详解汇总

    mysql启动参数(/etc/my.cnf)详解汇总 MYSQL–my.cnf配置中文详解 basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = ...

  7. MOS管参数-MOS管参数含义说明及详解

    文章转自:MOS管参数-MOS管参数含义说明及详解-KIA MOS管 地址链接:http://www.kiaic.com/article/detail/1014.html MOS管分类说明 MOS管参 ...

  8. python代码图片头像_Flask 上传自定义头像的实例详解

    Flask Web 开发这本书基本上做完了,后面还需要温习,但是自己做的博客总觉得简陋了点,所以,在动脑子开发新功能 今天想到最基本的功能,自定义头像 那这样的功能,设计到2大基本功能块 1:如何进行 ...

  9. linux上连接ftp服务器,linux下lftp连接ftp服务器进行上传与下载的方法详解

    摘要 腾兴网为您分享:linux下lftp连接ftp服务器进行上传与下载的方法详解,中英翻译,中建在线,掌上看家,银行帮等软件知识,以及微信一键转发工具,小学英语冀教版,正是在下表情包,易问电信,万能 ...

最新文章

  1. android socket握手,HttpURLConnection抛出java.net.SocketTimeoutException:在Android 4.1.1中SSL握手超时...
  2. C++中map的用法
  3. Git提交时关于vim的错误
  4. 苹果平板可以用html么,9.7寸ipad pro能用pencil吗?ipad pro全面支持Apple Pencil
  5. vue day8 table page
  6. GCD介绍(二): 多核心的性能
  7. linux jmeter 内存,怎么在Linux下改变JMeter内存
  8. 第二章 生成、打包、部署和管理应用程序及类型
  9. 【小松教你手游开发】【游戏渲染】单色shader,纹理shader
  10. Python图片爬虫
  11. HeidiSQL软件推荐( MySQL 服务器和数据库管理的图形化界面)
  12. 阿里云批量发送短信接口Api
  13. 初探Flowable流程引擎,偶遇多实例子流程
  14. GitHub上Java捕鱼达人源码分析(fishlord)
  15. 分享一个强大的数据可视化低代码开发平台
  16. 股票账户各权限开通条件总结【干活总结】
  17. Stream流中常用的方法
  18. 理解Marx-5 从巴黎到布鲁塞尔,创立历史唯物主义
  19. Java 生成Word文档 — 简单示例
  20. easyExcel文件上传与下载

热门文章

  1. eclipse代码编辑区字符串自动转义设置
  2. DAY3 scp,rsync,chmod,chown,setfacl
  3. win7 64位系统配置服务器,Tomcat服务器win764位配置方法
  4. 【汇编语言与计算机系统结构笔记19】虚存概念初步,MIPS内存管理
  5. Java获得不同格式的系统时间
  6. mac git 命令自动补全
  7. nginx 新上线、机房白名单
  8. EDA鸿蒙是不是,如果华为不强研鸿蒙,和阿里合作,新系统或早用到手机上了? - 区块网...
  9. Ubuntu系统(四)-修改主机名和配置DNS上网
  10. centos redis make 报错_ubuntu 18.04 搭建 redis 实验环境