美文网首页
jsx(1)-介绍

jsx(1)-介绍

作者: 未路过 | 来源:发表于2022-11-07 10:06 被阅读0次

什么是jsx

image.png image.png

JSX其实是嵌入到JavaScript中的一种结构语法;

babel会将<h2></h2>转换成React.createElement,这个React.createElement是浏览器可以识别的代码。
千万不要给<h2></h2>加双引号,就变成了字符串。
<h2></h2>是jsx语法
看起来像html in js
react就是all in js

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="root"></div>

    <script src="../lib/react.js"></script>
    <script src="../lib/react-dom.js"></script>
    <script src="../lib/babel.js"></script>

    <script type="text/babel">
      const element = <h2>我是h2</h2>;

      const root = ReactDOM.createRoot(document.querySelector("#root"));

      root.render(element);
    </script>
  </body>
</html>

https://babeljs.io/

"use strict";

const element = /*#__PURE__*/ React.createElement("h2", null, "\u6211\u662Fh2");
const root = ReactDOM.createRoot(document.querySelector("#root"));
root.render(element);
    class App extends React.Component {
      constructor() {
        super()
        this.state = {
          message: "Hello World"
        }
      }

      render() {
        const { message } = this.state

        return (
          <div>
            <h2>{message}</h2>
          </div>
        )
      }
    }

babel

"use strict";

class App extends React.Component {
  constructor() {
    super();
    this.state = {
      message: "Hello World"
    };
  }
  render() {
    const { message } = this.state;
    return /*#__PURE__*/ React.createElement(
      "div",
      null,
      /*#__PURE__*/ React.createElement("h2", null, message)
    );
  }
}

为什么react选择了jsx

html里面的东西和js里面的东西是很难分割的,js要监听html的事件,html要渲染js里面的东西。
所以react就把他们放在一起,用jsx语法实现了html In js这个功能。让你们不存在绑定来绑定去的关系,直接放到一起。而这个组合在一起的地方,就是组件。

jsx书写规范

  1. JSX的顶层只能有一个根元素,所以我们很多时候会在外层包裹一个div元素(或者使用后面我们学习的Fragment);
  2. 为了方便阅读,我们通常在jsx的外层包裹一个小括号(),这样可以方便阅读,并且jsx可以进行换行书写;
  3. JSX中的标签可以是单标签,也可以是双标签;
    ✓ 注意:如果是单标签,必须以/>结尾;

jsx中插入内容

◼ JSX嵌入变量作为子元素
 情况一:当变量是Number、String、Array类型时,可以直接显示
 情况二:当变量是null、undefined、Boolean类型时,内容为空;(react渲染的时候直接忽略)
✓ 如果希望可以显示null、undefined、Boolean,那么需要转成字符串;
✓ 转换的方式有很多,比如toString方法、和空字符串拼接,String(变量)等方式;
 情况三:Object对象类型不能作为子元素(not valid as a React child)
◼ JSX嵌入表达式
 运算表达式
 三元运算符
 执行一个函数

逻辑特别复杂的化,可以写到外面的函数里面

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>计数器</title>
  </head>
  <body>
    <div id="root"></div>

    <script src="../lib/react.js"></script>
    <script src="../lib/react-dom.js"></script>
    <script src="../lib/babel.js"></script>

    <script type="text/babel">
      // 1.定义App根组件
      class App extends React.Component {
        constructor() {
          super();
          this.state = {
            movies: ["流浪地球", "星际穿越", "独行月球"],
          };
        }

        render() {
          // 3.返回jsx的内容
          return (
            <div>
              <ul>{this.getMovieEls()}</ul>
            </div>
          );
        }

        getMovieEls() {
          const liEls = this.state.movies.map((movie) => <li>{movie}</li>);
          return liEls;
        }
      }

      // 2.创建root并且渲染App组件
      const root = ReactDOM.createRoot(document.querySelector("#root"));
      root.render(<App />);
    </script>
  </body>
</html>

