美文网首页
React基础教程(一)

React基础教程(一)

作者: 野生羊腰子 | 来源:发表于2020-11-05 09:57 被阅读0次

    史上最清晰最详细最简单React教程,本教程持续更新ing


    一、编写第一个React应用程序

    react开发需要引入多个依赖文件:react.js、react-dom.js,分别又有开发版本和生产版本,create-react-app里已经帮我们把这些东西都安装好了。把通过CRA创建的工程目录下的src目录清空,然后在里面重新创建一个index.js. 写入以下代码:

    // 从 react 的包当中引入了 React。只要你要写 React.js 组件就必须引入React, 因为react里有一种语法叫JSX,稍后会讲到JSX,要写JSX,就必须引入React
    import React from 'react'
    // ReactDOM 可以帮助我们把 React 组件渲染到页面上去,没有其它的作用了。它是从 react-dom 中引入的,而不是从 react 引入。
    import ReactDOM from 'react-dom'
    
    // ReactDOM里有一个render方法,功能就是把组件渲染并且构造 DOM 树,然后插入到页面上某个特定的元素上
    ReactDOM.render(
    // 这里就比较奇怪了,它并不是一个字符串,看起来像是纯 HTML 代码写在 JavaScript 代码里面。语法错误吗?这并不是合法的 JavaScript 代码, “在 JavaScript 写的标签的”语法叫 JSX- JavaScript XML。
      <h1>欢迎进入React的世界</h1>,
    // 渲染到哪里
      document.getElementById('root')
    )
    

    二、元素与组件

    既可以写固有的html标签,也可以写组件(最小的单位就是元素)

    组件以标签的形式调用(类比vue的组件调用)

    如果标签的首字母大写 ,会被认为使用了react的组件
    如果标签的首字母小写 ,会被认为使用了react元素

    1.函数式组件

    jsx中只能写js表达式 不能流程控制

    • 先写js后加花括号 {}
    • jsx以标签的形式做调用
    • 首字母必须大写(小写会被当做固有的html标签)

    由于元素没有办法传递参数,所以我们就需要把之前定义的变量改为一个方法,让这个方法去return一个元素:

    import React from 'react'
    import ReactDOM from 'react-dom'
    
    // 特别注意这里的写法,如果要在JSX里写js表达式(只能是表达式,不能流程控制),就需要加 {},包括注释也是一样,并且可以多层嵌套
    const app = (props) => <h1>欢迎进入{props.name}的世界</h1>
    
    ReactDOM.render(
      app({
        name: 'react'
      }),
      document.getElementById('root')
    )
    

    上面这种是函数式组件 但是并不符合jsx的风格
    通常我们使用下面的方式

    import React from 'react'
    import ReactDOM from 'react-dom'
    
    const App = (props) => <h1>欢迎进入{props.name}的世界</h1>
    
    ReactDOM.render(
      // React组件的调用方式
      <App name="react" />,
      document.getElementById('root')
    )
    

    2.class组件

    ES6的加入让JavaScript直接支持使用class来定义一个类,react的第二种创建组件的方式就是使用的类的继承,ES6 class是目前官方推荐的使用方式,它使用了ES6标准语法来构建,看以下代码:

    import React from 'react'
    import ReactDOM from 'react-dom'
    
    class App extends React.Component {
      render () {
        return (
          // 注意这里得用this.props.name, 必须用this.props
          <h1>欢迎进入{this.props.name}的世界</h1>
        )
      }
    }
    ReactDOM.render(
      <App name="react" />,
      document.getElementById('root')
    )
    

    运行结果和之前完全一样,因为JS里没有真正的class,这个class只是一个语法糖, 但二者的运行机制底层运行机制不一样。

    • 函数式组件是直接调用, 在前面的代码里已经有看到
    • es6 class组件其实就是一个构造器,每次使用组件都相当于在实例化组件.

    3.组件的组合、嵌套

    将一个组件渲染到某一个节点里的时候,会将这个节点里原有内容覆盖

    组件嵌套的方式就是将子组件写入到父组件的模板中去,且react没有Vue中的内容分发机制(slot),所以我们在一个组件的模板中只能看到父子关系

    // 从 react 的包当中引入了 React 和 React.js 的组件父类 Component
    // 还引入了一个React.js里的一种特殊的组件 Fragment
    import React, { Component, Fragment } from 'react'
    import ReactDOM from 'react-dom'
    
    class Title extends Component {
      render () {
        return (
          <h1>欢迎进入React的世界</h1>
        )
      }
    }
    class Content extends Component {
      render () {
        return (
          <p>React.js是一个构建UI的库</p>
        )
      }
    }
    /** 由于每个React组件只能有一个根节点,所以要渲染多个组件的时候,需要在最外层包一个容器,如果使用div, 会生成多余的一层dom
    class App extends Component {
      render () {
        return (
            <div>
                <Title />
            <Content />
          </div>
        )
      }
    }
    **/
    // 如果不想生成多余的一层dom可以使用React提供的Fragment组件在最外层进行包裹
    class App extends Component {
      render () {
        return (
          <Fragment>
            <Title />
            <Content />
          </Fragment>
        )
      }
    }
    ReactDOM.render(
      <App/>,
      document.getElementById('root')
    )
    

    三、JSX原理

    要明白JSX的原理,需要先明白如何用 JavaScript 对象来表现一个 DOM 元素的结构?

    看下面的DOM结构

    <div class='app' id='appRoot'>
      <h1 class='title'>欢迎进入React的世界</h1>
      <p>
        React.js 是一个帮助你构建页面 UI 的库
      </p>
    </div>
    

    上面的内容我们可以用Javascript对象的方式来表示

    {
          tag:'div',
          attrs:{className:'app',id:'appRoot'},
          children:[
          tag:'h1',
          attr:{ className:'title'},
          children:{
           tag:'p',
           attrs:null,
           children:["React.js 是一个帮助你构建页面 UI 的库"]
            ]
            ]
            
    }
    }
    

    相关文章

      网友评论

          本文标题:React基础教程(一)

          本文链接:https://www.haomeiwen.com/subject/hgcovktx.html