react教程

antD demo

import React from 'react';
import logo from './logo.svg';
import { Button, Space } from 'antd';
import './App.css';

function App() {
  return (
    
logo

Edit src/App.tsx and save to reload.

); } const BB: React.FC = () => { alert('hello') var nu: string[] nu = ['张三', '李斯', '许三多'] return ( { nu.map((valeu) => { return ( <> ) }) } ) }; export default App;

recat 中对与数组,对象的操作 尽量不要对原数据直接添加,最好生成新的对象数组,避免不要要的bug,页面不重新渲染

react教程_第1张图片

aap.js


import * as React from "react";
import { Routes, Route, Link} from "react-router-dom";
import AppForm from './views/from';
import './App.css';
function App() {
  return (
    

hello!React

} /> } />
); } // App.js function Home() { return ( <>

home

); } function About() { return ( <>

About

); } export default App;

from(函数)组件

import React, { useState, useEffect } from 'react';
import { Button, Space } from 'antd';

const myMethod = (setData,c) => {
  setData({
    a: c
  });
};
const AppForm = React.memo(() => {
  const [data, setData] = useState({ a: '1' });

  useEffect(() => {
    // 加载和调用方法,setData useEffect第一个参数异步此时打印的是1
    myMethod(setData,'wwwwwwwwwww');
    console.log( data.a);
  }, []);

  return (
    
      
      
    
  );
});

export default AppForm;

state

react教程_第2张图片

props(只读不能修改,可以运算)


import './App.css';

function App() {
  return (
    
); } const AppForm = ((props) => { console.log(props) //此行代码页面会报错 props.name='不能修改,会报错,所以props是只读' return (

{props.name}

); }); export default App;

react教程_第3张图片

扩展...传值

react教程_第4张图片

props 对组建标签进行属性限制 prop-typs

refs

字符串ref(官网已经不推荐)

react教程_第5张图片

拿到的是真实dom

 react教程_第6张图片

 react教程_第7张图片

 回调函数ref

c-当前节点,赋值给当前对象,然后从当前对象取值

react教程_第8张图片

注意事项 更新组件的时候内联函数会执行2次

react教程_第9张图片

react教程_第10张图片

 将ref的回调函数,定义成class的绑定函数

react教程_第11张图片

createRef 

 react教程_第12张图片

react事件处理

  1.  通过onXXX属性指定事件chuli函数(注意大小写)
  2.  Reacr使用的是自定义(合成)事件,而不是使用的原生DOM事件--为了更好的兼容性
  3. React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)--为了更高效
  4. 通过event。target得到发生事件的dom元素对象---不要过度使用ref

 react教程_第13张图片

收集表单数据 

现用现取非受控组建

react教程_第14张图片

受控组件

 react教程_第15张图片

高级函数和函数柯里化

react教程_第16张图片

高级函数 

react教程_第17张图片

【】中括号读变量名 取值  react教程_第18张图片

 柯里化

react教程_第19张图片

其他写法

react教程_第20张图片

 生命周期 

render

调用时机:初始化渲染,状态更新之后

componentDidMount

组件挂载完毕调用一次

react教程_第21张图片

componentWillUnmount()

组件将要卸载调用(卸载前)

旧版

react教程_第22张图片

react教程_第23张图片

 新版生命周期 17

react教程_第24张图片

 react教程_第25张图片

react教程_第26张图片 可以用来获取页面更新之前的数据(使用概率极低 )

react教程_第27张图片

react教程_第28张图片

diffing

react教程_第29张图片

react教程_第30张图片

错位

react教程_第31张图片

初始dom和更新后的dom对比, key0 小张变小王,内容发生变化,对比input 发现内容一样,使用旧的,真实dom 的 input 不会重新更新,以此类推会导致数据错位

react教程_第32张图片 react教程_第33张图片

 react脚手架

npx安装创建(官方推荐)

npx:是一种在npm中安装工具,在 npm version >= 5.2.0 开始,自动安装了npx。目的是提升包内提供的命令行工具的使用体验。

npx create-react-app 是固定命令,create-react-app是React脚手架的名称。

npx 命令会帮助我们临时安装create-react-app包,然后初始化项目完成之后会自自动删掉,所以不需要全局安装create-react-app 

npx create-react-app my-app
cd my-app
npm start

指定React版本安装

npx create-react-app my-app安装默认都是最新的版本,因为React18与React17的语法有些差别如果想使用React17的版本,需要我们指定版本,执行如下代码进行版本降级:

npm install [email protected] [email protected] --save

注意:npm install 安装库@版本号 --save
17.x 表示的更新范围为>=17.0.0&&< 18.0.0
17.2.x 表示的更新范围为>=17.2.0&&< 17.3.0 

降级完成之后,对src下的入口文件index.js进行修改,如下:

import React from 'react'
import ReactDOM from 'react-dom'
 
import App from './App'
// 18
// const root = ReactDOM.createRoot(document.getElementById('root'));
// root.render(
//   
//     
//   
// );
 
