React——JSX学习

React JSX

React 使用 JSX 来替代常规的 JavaScript。它允许HTML语言直接写在JS语言中,不用加任何引号,这就是JSX,允许HTML和JS 混写。它有以下优点:

  1. JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。
  2. 它是类型安全的,在编译过程中就能发现错误。
  3. 使用 JSX 编写模板更加简单快速。
const element = <h1>Hello, world!</h1>;

JSX 是在 JavaScript 内部实现的。我们知道元素是构成 React 应用的最小单位,JSX 就是用来声明 React 当中的元素。
在 JSX 中不能使用 if else 语句,但可以使用 conditional (三元运算) 表达式来替代。

环境配置

非模块化环境

  • babel-standalone
    执行时编译,速度比较慢;只适用于开发测试环境

模块化环境

  • 结合webpack配置babel响应的工具完成预编译
  • 浏览器执行的式预编译结果
  • Babel REPL赋值查看编译结果(适用于在线测试)

基本语法规则

  • 必须只能有一个根节点
  • 多标签写到一个括号中,防止JS自动分号不往后执行
  • 遇到HTML标签就用HTML规则解析(单标签不能省略结束标签)
  • 遇到代码块就用JS规则解析
  • JSX允许直接在模板中插入一个JS变量(如果这个变量是一个数组,则会展开这个数组的所有成员添加到模板中)
  • 单标签必须结束
JSX注释:
  {/*      单行注释       */}
  
 {/*
   *多行注释
   *多行注释
   */}

  {
   //不推荐使用------------------
   }
使用

1.JSX中绑定 JavaScript 表达式

我们可以在 JSX 中使用 JavaScript 表达式。表达式写在花括号 {} 中。实例如下:

    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <div id="example"></div>
    <script type="text/babel">
      ReactDOM.render(
      	<div>
      	  <h1>{1+1}</h1>
        </div>
      	,
      	document.getElementById('example')
      );
    </script>
{/*输出2*/}

2.JS语法中使用JSX标签

function getGreeting (user) {
     if (user) {
     return <h1>hello {user.name}</h1>
   }
      return <h1>Hello Stranger</h1>
    }
    
    const element = getGreeting(null)

3.JSX属性绑定

    // jsx 中本质还是 JavaScript
    // class 在 JavaScript 中是一个关键字
    // 所以在这里写 class 的时候要改为 className
    const element = (
    
    //JSX声明子节点时必须有且只有一个根节点;子节点可以包含子节点
    
      <div className="box" title={user.name}>
        <div>
          <label htmlFor="name">用户名</label>
          {/* jsx 单标签必须结束 */}
          <input type="text" id="name" />
        </div>
        <div>
          <input type="checkbox" defaultChecked />
        </div>
        <div>
          <input type="text" defaultValue="hello" />
        </div>
      </div>
    )

    
    ReactDOM.render(
      element,
      document.getElementById('app')
    )

4.三元运算
在 JSX 中不能使用 if else 语句,但可以使用 conditional (三元运算) 表达式来替代。以下实例中如果变量 i 等于 1 浏览器将输出 true, 如果修改 i 的值,则会输出 false.

    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <div id="example"></div>
    <script type="text/babel">
	  var i = 1;
      ReactDOM.render(
      	<div>
      	  <h1>{i == 1 ? 'True!' : 'False'}</h1>
        </div>
      	,
      	document.getElementById('example')
      );
    </script>

//输出True!
列表渲染

JSX 允许在模板中插入数组,数组会自动展开所有成员

<script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
<script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
<script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <div id="app"></div>
    <script type="text/babel">
      const fruits=[
          <li key="1"></li>,
          <li key="2"></li>
             ];
              const todos=[
          {
               id:1,
               title:'吃饭'
             },
          {
               id:2,
               title:'吃饭'
             },
          {
               id:3,
               title:'吃饭'
             }];
   /*
    *遍历
    * const todoLis=[];
    * todos.forEach(item=>{
    *  todoLis.push(<li key={item.id}>{item.title}</li>)
    *  });
    */
const todoLis=todos.map(item=>{
  return   <li key={item.id}>{item.title}</li>;
});
       const element=(
         <div>
{/*在JSX中,绑定数组成员会直接把成员渲染到这里*/}
           <ul>{fruits)</ul>

{/*直接绑定一个数据*/}
          <ul>{todoLis)</ul>

   {/*直接在标签中刘表渲染*/}
          <ul>{
                todos.map(item={
                      return   <li key={item.id}>{item.title}</li>;
              });
           }            
         </ul>
         </div>
      );
     ReactDOM.render(element,document.getElementById('app'));
### 实现 React 中的路由配置 在 React 应用程序中使用 JSX 来定义和管理路由是一种常见做法。通过 `react-router-dom` 提供的功能组件,可以轻松创建复杂的导航结构。 #### 使用函数式组件与 Hook 配置基本路由 为了设置基础路径映射至不同页面组件的关系,在应用入口文件(通常是 `App.js`),需引入必要的模块并声明路由规则: ```jsx import React from 'react'; // 导入 react-router-dom 的核心功能 import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; function App() { return ( <Router> <Routes> {/* 定义多个路由 */} <Route exact path="/" element={<HomePage />} /> <Route path="/about" element={<AboutPage />} /> <Route path="/contact" element={<ContactPage />} /> </Routes> </Router> ); } export default App; ``` 上述代码展示了如何利用 `<BrowserRouter>` 将整个应用程序包裹起来以便启用 HTML5 历史模式下的 URL 路由[^2]。接着采用 `<Routes>` 组件来包含一系列 `<Route>` 子项,每个子项对应特定路径及其关联视图组件。 #### 添加保护机制——全局路由守卫 对于某些特殊场景下需要验证用户的访问权限时,则可以在现有基础上加入条件判断逻辑。例如,当用户未处于已登录状态尝试进入受限制区域时自动转向登录界面: ```jsx import React from 'react'; import { Navigate, useLocation } from 'react-router-dom'; const PrivateRoute = ({ children }) => { let location = useLocation(); // 检查是否有有效的会话存在 const isAuthenticated = !!localStorage.getItem('token'); if (!isAuthenticated) { // 如果没有认证则重定向到登录页,并保存当前试图访问的位置作为返回地址参数 return <Navigate to={{ pathname: '/login', state: { from: location } }} />; } return children; // 否则允许正常渲染目标组件 }; // 修改后的 App 函数内调用方式如下: <Routes> ... <Route path="/dashboard" element={ <PrivateRoute> <Dashboard /> </PrivateRoute>} /> </Routes> ``` 此部分实现了基于本地存储中的 token 进行身份验证检查,并根据结果决定是否继续加载指定资源还是引导回登录流程[^1]。 #### 动态加载优化性能 考虑到大型项目的实际需求,还可以进一步改进以减少初始加载时间。借助于动态导入特性配合 Suspense 达成按需加载效果: ```jsx <Route path="/settings" element={ <Suspense fallback={<div>Loading...</div>}> <LazySettingsComponent /> </Suspense> } /> ``` 这展示了一个简单例子说明怎样结合 `Suspense` 和自定义懒加载组件 (`LazySettingsComponent`) 来延迟实例化直至真正被请求之时才执行真正的加载操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值