01-react基本使用

118 阅读2分钟

react介绍

react:用于构建用户界面的JavaScript库

  • 声明式编程:它允许我们只需要维护自己的状态,当状态改变时,react可以根据最新的状态去渲染UI界面
  • 组件化开发
  • 多平台适配:开发web页面,开发reactNative、ReactVR

react开发依赖

  • react:包含react所必须的核心代码
  • react-dom:react渲染在不同平台所需要的核心代码
  • babel:将jsx转换成React代码的工具

helloReact案例

引入三个核心包

引入方式

  1. cdn
  2. 下载
  3. npm
  • ReactDOM.createRoot函数:用于创建一个React根,之后渲染的内容会包含在这个根中
  • script代码必须添加type="text/bable",作用是可以让babel可以解析jsx语法
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>

  <div id="app"></div>
<!-- 引入react -->
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<!-- 引入react-dom -->
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<!-- 引入babel -->
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

<script type="text/babel">
  //16.8以前
  // const EL = <div>16.8以前渲染</div>
  // ReactDOM.render(EL,document.querySelector("#app"))
  
  const EL2 = <div>16.8以后渲染</div>
  const root = ReactDOM.createRoot(document.querySelector("#app"));
  root.render(EL2)
  
</script>
  
</body>
</html>

hello-react组件化开发

  • 类组件
  • 函数式组件

类方式封装组件

  1. 定义一个类(组件名称必须大写),并继承自React.Component
  2. 实现当前组件的render函数,render函数返回值就是渲染的内容
<script type="text/babel">

//继承React.Component
  class App extends React.Component{
    render(){
      return (
          <div>App</div>
          )
    }
  }

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

组件化-数据依赖

在组件中的数据,可以分为2类:

  1. 参与界面更新的数据:当数据变量需要更新组件渲染的内容
  2. 不参与界面更新的数据:当数据变量不需要更新组件渲染的内容 参与界面更新的数据,可以称之为 参与数据流,这个数据是定义在当前对象的state中
  • 可以通过在构造函数中 this.state = {定义数据}

  • 当数据发生变化时,可以调用 this.setState来更新数据,并通知React进行update操作,- 在进行update操作时,会重新调用render函数,并使用最新数据来渲染页面

组件化事件绑定

组件化问题:事件绑定的this

  • 在类中直接定义有一个函数,并且将这个函数绑定到元素的onClick事件上,当前这个函数的this指向谁?

  • 默认情况下是undefined

<button onClick={this.changeText.bind(this)}></button>

电影列表案例

  <script type="text/babel">

    class App extends React.Component {
      constructor() {
        super();
        this.state = {
          name: 'Jennie Ruby Jane',
          movies: ["星际穿越", "恋恋笔记本", "后天"]
        }
      }

      render() {
        const { movies } = this.state;
        return (
          <div>
            <p>{this.state.name}</p>
            <p>{movies}</p>
            <ul>
              {movies.map(item => (<li>{item}</li>))}
            </ul>
          </div>
        )
      }
    }

    const root = ReactDOM.createRoot(document.querySelector("#app"));
    root.render(<App />);


  </script>

计数器案例

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <div id="app"></div>
  <!-- 引入react -->
  <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
  <!-- 引入react-dom -->
  <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
  <!-- 引入babel -->
  <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>




  <script type="text/babel">

    class App extends React.Component {
      constructor() {
        super();
        this.state = {
          name: 'Jennie Ruby Jane',
          num: 3
        }

        this.minus = this.minus.bind(this)
      }

      add() {
        this.setState({
          num: this.state.num + 1
        })
      }

      minus() {
        this.setState({
          num: this.state.num - 1
        })
      }

      render() {
        const { num } = this.state;
        return (
          <div>
            <p>{this.state.num}</p>
            <button onClick={this.minus}>-</button> <button onClick={this.add.bind(this)}>+</button>

          </div>
        )
      }
    }

    const root = ReactDOM.createRoot(document.querySelector("#app"));
    root.render(<App />);


  </script>

</body>

</html>