React基础语法 — JSX语法

一名技术栈是vue的开发者,在工作之余学习react的一些知识积累,以下文章是我在react学习过程中总结react一些基础只是---JSX语法。

一、基本使用

1.书写规范

  • JSX的顶层只能有一个根元素,所以我们很多时候会在外层包裹一个div元素
  • 为了方便阅读,我们通常在jsx的外层包裹一个小括号(),这样可以方便阅读,并且jsx可以进行换行书写;

  • JSX中的标签可以是单标签,也可以是双标签。注意:如果是单标签,必须以/>结尾。

import React from "react";

class HelloWorld extends React.Component {
  constructor() {
    super()
    this.state = {
      message: '我是kk'
    }
  }

  render() {
    return (
      <div>
        {this.state.message}
      </div>
    )
  }
}

export default HelloWorld

 2.jsx的绑定属性

  • 基本属性

  • title属性

  • src属性

  • href属性

  • 绑定class(注意尽量使用className 不要使用class 因为class是关键字)

  • 内联样式style (注意绑定属性可以使用对象插入,但是子元素不能使用对象插入)

class App extends React.Component {
  constructor() {
    super()
    this.state = {
      message: '哈哈哈',
      title: 'kk',
      imgURL: 'https://uat-xw.seewintech.com/static/img/nodata1.808a6a2d.svg',
      isActive: false,
      styleObject: {
        color: '#ccc',
        fontSize: '24px'
      }
    }
  }

  render() {
    const { message, title, imgURL, isActive, styleObject } = this.state
        
      return (
        <div>
          {/* 一、绑定基本属性 */}  
          <h2>{message}</h2>
          {/* 二、绑定title属性 */}
          <h2 title={title}>哈哈哈</h2>
          {/* 三、绑定title属性 */}
          <img src={imgURL} alt=""/>
          {/* 四、绑定href属性 */}
          <a href="https://gitlab.seewintech.com/zjzd-ibuilds/ibuilds-web3.0">链接</a>
          {/* 五、绑定href属性 注意尽量使用className 不要使用class 因为class是关键字 */}
          <div className={`app style ${isActive ? 'active' : ''}`}></div>
          {/* 六、绑定内联样式style属性 */}
          <div style={styleObject}>我是帅哥</div>
        </div>
      )
    }
  }
}

3.事件绑定

在事件执行,我们可能需要获取当前类的对象中的相关属性,这个时候需要用到this,但此时this为undefined,因为btnClick函数并不是我们主动调用的,是react内部调用btnClick函数,在内部调用时,this为隐式绑定,所以不知道this是指向哪里的。

三种解决方法:

  • 方案一:bind给btnClick显示绑定this
  • 方案二:使用 ES6 class fields 语法(箭头函数寻找上一层作用域)

  • 方案三:事件监听时传入箭头函数 (先传入一个箭头函数 然后箭头函数返回一个调用绑定事件函数调用。原因:this.事件函数, 是隐式绑定)

class App extends React.Component {
  constructor() {
    super()
    this.state = {
      counter: 100
    }
    this.onClick1 = this.onClick1.bind(this)
  }
  onClick1() {
    this.setState({
      counter: 1000
    })
  }
  onClick2 = () => {
    this.setState({
      counter: 2000
    })
  }
  onClick3() {
    this.setState({
      counter: 3000
    })
  }
  render() {
    const { counter } = this.state
    return (
      <div>
        <h2>{counter}</h2>
        {/* 方案一:bind给btnClick显示绑定this */}
        <button onClick={this.onClick1}>方案一</button>
        {/* 方案二:使用 ES6 class fields 语法 */}
        <button onClick={this.onClick2}>方案二</button>
        {/* 方案三:事件监听时传入箭头函数  */}
        <button onClick={() => this.onClick3()}>方案三</button>
      </div>
    )
  }
}

4.事件参数传递

在执行函数时,有可能我们需要获取一些参数信息:例如event对象、其他参数。最好的方式就是传入一个箭头函数,主动执行事件函数,并且可以传入相关的其他参数。

class App extends React.Component {
  onClick1(e, name, age) {
    console.log(e, name, age)
  }
  render() {
    return (
      <div>
        <button onClick={(e) => this.onClick3(e, 'kk', 18)}>按钮</button>
      </div>
    )
  }
}

5.条件渲染

某些情况下,界面的内容会根据不同的情况显示不同的内容,或者决定是否渲染某部分内容: 在vue中,我们会通过指令来控制:比如v-if、v-show;在React中, 所有的条件判断都和普通的JavaScript代码一致
class App extends React.Component {
  constructor() {
    super()
    this.state = {
      isShow: true
    }
  }
  changShow() {
    this.setState({
      isShow: !this.state.isShow
    })
  }
  render() {
    const { isShow } = this.state
    let showEl = null
    if (isShow) {
      showEl = <div>哈哈哈</div>
    } else {
      showEl = null
    }
    return (
      <div>
        <button onClick={() => this.changShow()}>切换</button>
         {/* 方案一:普通的if-else */}
         {showEl}
         {/* v-show的效果 */}
         <div style={{display: isShow ? 'block' : 'none'}}>666</div>
      </div>
    )
  }
}

6.列表渲染

在React中并没有像Vue模块语法中的v-for指令,展示列表最多的方式就是使用数组的 map高阶函数
class App extends React.Component {
  constructor() {
    super()
    this.state = {
      movies: ['aaa', 'bbb', 'ccc']
    }
  }
  render() {
    return (
      <div>
        <ui>
          {this.state.movies.map(item => <li>{item}</li>)}
        </ui>
      </div>
    )
  }
}

二、JSX的原理

实际上,jsx 仅仅只是 React.createElement(component, props, ...children) 函数的语法糖。所有的jsx最终都会被转换成 React.createElement的函数 调用。
通过 React.createElement 最终创建出来一个 ReactElement对象,React利用ReactElement对象组成了一个 JavaScript的对象树 ;这个对象树就是虚拟DOM。
简单理解就是:jsx代码 => ReactElement对象(虚拟DOM) => 真实DOM
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值