• React【axios、全局处理、 antd UI库、更改主题、使用css module的情况下修改第三方库的样式、支持sass & less】(十三)


    文件目录

    Proxying in Development

    http-proxy-middleware

    fetch_get

    fetch 是否成功

    axios

    全局处理

     antd UI库

    更改主题

    使用css module的情况下修改第三方库的样式

    支持sass & less


     

    Proxying in Development

    在开发模式下,如果客户端所在服务器跟后台服务器的地址或者端口不一致,则会出现跨域的问题。
    服务器运行在3030端口:

    1. //server/index.js
    2. const express=require('express')
    3. const app=express()
    4. app.get('/api/*',(req,res)=>{
    5.    res.send('来自服务端的响应信息!!')
    6. })
    7. app.listen(3030,()=>{
    8.    console.log('服务器正在监听3030端口')
    9. })

    发送网络请求:
     

    1. import logo from './logo.svg';
    2. import './App.css';
    3. import { Outlet } from 'react-router-dom';
    4. function App() {
    5.  const onFetch=()=>{
    6.      //向服务器发送网络请求
    7.    fetch('http://localhost:3030/api/user')
    8. }
    9.  return (
    10.    <div className="App">
    11.      <button onClick={onFetch}>发送请求button>
    12.    div>
    13. );
    14. }
    15. export default App;

     使用Proxy解决跨域
    在package.json中设置Proxy属性:

    "proxy":"http://localhost:3030"
    

    设置代理后,则发送的api请求会被代理服务器转发到 localhost:3030

    1. 提示:
    2. proxy代理仅在开发中有效。
    3. 在生产环境下,这个代理无效。

    http-proxy-middleware
     

     为了更灵活的配置代理信息,我们可以使用http-proxy-middleware。

    1、安装http-proxy-middleware
     

    1. npm install http-proxy-middleware  
    2. //或者 yarn add http-proxy-middleware

    2、创建src/setupProxy.js文件

    1. const { createProxyMiddleware } = require('http-proxy-middleware');
    2. module.exports = function(app) {
    3. //app为Express实例
    4.    //使用app.use注册中间件
    5.  app.use(
    6.    '/api/*',
    7.    createProxyMiddleware({
    8.        //target:服务器地址
    9.      target: 'http://localhost:3030',
    10.      changeOrigin: true
    11.   })
    12. );
    13. };

    提示:
    该文件是只支持NodeJs语法,因为它运行在Node环境中。

    fetch_get

     fetch是浏览器提供的API,用于发起获取资源的请求,它返回一个 promise。

    fetch(input[, init])
          input:要获取资源的 URL
          init:(可选)配置对象
          返回Promise


    get
     

    1. fetch('/api/user').then(res=>{
    2.      // res是响应对象
    3.      //返回的body是字符串,所以使用text()读取
    4.      return res.text()
    5.   }).then(data=>{
    6.      console.log(data)
    7.   })

    传递参数

    1. //get请求传递参数
    2. fetch('/api/user?name=baizhan').then(res=>{
    3.      // res是响应对象
    4.      //返回的body是json,所以使用json()读取
    5.      return res.json()
    6.   }).then(data=>{
    7.      console.log(data)
    8.   })

    fetch 是否成功

     当遇到网络错误时, fetch() 返回的 promise 会被 reject。成功的 fetch() 检查不仅要包括 promise 被 resolve,还要判断下status,HTTP 500或者404 状态并不被认为是网络错误,依然会返回响应对象,只不过它的ok为false。
    服务器的状态码返回500:

    res.status(500).send('服务器发生错误')})
    1. fetch('/api/user').then(res=>{
    2.      // res是响应对象
    3.      console.log(res)
    4.        return res.text()
    5.   }).then(data=>{
    6.      console.log(data)
    7.   }).catch(e=>{
    8.      // catch捕获不到我们预期的错误
    9.   })

    应当判断响应信息的status或者ok是否为true,否则抛出错误
     

    1. fetch('/api/user').then(res=>{
    2.      // res是响应对象
    3.      console.log(res)
    4.      if(res.status==200){
    5.        return res.text()
    6.     }
    7.      throw new Error('响应发生错误')
    8.   }).then(data=>{
    9.      // 抛出错误,则这个回调函数并不会被调用
    10.      console.log(data)
    11.   }).catch(e=>{
    12.      // 抛出错误,catch捕获,可以编写处理错误的逻辑
    13.   })

    axios

     Axios 是一个基于 promise 网络请求库。

    1、安装axios

    1. npm instal axios
    2. //或者yarn add axios

    get

    1. axios.get('/api/user',{params: {name:'xiaotong'}}).then(res=>{
    2.      console.log(res.data)
    3.   })

    post

    1. //传递json数据  
    2. axios.post('/api/user', {name:'xiaotong'}).then(res=>{
    3.      console.log(res.data)
    4.   })
    1. //传递表单数据  
    2. axios.post('/api/user',{name:'xiaotong'},{
    3.      headers:{"Content-Type":"application/x-www-form-urlencoded"}
    4.   }).then(res=>{
    5.      console.log(res.data)
    6.   })

    全局处理

    1、指定默认配置
    您可以指定默认配置,它将作用于每个请求。

    1. axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
    2. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

    2、拦截器
    在请求或响应被 then 或 catch 处理前拦截它们。
     

    1. // 添加请求拦截器
    2. axios.interceptors.request.use(function (config) {
    3.      // 在发送请求之前做些什么
    4.      config.headers['Authorization'] = 'xxxxxxx';
    5.      config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
    6.      return config
    7.   });
    8. // 添加响应拦截器
    9.  
    10. axios.interceptors.response.use(function
    11. (response) {
    12.      // 2xx 范围内的状态码都会触发该函数。
    13.      // 对响应数据做点什么
    14.      console.log(response)
    15.      return response
    16.   }, function (error) {
    17.      // 超出 2xx 范围的状态码都会触发该函数。
    18.      // 对响应错误做点什么
    19.      console.log(error)
    20.      
    21.   })

    提示:
    axios参考文档:https://www.axios-http.cn/docs/intro

     antd UI库

     antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研
    发企业级中后台产品。

    官方文档:https://ant.design/index-cn

     1、安装antd

    1. npm install antd
    2. //或者yarn add antd

    2、使用antd

    1. //AntdTest.js
    2. import React from 'react';
    3. import { Button, DatePicker } from 'antd'
    4. export default function index() {
    5.    return (
    6.        <div >
    7.            <Button type='primary'>我是来自antd的按钮Button>
    8.            <DatePicker />
    9.        div>
    10.   );
    11. }


    3、国际化
     

    1. //index.js
    2. import zhCN from 'antd/locale/zh_CN';
    3. import {ConfigProvider} from 'antd'
    4. <React.StrictMode>
    5.    <ConfigProvider locale={zhCN}>
    6.    <App/>
    7.    ConfigProvider>
    8.  React.StrictMode>

    4、引入重置样式
     

    1. //index.js
    2. import 'antd/dist/reset.css';

    更改主题

     更改主题
    通过ConfigProvider设置主题
    切换内置主题:默认有三个内置主题(defaultAlgorithm,darkAlgorithm, compactAlgorithm)

     

    1. //通过修改 ConfigProvider 中 theme 属性的 algorithm 属性来切换
    2. import {ConfigProvider,theme} from 'antd'
    3. //index.js
    4. <ConfigProvider locale={zhCN} theme={{
    5.       algorithm: theme.darkAlgorithm,
    6.   }}>
    7.    <App/>
    8.  
    9.    ConfigProvider>

    配置主题(修改主题变量)
     

    1. <ConfigProvider
    2.    theme={{
    3.      token: {
    4.        colorPrimary: '#00b96b',
    5.     },
    6.   }}
    7.  >
    8.    <App />
    9.  ConfigProvider>

    提示:
    主题变量参考   https://ant.design/docs/react/customize-theme-cn

     使用Desing Token

    1. import React from 'react';
    2. import { Button, DatePicker ,theme} from 'antd'
    3. export default function index() {
    4.    //调用theme的useToken()获取当前主题下的Design Token
    5.    const {token}=theme.useToken()
    6.    return (
    7.        <div >
    8.            <Button type='primary'>我是来自antd的按钮Button>
    9.            <DatePicker />
    10.           {/* 根据变量名来访问 */}
    11.            <div style= {{color:token.colorPrimary}}>hello,xiaotongdiv>
    12.        div>
    13.   );
    14. }

    使用css module的情况下修改第三方库的样式

     

    1. //AntdTest/index.module.css
    2. .container :global(:where(.css-dev-only-donot-override-1ni1eeq).ant-btn-primary){
    3.    background:red
    4. }

    :where 选择器降低 CSS Selector 优先级,以减少用户升级 v5 时额外调整自定义样式成本。
     比对:

    1. .ant-btn-primary{
    2. background:red//它的优先级更高
    3. }
    4. :where(.css-dev-only-do-not-override-1ni1eeq).ant-btn-primary{
    5. background:blue
    6. }

    支持sass & less

     支持sass
           安装sass

    1. npm install sass
    2. 或者yarn add sass

          更改文件的后缀为.scss
     

    支持less
         导出配置文件。

    1. npm run eject
    2. 或者yarn run eject

    安装less和less-loader
     

    1. npm install less less-loader -D
    2. 或者yarn add less less-loader -D

    修改webpack.config.js

    1. //定义正则,用来查找文件以.less结尾的文件
    2. const lessRegex = /\.less$/;
    3. const lessModuleRegex = /\.module\.less$/;
    4. {
    5.              test: lessRegex,
    6.              exclude: lessModuleRegex,
    7.              use: getStyleLoaders(
    8.               {
    9.                  importLoaders: 3,
    10.                  sourceMap: isEnvProduction
    11.                    ? shouldUseSourceMap
    12.                   : isEnvDevelopment,
    13.                  modules: {
    14.                    mode: 'icss',
    15.                 },
    16.               },
    17.                'less-loader'
    18.             ),
    19.              // Don't consider CSS imports dead code even if the
    20.              // containing package claims to have no side effects.
    21.              // Remove this when ,webpack adds a warning or an error for this.
    22.              // See https://github.com/webpack/webpack/issues/6571
    23.              sideEffects: true,
    24.           },
    25.            // Adds support for CSS Modules, but using SASS
    26.            // using the extension.module.scss or .module.sass
    27.           {
    28.              test: lessModuleRegex,
    29.              use: getStyleLoaders(
    30.               {
    31.                  importLoaders: 3,
    32.                  sourceMap: isEnvProduction
    33.                    ? shouldUseSourceMap
    34.                   : isEnvDevelopment,
    35.                  modules: {
    36.                    mode: 'local',
    37.                    getLocalIdent: getCSSModuleLocalIdent,
    38.                 },
    39.               },
    40.                'less-loader'
    41.             ),
    42.           },

  • 相关阅读:
    思维导图怎么变成ppt?4个思维导图一键生成ppt的方法
    2023.9.19 关于 数据链路层 和 DNS 协议 基本知识
    蓝桥杯备赛(三)
    element中的el-input只能输入数字,输入其他内容清空
    【知识】操作系统题目
    2022DAMA数据治理最佳培训机构奖
    Linux压缩与解压缩
    QQ怎么上传大于1G的视频啊?视频压缩这样做
    面试官:设计模式之简单工厂模式
    如何使用Linux DataEase数据可视化分析工具结合内网穿透实现远程办公
  • 原文地址:https://blog.csdn.net/m0_58719994/article/details/134316035