React JSX 基础语法

1、什么是 JSX

JSX 是 JavaScript 的一种语法扩展。可以组装 UI 界面,同时可以和 JavaScript 语法配合使用。

2、为什么使用 JSX

  • 使用熟悉的语法定义 HTML 元素,提供更加语义化的标签,使用 JSX 编写模板更简单快速
  • 更加直观:JSX 让组件更加简单、明了、直观
  • 抽象了 React 元素的创建过程,使得编写组件变得更加简单

举例说明如下:

// react17版本之前
const children1 = React.createElement("li", null, "第一个组件内容!");
const children2 = React.createElement("li", null, "第二个组件内容!");
const root = React.createElement(
  "ul",
  { className: "list" },
  children1,
  children2
);

// react17版本之后
import { jsx as _jsx } from "react/jsx-runtime";
import { jsxs as _jsxs } from "react/jsx-runtime";
const root = _jsxs("ul", {
  className: "list",
  children: [
    _jsx("li", {
      children: "Hello",
    }),
    _jsx("li", {
      children: "World",
    }),
  ],
});

JSX 等价如下:

const root = (
  <ul className="list">
    <li>Hello</li>
    <li>World</li>
  </ul>
);

显然 JSX 写法更便于页面的编写与维护,且简单、直观。

3、JSX 书写规范

  • JSX 的最外层只能有一个根元素,可以使用 div 、span 等标签
  • 正常情况下,我可以在最外层包裹一个小括号(),方便我们更好的格式化代码
  • JSX 中的标签可以是单标签,也可以是双标签;注意:如果是单标签,必须以/>结尾
  • 在使用变量时,我们可以将其放在一个大括号中,大括号内可以放置任何有效的 JavaScript 表达式

代码示例如下:

const root = (
  <div className="list">
    <div>第一个组件内容!</div>
    <img src="xxx.jpg" />
    {1 === 1 && <div>第二个组件内容!</div>}
  </div>
);

4、JSX 注释

通常有以下三种注释

<ul className="list">
  {/* 1、单行注释 */}
  <li>第一个组件内容!</li> // 2、行尾注释
  <li>第二个组件内容!</li>
  {/*
        3、多行注释
        1
        2
        3
        */}
</ul>

5、JSX 嵌入变量

变量在 JSX 使用,需要用大括号 { } 包裹;注意:使用的变量需要提前定义。如下。

const MyComponent = () => {
  const text = "Hello World!";
  return <div>{text}</div>;
};
export default MyComponent;

6、JSX 嵌入表达式

  • 运算符表达式
  • 三元表达式
  • 函数调用
const MyComponent = () => {
  const isFinish = true;

  const calc = () => {
    const a = 1;
    const b = 2;
    return a + b;
  };

  return (
    <div>
      {/*1.运算符表达式*/}
      <span>2 + 3 的和为:{2 + 3}</span>
      {/*2.三元表达式*/}
      <span>家庭作业是否完成:{isFinish ? "是" : "否"}</span>
      {/*3.进行函数调用*/}
      <span>{calc()}</span>
    </div>
  );
};
export default MyComponent;

7、JSX 绑定属性

注意:在给元素绑定 style 时,外层的大括号是表示可传入变量或者表达式。而内部的大括号是一个对象,它里面是键值对,表示元素的样式属性及属性值。另外,当属性是由多个单词组成的时候,需要用驼峰命名法来表示,例如:fontSize

const MyComponent = () => {
  const title = "我是标题的全部内容!";
  const url = "https://www.baidu.com";
  const className = "span";

  return (
    <div>
      {/* 1、绑定普通属性 */}
      <h2 title={title}>我是标题...</h2>
      <a href={url}>百度一下</a>
      {/* 2.绑定class */}
      <span className={className}>我是span标签</span>
      <span className={["tag", "span"].join(" ")}>我是span标签2</span>
      {/* 3.绑定style */}
      <span style={{ color: "red", fontSize: 16 }}>我的字体颜色是红色</span>
    </div>
  );
};
export default MyComponent;

8、JSX 绑定事件

可以看出 React 元素的事件处理和 DOM 元素的很相似,但存在一些语法上的差异:

  • React 的事件采用驼峰式命名,而不是纯小写的方式
  • 使用 JSX 语法时,需要传入一个函数作为事件处理函数,而不是一个字符串
  • 使用函数时不能加括号,不然会直接执行
  • 如果函数过于简单,可在 JSX 中直接编写函数内容
const MyComponent = () => {
  const onClick = () => {
    window.alert("您点击了按钮1");
  };

  return (
    <div>
      <button onClick={onClick}>按钮1</button>
      <button
        onClick={() => {
          window.alert("您点击了按钮2");
        }}
      >
        按钮2
      </button>
    </div>
  );
};
export default MyComponent;

9、JSX 条件渲染

常见的条件渲染的方式有以下三种:

  • 方式一:条件判断语句,适合逻辑较多的情况
  • 方式二:三元运算符,适合逻辑比较简单
  • 方式三:与运算符&&,如果条件成立,渲染&&后面的组件;如果条件不成立,则都不渲染
const MyComponent = () => {
  const renderTitle = (key) => {
    if (key > 1) {
      return <span>我是标题1</span>;
    }
    return <span>我是标题2</span>;
  };

  return (
    <div>
      {renderTitle(2)}
      {2 > 1 ? <span>我会显示出来</span> : <span>我会隐藏</span>}
      {2 > 1 && <span>我会显示出来</span>}
    </div>
  );
};
export default MyComponent;

10、JSX 列表渲染

我们通常使用 Javascript 的 map 函数来处理 JSX 数组列表循环渲染;如下

const MyComponent = () => {
  const array = ["1", "2", "3", "4"];

  return (
    <ul>
      {array.map((i) => (
        <li key={i}>{i}</li>
      ))}
    </ul>
  );
};
export default MyComponent;

注意:在渲染是,我们需要给渲染项添加一个 key,不然会报错:warning: Each child in a list should have a unique "key" prop.

key 和 React 中的 diff 算法密切相关。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容