React 基础(一)React 初体验

React 是什么?

用于构建用户界面的 JavaScript 库

为什么需要 React?

  1. 原生 JavaScript 操作 DOM 繁琐、效率低(DOM-API 操作 UI)
  2. 使用 JavaScript 直接操作 DOM,浏览器会进行大量的重绘重排
  3. 原生 JavaScript 没有组件化编码方案,代码复用率低

React 的特点

  1. 采用组件化模式、声明式编码,提高开发效率及组件复用率
  2. 跨平台,在 React Native 中可以使用 React 语法进行移动端开发,还有 React VR
  3. 使用虚拟 DOM + 优秀的 Diff 算法,尽量减少与真实 DOM 的交互

开发 React 必须依赖三个库

  • react:包含 react 所必须的核心代码
  • react-dom:react 扩展库
  • babel:将 JSX 转为 JavaScript

使用 JSX,必须设置 script 元素的 type 属性为 text/babel

第一个 React 程序

<!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 crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>

    <script type="text/babel">
      // react18之后:ReactDOM.createRoot().render
      ReactDOM.createRoot(document.querySelector('#root')).render(
        <h2>Hello World</h2>
      )
    </script>
  </body>
</html>

Hello React

案例

<script type="text/babel">
  let message = 'Hello World'

  function onClick() {
    message = 'Hello React'
    render()
  }

  const root = ReactDOM.createRoot(document.querySelector('#root'))
  function render() {
    root.render(
      <div>
        <h2>{message}</h2>
        <button onClick={onClick}>修改文本</button>
      </div>
    )
  }
  render()
</script>

类组件

<script type="text/babel">
  class App extends React.Component {
    constructor(props) {
      super(props)
      this.state = {
        message: 'Hello World'
      }
    }

    onClick() {
      this.setState({
        message: 'Hello React'
      })
    }

    render() {
      return (
        <div>
          <h2>{this.state.message}</h2>
          <button onClick={this.onClick.bind(this)}>修改文本</button>
        </div>
      )
    }
  }

  const root = ReactDOM.createRoot(document.querySelector('#root'))
  root.render(<App />)
</script>

函数组件(主流)

<script type="text/babel">
  function App() {
    const [message, setMessage] = React.useState('Hello World')
    return (
      <div>
        <h2>{message}</h2>
        <button onClick={() => setMessage('Hello React')}>修改文本</button>
      </div>
    )
  }

  const root = ReactDOM.createRoot(document.querySelector('#root'))
  root.render(<App />)
</script>

列表渲染

<script type="text/babel">
  class App extends React.Component {
    constructor(props) {
      super(props)
      this.state = {
        movies: ['星际穿越', '火星救援', '流浪地球']
      }
    }

    render() {
      return (
        <div>
          <h2>电影列表</h2>
          <ul>
            {this.state.movies.map((movie) => {
              return <li key={movie}>{movie}</li>
            })}
          </ul>
        </div>
      )
    }
  }

  const root = ReactDOM.createRoot(document.querySelector('#root'))
  root.render(<App />)
</script>

计数器

<script type="text/babel">
  class App extends React.Component {
    constructor(props) {
      super(props)
      this.state = {
        counter: 0
      }
    }

    increment() {
      this.setState({
        counter: this.state.counter + 1
      })
    }
    decrement() {
      this.setState({
        counter: this.state.counter - 1
      })
    }

    render() {
      return (
        <div>
          <h2>{this.state.counter}</h2>
          <button onClick={this.increment.bind(this)}>+</button>
          <button onClick={this.decrement.bind(this)}>-</button>
        </div>
      )
    }
  }

  const root = ReactDOM.createRoot(document.querySelector('#root'))
  root.render(<App />)
</script>