// 17
ReactDOM.render(
  
    
  ,
  document.getElementById('root')
)

项目结构介绍

react教程_第34张图片

 index.html

react教程_第35张图片

创建类组件

react教程_第36张图片

函数组件在上面from组件

vscode中的react插件

react教程_第37张图片

rcc -类组件

rfc-快速生成函数式组件

react ajax 配置代理

axios

react教程_第38张图片

react教程_第39张图片

单个代理 

3000没有的资源找5000

react教程_第40张图片

多代理setupProxy.js. 文件名固定 

react教程_第41张图片

react教程_第42张图片

 react教程_第43张图片

react教程_第44张图片

react教程_第45张图片 案例

连续解构复制

react教程_第46张图片

react教程_第47张图片

案例二

react教程_第48张图片

父组件

react教程_第49张图片

子组件

react教程_第50张图片 react教程_第51张图片

react兄弟组件交互 消息订阅与发布PubSubJS

案例 

app.js---展示 父组件

search---子组件

list---子组件

app

react教程_第52张图片

searc h传数据给list

react教程_第53张图片

list届收订阅消息

react教程_第54张图片

react教程_第55张图片 list输出

react教程_第56张图片

 react教程_第57张图片

 React路由

插件 react-router-dom 版本5,目前已更新到版本6

  react教程_第58张图片

 路由组件和一般组件

react教程_第59张图片

 

修改默认激活点击样式

react教程_第60张图片

react教程_第61张图片

 封装navlink

标签体(开始标签和结束标签中的文本)中的内容也会被收集到props属性中,默认key是 children

封装MyNavLink

react教程_第62张图片

 使用

react教程_第63张图片

总结

react教程_第64张图片

新版以废弃 

匹配到hone组件后,就不会继续往下匹配

react教程_第65张图片

 react教程_第66张图片

解决多级路径刷新页面样式丢失问题

react教程_第67张图片

路由的模糊匹配和精准匹配 exact

react教程_第68张图片

 

重定向 

react教程_第69张图片

react教程_第70张图片

 嵌套路由

路由匹配是按照注册顺序的,如果子路由不加home前缀,会先匹配最开始注册的路由,由于没有/news 路由,所以会重定向到about,加了前缀home 会进行模糊匹配,先匹配到home路由,然后再往下匹配

react教程_第71张图片

home下的子路由

react教程_第72张图片

 react教程_第73张图片

 向路由组建传递参数(props) 

第一种params参数

react教程_第74张图片

组件接收

react教程_第75张图片

react教程_第76张图片

 react教程_第77张图片

 传递search参数

react教程_第78张图片

取参数

react教程_第79张图片 react教程_第80张图片

 react教程_第81张图片

 react教程_第82张图片

 传递state参数(路由组件独有的参数,和组件的state没有任何关系)

地址栏不带信息

注意:清空浏览器缓存 数据会丢失

react教程_第83张图片

传递的是个对象

react教程_第84张图片

接收参数

react教程_第85张图片

react教程_第86张图片

react教程_第87张图片 push 与replace模式 默认是push

push 有历史痕迹, 

路由历史是栈 

开启replace模式 (会替换,如果所有的路由都开启,就没有浏览痕迹)

 

 编程式路由导航(代码操作路由跳转)

replace 跳转

react教程_第88张图片

push跳转

react教程_第89张图片

react教程_第90张图片

 一般组件使用路由组件的api withRouter

react教程_第91张图片

withRouter的返回值是一个新组建

BrowserRouter和HashRouter的区别

react教程_第92张图片

React路由6

概述

react教程_第93张图片

使用案例

index.js

react教程_第94张图片

app.js

react教程_第95张图片

 react教程_第96张图片

重定向 navigate

react教程_第97张图片

  

react教程_第98张图片

react教程_第99张图片

路由跳转模式,默认是push  可以开启replace

react教程_第100张图片

 caseSensitive 区分路由大小写(默认不区分)

react教程_第101张图片 使用 caseSensitive 区分大小写react教程_第102张图片

 navlink自定义高亮

react教程_第103张图片

react教程_第104张图片

 路由表(useRoutes)

react教程_第105张图片

 使用

 react教程_第106张图片

react教程_第107张图片

 嵌套路由

修改路由表 配置子路由

react教程_第108张图片

 home

  react教程_第109张图片

 点击子级路由取消父级高亮 在父级 路由标签加end 属性

路由传参

message的子路由

react教程_第110张图片

message  传参的地方

params参数

react教程_第111张图片

路由表 占位符

react教程_第112张图片

 子路由组件 Detail 获取参数

react教程_第113张图片

search参数 

路由表不需要占位符

react教程_第114张图片

 message传参数的地方

react教程_第115张图片

 detail接收参数

react教程_第116张图片

setSearch 更新传入的search参数 (了解即可)

react教程_第117张图片

 state参数

路由表不需要占位

react教程_第118张图片

