文章目录
JSX介绍
- JSX其实就是JavaScript XML的缩写, 直译过来就是基于JavaScript的XML。
- JSX 作为一种JavaScript语法扩展,支持自定义属性,并具有很强的扩展性。
- JSX是React框架内置的语法, 且专用于React应用开发, 因此建议设计人员使用JSX方式来实现UI中的虚拟DOM。
通过React JSX方式定义的虚拟DOM,最终也会转换为通过createElement()方法实现虚拟DOM。
若要在React项目中使用JSX语法, 则必须引用“babel.js”来解析JSX,且在
<script>
标签中必须改用“type=“text/ babel””属性。
原因: 在使用“type=“text/babel””属性替换“type="text/javascript”属性后, 浏览器内置的JavaScript解释器就不会解析
JSX是一种像下面这样的语法:
const element = <h1>Hello, world!</h1>;
它是一种JavaScript语法扩展。
在React中可以方便地用来描述UI。
本质上,JSX为我们提供了创建React元素方法:
React.createElement()
上面的代码实质上等价于:
var element = React.createElement(
"h1",
null,
"Hello, world!"
);
JSX语法规则
- 标签中混入JS表达式时要用
{}
- 样式的类名指定不要用class,要用
className
- 内联样式,要用
style= {{key:value}}
的形式去写 - 只要一个根标签
- 标签必须闭合
- 标签首字母:
- 若小写字母开头,将该标签转为html中同名标签,若html’中无该标签对应的同名元素,则报错。
- 若大写字母开头,react就去渲染对应的组件,若组件未定义,则报错。
JSX的一般语法形式
const element = (
<tag-level-1>
<tag-level-2></tag-level-2>
</tag-level-1>
)
JSX的引用
- JSX在页面中直接定义
- 引入外部定义好的JSX独立文件来实现
import.js文件:
//先获取实际的dom
const reactDiv = document.querySelector('#app');
//使用JSX语法创建虚拟的DOM
const reactSpan = (
<span>
<h3>React JSX</h3>
<p>JavaScript XML语法</p>
</span>
)
//进行渲染
ReactDOM.render(reactSpan,reactDiv)
进行引用:
<body>
<div id="div-react"></div>
<script type="text/babel" src="../js/import.js"></script>
</body>
JSX算术表达式
在React JSX中使用JavaScript表达式要使用大括号{ }
括起来
<body>
<div id="div-react"></div>
<script type="text/babel">
var divReact = document.getElementById('div-react');
const reactSpan = (
<span>
<h3>JSX算术表达式:</h3>
<p>3+6 = {3+6}</p>
</span>
)
ReactDOM.render(reactSpan,divReact);
</script>
</body>
JSX条件表达式
在React JSX中使用JavaScript表达式无法使用if条件语句,但是可以使用条件运算符构成
条件表达式来替代if条件语句
<body>
<div id="div-react"></div>
<script type="text/babel">
var divReact = document.getElementById('div-react');
const reactSpan = (
<span>
<h3>JSX条件表达式:</h3>
<p>测试表达式:"1===1",return: { 1===1 ? 'true' : 'false'}</p>
<p>测试表达式:"1!==1",return: { 1!==1 ? 'true' : 'false'}</p>
</span>
)
ReactDOM.render(reactSpan,divReact);
</script>
</body>
JSX嵌入表达式
先定义一个变量,可以通过在JSX中引用该变量的方式使用该变量
<body>
<div id="div-react"></div>
<script type="text/babel">
var divReact = document.getElementById('div-react');
const name = '曹操';
const reactSpan = (
<span>
<h3>JSX嵌入表达式:</h3>
<p>用户姓名:{name}</p>
</span>
)
ReactDOM.render(reactSpan,divReact);
</script>
</body>
JSX对象表达式
JSX可以直接使用对象表达式,即完全支持obj.property的表达式形式
<body>
<div id="div-react"></div>
<script type="text/babel">
var divReact = document.getElementById('div-react');
const userinfo = {
name: '曹操',
gender: '男'
}
const reactSpan = (
<span>
<h3>JSX对象表达式:</h3>
<p>用户姓名:{userinfo.name}</p>
<p>用户性别:{userinfo.gender}</p>
</span>
)
ReactDOM.render(reactSpan,divReact);
</script>
</body>
JSX函数表达式
JSX可以直接调用JavaScript函数,即函数表达式
<body>
<div id="div-react"></div>
<script type="text/babel">
var divReact = document.getElementById('div-react');
const userinfo = {
name: '曹操',
gender: '男'
}
function showUserInfo(user) {
return '姓名:'+user.name+",性别:"+user.gender;
}
const reactSpan = (
<span>
<h3>JSX函数表达式:</h3>
<p>{ showUserInfo(userinfo) }</p>
</span>
)
ReactDOM.render(reactSpan,divReact);
</script>
</body>
JSX增强函数表达式
JSX中无法直接使用if条件语句。但可以通过函数表达式以变通的方式来使用,因为JSX可以作为参数传入并嵌套在另一个JSX中
<body>
<div id="div-react"></div>
<script type="text/babel">
var divReact = document.getElementById('div-react');
const userinfo = {
name: '曹操',
gender: '男'
}
function showUserInfo(user) {
return '姓名:'+user.name+",性别:"+user.gender;
}
function chooseUserInfo(user) {
if(user) {
return showUserInfo(user);
}else{
return '用户信息为空'
}
}
const reactSpan = (
<span>
<h3>JSX增强函数表达式:</h3>
<p>{ chooseUserInfo(userinfo) }</p>
<p>{ chooseUserInfo() }</p>
</span>
)
ReactDOM.render(reactSpan,divReact);
</script>
</body>
JSX数组表达式
<body>
<div id="div-react"></div>
<script type="text/babel">
var divReact = document.getElementById('div-react');
//定义数组
const arr = [
<p>姓名:刘备</p>,
<p>性别:男</p>
]
const reactSpan = (
<span>
<h3>JSX数组表达式:</h3>
<p>{ arr }</p>
</span>
)
ReactDOM.render(reactSpan,divReact);
</script>
</body>
JSX样式表达式
<body>
<div id="div-react"></div>
<script type="text/babel">
var divReact = document.getElementById('div-react');
const css1 = {
fontSize: 20,
fontStyle: 'bold',
color: 'red'
};
const css2 = {
fontSize: 12,
fontStyle: 'italic',
color: 'green'
};
const reactSpan = (
<span>
<h3>JSX样式表达式:</h3>
<p style = { css1 }>南栀</p>
<p style = { css2 }>南栀</p>
</span>
)
ReactDOM.render(reactSpan,divReact);
</script>
</body>
JSX注释表达式
React中注释内容也需要放在大括号”{ }”之中使用,否则注释的内容就会在页面上显示出来
<body>
<div id="div-react"></div>
<script type="text/babel">
var divReact = document.getElementById('div-react');
const reactSpan = (
<span>
<h3>JSX注释表达式:</h3>
{ /* 我是注释,放在大括号中,不在页面上显示 */}
/* 没有放在大括号中,展示在页面上 */
</span>
)
ReactDOM.render(reactSpan,divReact);
</script>
</body>
JSX防止注入攻击
你可以安全地在 JSX 当中插入用户输入内容:
const title = response.potentiallyMaliciousInput;
// 直接使用是安全的:
const element = <h1>{title}</h1>;
React DOM 在渲染所有输入内容之前,默认会进行转义。
它可以确保在你的应用中,永远不会注入那些并非自己明确编写的内容。
所有的内容在渲染之前都被转换成了字符串。这样可以有效地防止 XSS(cross-site-scripting, 跨站脚本)攻击。