react jsx语法 | 青训营笔记

42 阅读3分钟

这是我参与【第五届青训营】笔记创作活动的第4天

一、初识JSX

1.1.JSX是什么

  • JSX是一种JavaScript的语法扩展(eXtension),也在很多地方称之为JavaScript XML,因为看起就是一段XML语法;
  • 它用于描述我们的UI界面,并且其完成可以和JavaScript融合在一起使用;

1.2.JSX的书写规范

  • JSX的顶层只能有一个根元素
  • jsx的外层长通厂包裹一个小括号

1.3.JSX的使用

  1. jsx嵌入变量作为子元素
    1. 变量为Number、String、Array类型,直接显示
    2. 变量为null、undefined、Boolean类型,内容为空
      1. 如果想要显示,可以通过toString方法、拼接空字符串、String()等方法装成字符串
    1. Object类型不能作为子元素
  1. jsx嵌入表达式
    1. 运算表达式
    2. 三元运算符
    3. 执行一个函数
  1. jsx绑定属性
    1. 元素 title属性 img src属性 a href属性 等
<script type="text/babel">
      // 1.定义App根组件
      class App extends React.Component {
        constructor() {
          super();
          this.state = {
            message: "Hello World",
            counter: 100,
            names: [1, 2, 3],

            a: undefined,
            b: null,
            c: true,

            friend: { name: "kk" },

            movies: ["大话西游", "red", "阿凡达"],
            age: 9,
          };
        }

        render() {
          // 1.插入标识符
          const { message, names, counter } = this.state;
          const { a, b, c } = this.state;
          const { friend } = this.state;

          const { age } = this.state;

          return (
            <div>
              {/*1.String/Number/Array直接显示出来*/}
              <h2>{message}</h2>
              <h2>{counter}</h2>
              <h2>{names}</h2>
              {/*undefined/null/Boolean不可以*/}
              <h2>{String(a)}</h2>
              <h2>{b + ""}</h2>
              <h2>{c.toString()}</h2>

              {/*3.Object不能作为子元素进行显示*/}
              <h2>{friend.name}</h2>
              <h2>{Object.keys(friend)[0]}</h2>

              {/*4.可以插入对应的表达式*/}
              <h2>{10 + 20}</h2>

              {/*5.可以插入三元表达式*/}
              <h2>{age >= 10 ? "小孩子" : "大孩子"}</h2>

              {/*6.可以调用方法获取结果*/}
              <ul>
                {this.state.movies.map((item) => (
                  <li>{item}</li>
                ))}
              </ul>
              <ul>{this.getItems()}</ul>
            </div>
          );
        }
        getItems() {
          let arr = this.state.movies.map((item) => <li>{item}</li>);
          return arr;
        }
      }

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

二、React事件绑定

2.1.基本绑定

  1. 获取DOM原生,添加监听事件
  2. 在HTMl原生中,直接绑定onClick

注意:

  1. 命名采用小驼峰式
  2. 通过{}传入一个事件处理函数

2.2.this绑定

  1. bind显示绑定:onClick={this.btn.bind(this)}
  2. es6 class fields语法: onClick={this.btn} btn =() =>{}
  3. 事件监听时传入箭头函数: onClick={() => this.btn()}
  4. 注意:默认绑定 *onClick={this.btn} *在内部是独立函数调用,所以this为undefined

2.3.事件参数传递

  1. 获取event
    1. 传入一个箭头函数,主动执行的事件函数,并且传入相关的其他参数
    2. 额外参数传递