message传参

react教程_第119张图片

Detail接收参数

react教程_第120张图片

编程式路由导航uaseNavigare

react教程_第121张图片

react教程_第122张图片

 其他

react教程_第123张图片

 redux(状态管理)

react教程_第124张图片

react教程_第125张图片

react教程_第126张图片

精简版 

store.js
react教程_第127张图片 .count_reducer.js

react教程_第128张图片 组件中使用

react教程_第129张图片

。初始化调用countRedecur 是 获取的0

react教程_第130张图片 调用修改redux中的状态值

react教程_第131张图片

react教程_第132张图片

redux只管理状态,不会调用render 所以状态变化的页面不会渲染,需要监听一下redux中状态的变化,只要有变化,就重新渲染组件

上面的方法如果有多个组件,每个组件都需要写

方法二 

直接在渲染整个外层的组件,有diff算法不会影响效率问题

react教程_第133张图片

 react教程_第134张图片

 完整版redux

count_action.js 抽出固定判断对象

react教程_第135张图片

 组件使用

react教程_第136张图片

 异步函数 dispatch传入的是对象是同步,传入的是函数就是异步 

react教程_第137张图片

组件react教程_第138张图片

react教程_第139张图片

react教程_第140张图片

第二种写法

react教程_第141张图片

react-redux  faceBook 出品

redux文件创建和上一章节一样

react教程_第142张图片

 容器组件

容器组件和ui组件关联

react教程_第143张图片

aap.js

最外层组件 给容器组件传入store进行关联

使用容器组件会自动加载ui组件count

react教程_第144张图片

 最终

index.js

react教程_第145张图片

 优化

不需要我们在手动监测

react教程_第146张图片

app.js

给容器传递store

react教程_第147张图片

 优化 app.js 和 index.js

react教程_第148张图片

入口文件index.js,把store传给所有组件

react教程_第149张图片

 redux文件

,第一个constant 放常量的,没有截图,知道就行

react教程_第150张图片

 容器组件

react教程_第151张图片 可以使用count_action 定义的 方法再精简一下

react教程_第152张图片

可以传递多个方法,用逗号隔开

react教程_第153张图片 优化

react教程_第154张图片

 ui组件

调用父组件传递的jia方法

react教程_第155张图片

 接收参数

react教程_第156张图片

整合ui组件和容器组件 

ui组件拿到容器组件就行

react教程_第157张图片

redux多组建共享一个状态 

写一套和count一样的redux

react教程_第158张图片

修改store.js  汇总reducers

此时state 是个对象,注意区值方式

react教程_第159张图片

 容器中掌握了所有的redux

react教程_第160张图片

 纯函数

react教程_第161张图片

React扩展 

setState

更新状态的两种写法

第一种

react教程_第162张图片

 第二种

react教程_第163张图片

 react教程_第164张图片

 lazyLoad 路由懒加载

loding不能做懒加载

react教程_第165张图片

 Suspence 加载中显示的内容

react教程_第166张图片 Hooks

react教程_第167张图片

react教程_第168张图片

 useState 

react教程_第169张图片

 react教程_第170张图片

useEffect 

加空数组 组件初始化执行

react教程_第171张图片

 react教程_第172张图片

 react教程_第173张图片

useRef 

react教程_第174张图片

 react教程_第175张图片

 react教程_第176张图片

 Fragment  类似 空标签 <>

区别 fragment 可以有个key 属性,用来遍历

解决嵌套无用的div标签

react教程_第177张图片

 Context 组件之间通信(一般常用后代组件传递,父子直接使用props)

react教程_第178张图片

react教程_第179张图片 用Provider 包围下的所有子组件都可以获取到

 注意想要使用必须要声明一下

react教程_第180张图片

第一种只支持类组件

第二种方式 支持类组件和函数组件

 react教程_第181张图片

 react教程_第182张图片

 组件优化 类组建继承Component的问题

react教程_第183张图片

所有类组件都继承 PureComponent

react教程_第184张图片注意 :以下写法,修改的是同一对象,因为PureComponent底层比较的是对象地址,所以render不会被调用,即使内容有所改变,页面也不会重新渲染,因为obj和state指向的是同一地址

  react教程_第185张图片 

render props 向组建内部动态传入带内容的结构(标签)

react教程_第186张图片

 react教程_第187张图片

 this.props.children 拿到A标签的方法体

react教程_第188张图片 B标签可以通过方法动态替换,类似vue的插槽技术react教程_第189张图片

react教程_第190张图片

错误边界 

在容易发生错的父组建动手脚

假设一个会报错的子组件

解携users可定会报错

react教程_第191张图片

 把错误限制在父组件

注意:此方法只适用于打包后,测试只会出来一瞬间

react教程_第192张图片

 react教程_第193张图片

注意只能捕捉生命周期的错误

react教程_第194张图片

 组件通信方式总结

react教程_第195张图片

你可能感兴趣的:(react.js,前端,前端框架)