什么是JSX

JSX是JavaScript XML,是React提供的Syntax Sugar, 能让我们可以在JS中写html标记语言。

其表现是如何:

常规的html代码都可以写,可以通过{props}往html中插入变量或任意有效的JS表达式,而无须加上$

此外还可以插入带参数的函数{func(props)}

Hello, {getName(props)}

JSX被编译后,是一个函数调用,返回值为JS对象,故JSX也可作为表达式,例如用于If判断

可以在标签中添加属性,属性值若是字符串,则加上引号,若是对象或表达式,则加上{}. ""与{}不能混用。由于JSX更贴近JS,故属性的key建议使用驼峰法写法

const element =

const element = ;

若JSX元素没有子元素/节点,可以单闭合

const element = ;

可以给html添加类但class需改写成className,另外若添加自定义的要渲染的属性,最好以data-开头

JSX将XML语法加入到JavaScript中,在JS中写了JSX将会被预处理成React Element

为什么React要创建JSX:

渲染的逻辑处理与UI逻辑其实是耦合的, event, state, data互相关联,既然如此,那么就把html标记语言与逻辑处理相关的js内容放在一起,组成一个松耦合的模块,这个模块就是JSX元素

写JSX实际做了什么

首先怎么才能写JSX呢,在普通的JS文件中需引入react,reactDOM(若要对DOM进行操作)以及babel或者通过Babel在线编译

JSX其实是一个对象,而且这个对象内的值都被进行了转义(escape),见以下的例子:

var esca = 5>3{true && '--this is true'}

console.log(esca)

ReactDOM.render(

esca,

document.getElementById('root')

);

输出结果如下

JSX转义.png

什么? 我的true呢?

让我们把代码放到Babel看下JSX生成了什么东西

//Babel输出

var esca = React.createElement(

'a',

{ href: 'https://baidu.com' },

React.createElement(

'span',

null,

'5>3 ',

true && '$gt;this is true'

)

);

可以看到react将JSX代码片段分为几块,类型(元素名), 属性值props(包含children和属性参数等), key和ref, owner和store

我们发现没有被{}包住的默认是字符串,会进行转义,而{}包住的则会被当作表达式,不被转义,由于true是真,故显示后面的值,但问题来了,若我们想在表达式里要进行转义成HTML呢?

方法一: 使用Unicode编码

var esca = 5>3 {true && '\u003Ethis is true'}

//这样在表达式里也可以进行转义了

注意,若是直接使用var esca = React.createElement('span', null, '5>3 this is true;')创建的,字符串和表达式内的均不会进行转义

方法二: 使用dangerouslySetInnerHTML

var esca = 5>3{true &&}

//或者定义一个新的JS元素,将需要转义的内容放入

等价于

var esca = React.createElement(

'a',

{ href: 'https://baidu.com' },

'5>3',

true && React.createElement('span', { dangerouslySetInnerHTML: { __html: ' >this is true' } })

);

方法三:在{}通过数组将字符串和表达式包裹在一起

{['First ', ·, ' Second']}

此外对于某些字体图标,可以使用以下的方法

关于JSX防范XSS攻击

XSS是跨站脚本注入攻击, 更多解释可查看这里

由于当你尝试通过{html}进行插入html代码时, React会自动将html转为字符串,故React可部分防止XSS攻击

例如以下代码

const username = "";

class UserProfilePage extends React.Component {

render() {

return (

Hello {username}!

);

}

}

ReactDOM.render(, document.querySelector("#app"));

显示为

xss_{}.png

JSX中是通过传入函数作为事件处理方式,而不是传入字符串,字符串可能包含恶意代码

尽管如此,还是可以通过一些手段进行XSS攻击,如:, , const aboutUserText = "";

class AboutUserComponent extends React.Component {

render() {

return (

);

}

}

ReactDOM.render(, document.querySelector("#app"))

或者通过设置a的href为javascript:xxx

const userWebsite = "javascript:alert('Hacked!');";

class UserProfilePage extends React.Component {

render() {

return (

My Website

)

}

}

ReactDOM.render(, document.querySelector("#app"));

以及使用base64 编码的数据进行替换

const userWebsite = "data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGFja2VkISIpOzwvc2NyaXB0Pg==";

class UserProfilePage extends React.Component {

render() {

const url = userWebsite.replace(/^(javascript\:)/, "");

return (

My Website

)

}

}

