写篇文章攻克React——(3)JSX语法

196 阅读2分钟

作为react的特殊语法,和虚拟dom密切相关。

react项目中我们会看到这样的代码,其中参数一就是jsx对象。(参数二是绑定的节点)

ReactDOM.render(<h1>hello react</h1>, document.getElementById('root'));

JSX

JSXJavaScript XML

JSX语法

jsx对象类似于html或xml语法,但是单个jsx对象只能有一个根标签,而且jsx对象结构会被babel解析成js对象再被浏览器执行。

    let jsx = (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
    )

我们在<>中写标签构建jsx对象,在{}中写js代码,所以{}中写jsx是可以的,但是反之不行(js必须在{内})。

    <div className="App">
      {arr}
    </div>
    
    <div>
      {<div>{arr}</div>}
    </div>

css内联样式

我们可以在jsx对象中写css内联样式,属性名字和dom操作中一样将破折号去除采用小驼峰命名法

const Son1 = (prop) => {
    let style={
        fontSize:100,
        color:'red'
    }
    return (
    //js代码使用必须{}
        <div style={style}>
            {prop.name}
        </div>
    );
}

image.png

react是推荐使用内联样式的,其次我们注意到数值是默认转变为px单位。

jsx注释

因为jsx本身并不是html而是js环境,所以不支持html的注释方式。而js的注释方式也必须是在js环境内,因为jsx对象内部不能直接写js注释,需要先{}起来。

<div style={style}>
    {prop.name}
    {/* <div></div> */}
</div>

条件和循环语句

因为没有v-if这种指令,所以对于判断通过是使用三目运算符完成。而for语句则是通过数组和数组方法代替。

除了三木运算符,我们可以灵活使用其他运算符的特点进行条件处理:比如||&&

//i > 0就执行后面的代码,否则不执行。
{i > 0 && <div className="box"></div>}

数组使用

  • 前面说到了数组在循环中的使用,这里我们直接使用数组:
    let arr = [1,2,3,4,5,6,7]
    return (
        <div style={style}>
            {arr}
        </div>
    );

image.png

  • 通过数组方法完成更加具体的循环使用:
//if+for效果
    {arr.filter(x=>x>3)}
//for+template效果
    {arr.map(x=><h3>{x}</h3>)}

我们完全也可以在jsx代码外使用if和for语句完成jsx对象结构的拼接和修饰。

.jsx文件

不能被浏览器识别并运行的文件,需要同通过webpack进行转译。

image.png

.jsx文件和.js本质语法上没有区别,或则说jsx能够在js代码中更好书写jsx语法,编辑器提示更加友好。

image.png

.jsx文件完全可以当作js来写。

JSX特点

react项目中并不一定要适用jsx,我们使用jsx是因为其具备的多种特点或优势:

  • jsx代码执行快,react底层对jsx编译有优化。
  • 格式简单,编写快捷。
  • 兼容任意标签名和标签属性。
  • 用于创建react虚拟dom。
  • <>识别为标签或组件,{}识别为js代码,分别进行解析编译。
  • jsx需要预编译成js,通过babel.js完成转译,通常设置type = "text/babel"。

jsx是语法糖

作为react的重要一部分,jsx是一种语法糖,我们可以在babel网站进行查看,我们用react框架的内置函数可以完成同样的效果:

image.png

考点

  • return 后的jsx对象为什么要带小括号

jsx如果开始标签和return在同一行则可以不要小括号,同样编译运行无误,但是没有小括号的同时jsx对象的开始标签又换行与return不再一行,则编译器会自动给return添加;所以会报错。

  return 
    <div className="App">
      {arr}
    </div>
///等效于
  return ;
    <div className="App">
      {arr}
    </div>