jsx中绑定属性

 比如元素都会有title属性
 比如img元素会有src属性
 比如a元素会有href属性
 比如元素可能需要绑定class
 比如原生使用内联样式style

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>计数器</title>
</head>
<body>
  
  <div id="root"></div>

  <script src="../lib/react.js"></script>
  <script src="../lib/react-dom.js"></script>
  <script src="../lib/babel.js"></script>

  <script type="text/babel">
    // 1.定义App根组件
    class App extends React.Component {
      constructor() {
        super()
        this.state = {
          title: "哈哈哈",
          imgURL: "https://ts1.cn.mm.bing.net/th/id/R-C.95bc299c3f1f0e69b9eb1d0772b14a98?rik=W5QLhXiERW4nLQ&riu=http%3a%2f%2f20178405.s21i.faiusr.com%2f2%2fABUIABACGAAgoeLO-wUo4I3o2gEw8Qs4uAg.jpg&ehk=N7Bxe9nqM08w4evC2kK6yyC%2bxIWTjdd6HgXsQYPbMj0%3d&risl=&pid=ImgRaw&r=0",
          href: "https://www.baidu.com",

          isActive: true,
          objStyle: {color: "red", fontSize: "30px"}
        }
      }

      render() {
        const { title, imgURL, href, isActive, objStyle } = this.state

        // 需求: isActive: true -> active
        // 1.class绑定的写法一: 字符串的拼接
        const className = `abc cba ${isActive ? 'active': ''}`
        // 2.class绑定的写法二: 将所有的class放到数组中
        const classList = ["abc", "cba"]
        if (isActive) classList.push("active")
        // 3.class绑定的写法三: 第三方库classnames -> npm install classnames

        return (
          <div>
            { /* 1.基本属性绑定 */ }
            <h2 title={title}>我是h2元素</h2>
            {/*<img src={imgURL} alt=""/>*/}
            <a href={href}>百度一下</a>

            
            { /* 2.绑定class属性: 最好使用className */ }
            <h2 className={className}>哈哈哈哈</h2>
            <h2 className={classList.join(" ")}>哈哈哈哈</h2>

            
            { /* 3.绑定style属性: 绑定对象类型 */ }
            <h2 style={{color: "red", fontSize: "30px"}}>呵呵呵呵</h2>
            <h2 style={objStyle}>呵呵呵呵</h2>
          </div>
        )
      }
    }

    // 2.创建root并且渲染App组件
    const root = ReactDOM.createRoot(document.querySelector("#root"))
    root.render(<App/>)
  </script>

</body>
</html>

相关文章

  • jsx(1)-介绍

    什么是jsx JSX其实是嵌入到JavaScript中的一种结构语法; babel会将 转换成React.cre...

  • React-1.JSX

    1、JSX的介绍 什么是JSX:JSX=javascript xml就是Javascript和XML结合的一种格式...

  • JSX介绍

    考虑下面的变量声明: 这个有趣的标记语法既不是字符串也不是HTML。 他被称为JSX,是一种JavaScript的...

  • 介绍JSX

    本文是本人自己辛苦翻译的,请转载的朋友注明,翻译于Z.MJun的简书 ,感谢!<翻译不容易啊> 翻译于2017年6...

  • 2.0 Introducing JSX 介绍JSX

    Consider this variable declaration: 考虑这个变量声明: const eleme...

  • 2020 动手写个 react (2)

    我们写一段 jsx ,有关 jsx 语法这里暂不做过介绍,留下伏笔 然后将上面 jsx 通过 babel 转换为 ...

  • JSX

    JSX Follow me on GitHub JSX1. 为什么会有JSX?2. JSX的基本使用2.1 JSX...

  • ReactJS:支持React开发,提供JSX代码提示,高亮显示

    ReactJS:支持React开发,提供JSX代码提示,高亮显示,ReactJS官方介绍 1、cdm→ compo...

  • JSX

    参照官方文档 JSX介绍 HTML 语言直接写在 JavaScript 语言之中,不加任何引号,这就是 JSX 的...

  • 即时通讯系统(一)

    1、JSX简介 jsx本质上还是js,因此遵循驼峰命名的方式 1.jsx属性2.jsx如何防止xss漏洞 Reac...

网友评论

      本文标题:jsx(1)-介绍

      本文链接:https://www.haomeiwen.com/subject/nlzmtdtx.html