ReactDOM.render(, document.querySelector("#app"));

又或从用户处接受了被恶意控制的props

const customPropsControledByAttacker = {

dangerouslySetInnerHTML: {

"__html": ""

}

};

class Divider extends React.Component {

render() {

return (

);

}

}

ReactDOM.render(, document.querySelector("#app"));

更多可参考

jsx怎么往js里传参数_JSX详解相关推荐

  1. jsx怎么往js里传参数_JSX语法使用详解——终极版

    一.基础 1.JSX是什么 JSX是一种像下面这样的语法: const element = Hello, world! ; 它是一种JavaScript语法扩展,在React中可以方便地用来描述UI. ...

  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. php js跨域上传文件,Jquery实现跨域异步上传文件步骤详解

    这次给大家带来Jquery实现跨域异步上传文件步骤详解,Jquery实现跨域异步上传文件的注意事项有哪些,下面就是实战案例,一起来看一下. 先说明白 这个跨域异步上传功能我们借助了Jquery.for ...

  7. 【python教程入门学习】Python函数定义及传参方式详解(4种)

    这篇文章主要介绍了Python函数定义及传参方式详解(4种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一.函数初识 1.定 ...

  8. fileinput 时间_JavaScript_Bootstrap Fileinput文件上传组件用法详解,最近时间空余,总结了一些关...

    最近时间空余,总结了一些关于bootstrap fileinput组件的一些常见用法,特此分享到phpstudy平台,供大家参考,同时也方便以后的查找.本文写的不好还请见谅. 一.效果展示 1.原始的 ...

  9. find linux 目录深度_浪里淘沙,详解Linux系统中Find命令的实用技巧

    知了小巷:浪里淘沙,详解Linux系统中Find命令的实用技巧. 啊哈,找到了! 当我们需要在Linux系统上定位某个文件或目录时,find命令通常是必备之选. 它使用起来非常简单,但有许多不同的可选 ...

  10. js购物车功能php,使用JS实现购物车功能步骤详解

    这次给大家带来使用JS实现购物车功能步骤详解,使用JS实现购物车功能的注意事项有哪些,下面就是实战案例,一起来看一下. 我们肯定都很熟悉商品购物车这一功能,每当我们在某宝某东上购买商品的时候,看中了哪 ...

最新文章

  1. 使用Rust + Electron开发跨平台桌面应用 ( 一 )
  2. 【干货】从零开始做运营(超详细脑图)
  3. android app通过Geth RPC接口实现远程调用
  4. android使用tabhost实现导航
  5. RHCE 学习笔记(16) - KickStart
  6. SpringMVC之RequestParam详解
  7. vnx 服务器映射,EMC VNX5200/5400存储 新增LUN与Hosts映射操作(示例代码)
  8. 25个Java机器学习工具和库
  9. HierachyViewer的使用
  10. .NET生成ICO图标
  11. 彻底清除Mac缓存数据的方法,这样清理Mac缓存数据太干净了
  12. C# Bitmap引用System.Drawing报错 “...不存在类型命名空间名...”的修复
  13. Typora+PicGo+坚果云搭建个人云笔记系统
  14. Unity摄像机对象锁定旋转运镜模拟
  15. Qt 与 Qt Creator 简介
  16. 万能的尾盘选股技巧!今日学明天买,后天稳健盈利!短线炒股一定要收藏!
  17. 如何把位图转成矢量图
  18. 基于springboot实现大学生租房系统演示【附项目源码】
  19. c语言中字符串去掉逗号,JS四种方法去除字符串最后的逗号
  20. ffdshow的编译

热门文章

  1. 利用计算机为祖国做贡献的人,李晓维:祖国,我把科研事业献给您
  2. 程序员个人修养和职业规划
  3. 手机计算机数据消失了怎么恢复,手机数据丢失的恢复方法
  4. Java越学越迷茫,应该怎么办?
  5. SRE 到底是干什么的??
  6. Lora sx1278+stm32(ADC录音)+SPPEX音频压缩 数字对讲机
  7. html5做微信公众号文章代码,微信公众号文章怎么使用代码排版?
  8. boost::bind 详解
  9. 站长咪咪网整理的Linux命令大全
  10. Windows如何设置夜间模式(护眼模式)超简单