【React】React JSX

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的引用

  1. JSX在页面中直接定义
  2. 引入外部定义好的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, 跨站脚本)攻击。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南栀~zmt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值