react-01

目录

目录

webpack

react初步

第一个react代码

创建组件

函数组件(箭头函数)

创建类组件

组件嵌套

JSX原理

组件中的样式

Classnames三方包

styled-component三方包

react目录

组件的数据挂载

props

prop-types三方包

propTypes

defaultProps

state

模板渲染语法

用map

dangerouslySetInnerHTML

props向下传递技巧

setState

事件

tips

为什么不直接把逻辑写在标签中

为什么使用箭头函数

传参

键盘事件

ref

改变完成功能

健壮代码

解决更改一组数据导致todos全部重新渲染的问题

生命周期

挂载

constructor()

static getDeriveStateFromProps()

render()

componentDidMount()

更新

组件更新的生命周期调用顺序

shouldComponentUpdate()

getSnapshotBeforeUpdate()

卸载

componentWillUnmount()

额外的APIs

使用AJAX

axios

react-hooks(新)

useState

useEffect

组件通信

Context

HOC

高阶组件概要

高阶组件props传值

​装饰器

状态管理

传统MVC框架的缺陷

Flux

Redux

自己实现Redux

使用Redux

三个概念

redux中的文件

react-redux

异步action

标准的redux工作模型


webpack

本质上webpack是一个现在JS应用程序的静态模块打包器,当webpack处理应用程序时,会递归地构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bundle

入口:指示webpack应用使用哪个模块来作为构建内部依赖图的开始

输出:webpack在哪里输出它所创建的bundle以及如何命令这些文件

loader:webpack只能理解JS和JSON文件,loader让webpack能够去处理其他类型的文件并将他们转换为有效模块以供应用程序使用以及被添加在依赖图中

插件

模式:通过选择development、production或none之中的一个来设置mode参数,默认值为production

webpack如果没有任何配置的话会自动查找src下的index.js

插件们

html-webpack-plugin:可以使用自己的html文件用来打包

mini-css-extract-plugin:在打包时可以令css文件单拎出来

webpack-dev-server:基于express的本地服务器 => 自动刷新页面

postcss-loader:有一些css属性在特殊的情况下是要加前缀的,使用此插件自动生成前缀(一些电脑浏览器可能需要加前缀 => 浏览器兼容性)

file-loader:打包时处理文件(图片)等

copy-webpack-plugin:有的时候有些东西不需要处理,比如字体文件。用此插件进行拷贝:将某些资源直接原封不动的拷贝过去

babel-loader

react初步

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

创建脚手架

npm install -g create-react-app 
create-react-app 项目名

or

npx create-react-app 项目名

版本16开始写法发生了重大改变/16.4/16.8

第一个react代码

创建组件

函数组件(箭头函数)

名字要大写开始

const App = (props) => {
    return (
        <div>
            <h1>Welcome {props.title}!!</h1>
            <p>优秀的{props.title}</p>
        </div>
    )
}

ReactDOM.render(
    <App title="1901"/>,
    document.querySelector('#root')
)

原理如下: 

const app:这种方式可以理解为创建了一个简单的react元素

react中只有一个语法就是花括号{}

return中如果有多行,则使用()防止报错 => 把括号里的内容都当做一个域值类

只要在jsx里要插入js的代码,就加一层花括号即可,注释也是js

创建类组件

使用类来继承React下的Component

要使用this.props.title

这样写会报错,因为app不是element

所以要调用实例上的render方法

//定义组件的第二种方法:使用类
class App extends React.Component {
    render() {
        return (
            <div>
                <h1>类组件!!</h1>
                <p>{this.props.title }</p>
            </div>
        )
    }
}

const app = new App({
    title:'class'
}).render()

render(
    app,
    document.querySelector('#root')
)

在react16以前,使用这种方法来创建一个类组件,现在已经运行不起来了

React.createClass({
    render() {
        return <h1>xxx</h1>
    }
})

render

是react dom 提供的一个方法,这个方法通常只会用一次

组件嵌套

JSX原理

底层编译原理

import React from "react";
import ReactDom from "react-dom";

//这里是使用类的形式创建的组件
class App extends React.Component {
    render() {
        return (
            React.createElement(
                'div',
                {
                    className: 'app',
                    id: 'appRoot'
                },
                React.createElement(
                    'h1',
                    {
                        className:'title'
                    },
                    'JSX原理'
                ),
                React.createElement(
                    'p',
                    null,
                    '类组件是继承React.Component的'
                )
            )
        )
    }
}

//这里是一个表示虚拟DOM树的方式
const appVDom = {
    tag: 'div',
    attrs: {
        className: 'app',
        id: 'appRoot'
    },
    children: [
        {
            tag: 'h1',
            attrs: {
                className: 'title',
            },
            children: [
                'JSX原理'
            ]
        }, {
            tag: 'p',
            attrs: null,
            children: [
                '类组件是继承React.Component的'
            ]
        }
    ]
}

render(
    <App />,
    document.querySelector('#root')
)

React.createElement是一个方法,用于创建元素,可以有很多的参数,但是前两个是固定的,第一个可以理解为标签名,第二个可以理解为标签的属性,剩下的就继续写更多的子元素。

React.createElement(type,[props],[...children])

组件中的样式

render() {
        return (
            <div>
                <h1 style={
  {color:"purple"}}>元素中的样式</h1>
            </div>
        )
    }

or

class App extends Component{
    render() {
        const style = {color:'purple'}
        return (
            <div>
                <h1 style={style}>元素中的样式</h1>
            </div>
        )
    }
}

两个花括号:第一个表明要在JSX中写JS,第二个表明要写一个对象

Classnames三方包

<li className={className('a',{'b':true,'c':false})}>要动态添加不同的className就可以使用第三方包:classNames</li>

styled-component三方包

独立css内容

import { render } from "@testing-library/react";
import React, {ReactDom,Component} from "react";
import './index.css'
import className from "classnames";
import styled from 'styled-components'

const Title = styled.h1`
    color:green
`

class App extends Component{
    render() {
        const style = {color:'purple'}
        return (
            <div>
                <Title>元素中的样式</Title>
                <ol>
                    <li style={style}>使用style内联创建</li>
                    <li className="has-text-red">使用class的方式,但是在react中class要写成className</li>
                    <li className={className('a',{'b':true,'c':false})}>要动态添加不同的className就可以使用第三方包:classNames</li>
                    <li>styled-component的使用</li>
                </ol>
            </div>
        )
    }
}

render(
    <App></App>,
    document.querySelector('#root')
)

react目录

index.js是入口文件

App.js整体的单一应用的入口文件 (vscode插件中:rfc创建函数式组件,rcc创建继承式组件)

组件的return必须只有一个根元素

如果使用div的话就会额外生成一层标签,可以使用<Fragment><Fragment/> => 用来展示空标签,也可以直接写空标签<></>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值