btn(event) {
  console.log(event)
}
onClick={(event) => this.btn(event}

btn(event,age) {
  console(event, age)
}

onClick={(event) => this.btn(event,18}

案例

点击某一个列表元素变色

传入index

排他思想

 <script type="text/babel">
      // 1.定义App根组件
      class App extends React.Component {
        constructor() {
          super();
          this.state = {
            message: "Hello World",
            colors: ["red", "pink", "skyblue", "green"],
            currentIndex: 0,
          };
        }
        itemClick(index) {
          this.setState({ currentIndex: index });
        }
        render() {
          const { colors, currentIndex, message } = this.state;
          // 排他思想
          return (
            <div>
              <ul>
                {colors.map((item, index) => {
                  return (
                    <li
                      className={currentIndex === index ? "active" : ""}
                      key={item}
                      onClick={() => this.itemClick(index)}
                    >
                      {item}
                    </li>
                  );
                })}
              </ul>
            </div>
          );
        }
      }

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

三、React条件渲染

  1. 条件判断
  2. 三元运算符
  3. 与运算符&&
    1. 如果条件成立,渲染某一个组件,不成立,什么内容也不渲染
  1. 类似于vue中v-show的效果
    1. 控制display为none
<script type="text/babel">
      // 1.定义App根组件
      class App extends React.Component {
        constructor() {
          super();
          this.state = {
            message: "Hello World",
            isReady: false,
            friend: undefined,
          };
        }

        render() {
          const { isReady, friend, message } = this.state;

          // if
          let ele = null;
          if (isReady) {
            ele = <h2>start</h2>;
          } else {
            ele = <h2>stop</h2>;
          }
          return (
            <div>
              {/*1/根据条件给变量复制不同的内容*/}
              <div>{ele}</div>

              {/*2.三元运算符*/}
              <div>{isReady ? <h2>start</h2> : <h2>end</h2>}</div>

              {/*3.&&逻辑与运算, 当某一个值,有可能为undefined时,使用&&进行条件判断*/}

              <div>
                {friend && <div>{friend.name + " " + friend.desc}</div>}
              </div>
            </div>
          );
        }
      }

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

四、React列表渲染

  • map高阶函数(遍历)
  • filter函数(过滤)
  • slice函数(截取)

注意

列表展示的jsx中需要添加key

  • 为了提高提高diff算法时的效率
<script type="text/babel">
      // 1.定义App根组件
      class App extends React.Component {
        constructor() {
          super();
          this.state = {
            message: "Hello World",
            students: [
              { id: 111, name: "kk", score: 199 },
              { id: 112, name: "zz", score: 98 },
              { id: 113, name: "ss", score: 199 },
              { id: 114, name: "jj", score: 188 },
            ],
          };
        }

        render() {
          const { students, message } = this.state;

          // 大于100
          const show = students.filter((item) => {
            return item.score > 100;
          });

          const slice = show.slice(0, 2);
          return (
            <div>
              <div>
                {students
                  .filter((item) => item.score > 100)
                  .slice(0, 2)
                  .map((item) => {
                    return (
                      <div className="item" key={item.id}>
                        <h2>学号:{item.id}</h2>
                        <h2>姓名:{item.name}</h2>
                      </div>
                    );
                  })}
              </div>
            </div>
          );
        }
      }

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

五、JSX的代码是如何被编译为React代码的,本质是进行什么操作

  1. jsx是通过bbel工具转换编译成React代码的
  2. 本质
  • jsx 仅仅只是 React.createElement(component, props, ...children) 函数的语法糖
  • 所有的jsx最终都会被转换成React.createElement的函数调用

六. 什么是虚拟DOM?虚拟DOM在React中起到什么作用?

6.1.什么是虚拟DOM?

  • Virtual DOM 是一种编程概念,UI以一种理想化或者说虚拟化的方式保存在内存中
  • Virtual DOM 本质上是 JavaScript 对象,是真实 DOM 的描述,⽤⼀个 JS 对象来描述⼀个 DOM 节点
  • 我们知道jsx转成React代码的本质是 - 转换成React.createElement的函数调用
  • 通过React.createElement的函数创建出来的ReactElement对象
  • React利用ReactElement对象组成了一个JavaScript的对象树 - JavaScript的对象树就是虚拟DOM

6.2.虚拟DOM在React中的作用

  • 虚拟DOM 通过diff算法 - 以最⼩的代价更新变化的视图
  • 跨平台渲染
  • 声明式编程 - 虚拟DOM帮助我们从命令式编程转到了声明式编程的模式
    • 你只需要告诉React希望让UI是什么状态
    • React来确保DOM和这些状态是匹配的
    • 不需要直接进行DOM操作,就可以从手动更改DOM、属性操作、事件处理中解放出来