React

145 阅读2分钟

1.什么是React

  • 一个快速构建前端视图的javascript库

2.虚拟DOM

  1. 真实dom:操作真实dom节点成本太大
  2. 什么是虚拟dom:使用js去描述真实dom节点
  3. 创建虚拟dom的方法
  4. 封装虚拟dom转换成真实dom的方法

3.JSX

    1.是什么

          a.jsx是xml和js的结合,可以更加直观影响的表示dom

          b.不是合法的js语法,不借助“外力”是不能被浏览器识别的

          c.需要使用babel来进行转码编译成浏览器能识别的js代码

   2.写法

const app = <div id="app">hello</div

   3.搭配环境安装依赖

          a.@babel/core

          b.@babel/cli

          c.@babel/plugin-transform-react-jsx

   4.运行转义:npx babel src -d dist

   5.jsx语法特性:(使用{ }来区分xml还是js,遇到<>当成标签解析,遇到{ }当成js代码解析)

          a. js表达式:花括号

          b. 样式类名

                1.class=className

                2.For=htmlFor

                3.内联样式(react推荐使用内联样式)

const app = <div id="app" style={fontSize:24}>app</div

           c.数组:JSX允许在模板中插入数组,数组会自动展开所有成员

           d.jsx不是合法的js语法,不能被js引擎解析(所以需要babel)

   6.安装vscode插件

       ES7 React/Redux/GraphQL/React-Native snippets 2.8.3

4.搭建React环境

   1.安装依赖

        a. react:react的核心代码

        b. react-dom:处理真实dom的代码,比如把虚拟dom转成真实dom

        c. webpack

        d. webpack-cli

     当使用jsx的时候

        a. @babel/core babel-loader

        b. @babel/plugin-transform-react-jsx

        c. 配置babelrc

    2.两个核心方法

         a. react.createElement( 类似标签名,属性,子节点...) :创建虚拟dom

         b. reactDom.render(虚拟dom,挂载dom点,回调函数 )

 5.在react中使用jsx

     1.类名 class=className

     2. label的for属性 = htmlFor属性

     3. 循环数组的时候,要加key属性

     4. 标签的属性值如果为变量,不需要加引号,直接花括号包住变量即可

     5. style和class的写法 

<span className={styleList.join(' ')} style={{color:"red"}}>111</span>

 6.使用脚手架快速搭建react的环境

     1.全局安装脚手架

           a. npm i create-react-app -g

           b. 检测是否安装成功:在命令行里面输入create-react-app --version 如果能成功输出版本号,则安装成功

     2. 使用步骤

           a. 创建项目 :create-react-app 项目名称

           b. 释放:(目的是暴露出react的相关配置文件):npm run eject

     3. 目录结构的认识

          a. 入口文件

 7.react重要概念

      1.组件

          a.函数式组件:

                i :  首先是个函数

               ii:其次必须返回一个虚拟dom

          b.类组件:语法糖

               i : 引入component

              ii : 按照类的方式创建并继承Component

             iii : render函数必须有,并且必须返回虚拟dom

 8.组件实例

     1. this指向问题

            a. 类组件内部的this,指向的就是当前组件,当前实例

     2. 组件实例是独立且不相同

     3. 组件实例上挂载了组件相关的属性和方法

     4. 绑定事件

 9.组件内部状态

     1. State

            a.初始化状态

  state={ list: [1,2,3] }

            b. 获取状态:this.state

{this.state.list.map((item,key)=> <div key={key}>{item}</div>)}

            c. 修改状态 :setState方法(异步)

                 1.不要直接修改state:this.state.name="123"

                 2. 使用setState方法修改state:更新原理是合并对象 this.setState的第二个参数,dom更新结束之后执行

10.父子通信

   1.父=>子通信 :父组件给子组件传递属性(属性的值可以是函数,数据)

            a. props:父组件给子组件的属性   : props不能被修改

            b. 父组件传

<Title name={"hello"}></Title>

            类组件接受

{this.props.name}

            函数式组件接受:参数要从形参中去取

function List(props)

 2. 子=>父通信 : 子组件触发父组件传递过来的函数

        父组件传递函数

<Fu setFun={()=> this.function()} ></Fu>

        子组件接受传过来的函数

<div onClick={()=>this.props.setFun()}></div>

 11.组件的子元素

    1.是什么:写在标签中间的内容

<List>子元素</List>

    2.如何获取:在组件中 this.props.children

 12.跨级传参

   1.上级给下级传

         a. createContext: 执行会返回两个虚拟dom

                1.Provider:提供数据

                2.Consumer:接收数据