目录

React基础之项目实战

目录

React基础之项目实战

规范的项目结构

https://i-blog.csdnimg.cn/direct/295ea54b81f8427498d3b211a11c77d5.png

安装scss

npm install sass -D

安装Ant Design组件库

内置了一些常用的组件

npm install antd –save

路由基础配置

npm i react-router-dom

路由基本入口

import

Layout

from

“../page/Layout”

;

import

Login

from

“../page/Login”

;

import

{

createBrowserRouter

}

from

“react-router-dom”

;

const

router

=

createBrowserRouter

([

{

path:

“/”

,

element:

<

Layout

/>

},

{

path:

“/login”

,

element:

<

Login

/>

}

])

export default

router

主index.js入口配置

import

React

from

‘react’

;

import

ReactDOM

from

‘react-dom/client’

;

import

{

RouterProvider

}

from

‘react-router-dom’

;

import

router

from

‘./router’

;

const

root

=

ReactDOM

.

createRoot

(

document

.

getElementById

(

‘root’

));

root

.

render

(

<

React.StrictMode

< RouterProvider router = { router } />

</

React.StrictMode

);

https://i-blog.csdnimg.cn/direct/5901cb507302473385a5c81b21b98af1.png

配置@别名路径

安装craco工具包

npm i @craco/craco -D

也就是将替换成@

https://i-blog.csdnimg.cn/direct/0f871d93447b457799f67c57a6955f7d.png

1.创建craco.config.js配置文件

const

path

=

require

(

‘path’

)

module

.

exports

= {

// webpack

配置

webpack:

{

//

配置别名

alias:

{

//

约定:使用

@

表示

src

文件所在路径

‘@’

:

path

.

resolve

(

__dirname

,

‘src’

)

}

}

}

2.将package.json进行替换的scripts

“scripts”

{

“start”

:

“craco start”

,

“build”

:

“craco build”

,

“test”

:

“craco test”

,

“eject”

:

“craco eject”

},

添加路径提示

1.创建jsconfig.json

{

“compilerOptions”

{

“baseUrl”

:

“./”

,

“paths”

{

“@/*”

[

“src/*”

]

}

}

}

Login开发通过使用antDesion组件

Token持久化

因为Redux是基于浏览器内容的存储方法,刷新时状态会恢复为初始值,比如登录之后Token再刷新页面之后就会丢失

我们可以在获取到token之后,就在本地的localStorage进行存储,在进行token初始化的时候,先判断token在localStorage中有没有,如果没有则为空,如果有那就用localStrage中的

token请求头注入

import

axios

from

‘axios’

import

{

getToken

}

from

‘./token’

const

request

=

axios

.

create

({

baseURL:

'

'

,

timeout:

5000

})

// 添加请求拦截器

request . interceptors . request . use (( config ) => {

// 操作 config 注入 token 数据

//1. 获取 tolen

const token = getToken ()

//2. 注入 token

if ( token ){

config . headers . Authorization = Bearer** **${** **token** **}** **

}

return config

}, ( error ) => {

return Promise . reject ( error )

})

// 添加响应拦截器

request

.

interceptors

.

response

.

use

((

response

)

=>

{

// 2xx

范围内的状态码都会触发该函数。

//

对响应数据做点什么

return

response

.

data

}, (

error

)

=>

{

//

超出

2xx

范围的状态码都会触发该函数。

//

对响应错误做点什么

return

Promise

.

reject

(

error

)

})

export

{

request

}

token跳转

1.封装路由组件

//封装高阶组件

//核心逻辑:有token 正常跳转,无token去登录

import

{

Navigate

}

from

‘react-router-dom’

import

{

getToken

}

from

‘@/utils’

export

function

AuthRoute

({

children

})  {

const

isToken

=

getToken

()

if

(

isToken

) {

return

<>

{

children

}

</>

}

else

{

return

<

Navigate

to

=

{

‘/login’

}

replace

/>

}

}

2.在路由配置中应用

import

Layout

from

“@/page/Layout”

;

import

Login

from

“@/page/Login”

;

import

{

createBrowserRouter

}

from

“react-router-dom”

;

import

{

AuthRoute

}

from

“@/components/AuthRouter”

;

const

router

=

createBrowserRouter

([

{

path:

“/”

,

element:

<

AuthRoute

<

Layout

/></

AuthRoute

},

{

path:

“/login”

,

element:

<

Login

/>

}

])

export default

router

初始化样式

npm install normalize.css0

并在项目入口index配置

import

’normalize.css'

设置Token失效或错误重新跳转登录页

import

axios

from

‘axios’

import

{

getToken

,

removeToken

}

from

‘@/utils’

import

router

from

‘@/router’

const

request

=

axios

.

create

({

baseURL:

'

'

,

timeout:

50000

})

// 添加请求拦截器

request

.

interceptors

.

request

.

use

((

config

)

=>

{

//

操作

config

注入

token

数据

//1.

获取

tolen

const

token

=

getToken

()

//2.

注入

token

if

(

token

){

config

.

headers

.

Authorization

=

`Bearer

${

token

}

`

}

return

config

}, (

error

)

=>

{

return

Promise

.

reject

(

error

)

})

// 添加响应拦截器

request . interceptors . response . use (( response ) => {

// 2xx 范围内的状态码都会触发该函数。

// 对响应数据做点什么

return response . data

}, ( error ) => {

// 添加 401 token 失效

if ( error . response . status === 401 ){

removeToken ()

router . navigate ( ’/login’ )

window . location . reload ()

}

return Promise . reject ( error )

})

export

{

request

}

快速接入Echart基础图标

npm i echarts

import

{

useEffect

,

useRef

}

from

‘react’

import

as

echarts

from

’echarts'

//柱状图

const

BarChart

=({

title

})

=>

{

const

chartRef

=

useRef

(

null

)

useEffect

(()

=>

{

var

chartDom

=

document

.

getElementById

(

‘main’

);

var

myChart

=

echarts

.

init

(

chartDom

);

var

option

;

option

= {

title:

{

text:title

},

xAxis:

{

type:

‘category’

,

data:

[

‘Mon’

,

‘Tue’

,

‘Wed’

,

‘Thu’

,

‘Fri’

,

‘Sat’

,

‘Sun’

]

},

yAxis:

{

type:

‘value’

},

series:

[

{

data:

[

120

,

200

,

150

,

80

,

70

,

110

,

130

],

type:

‘bar’

}

]

};

option

&&

myChart

.

setOption

(

option

);

}, [])

return

<

div

id

=

‘main’

style

=

{

{

width:

‘400px’

,

height:

‘300px’

}

}

/>

}

export default

BarChart

在其他部分复用

import

BarChart

from

“@/components/BarChart”

const

Home

= ()

=>

{

return

(

<

div

<

BarChart

title

=

'

三大框架满意度

'

/>

</

div

)

}

export default

Home

富文本编辑器

npm install react-quill