一、react18+项目初始化(vite)

react19 使用 antd 兼容问题

npm install @ant-design/v5-patch-for-react-19 --save

// 入口处引用

import '@ant-design/v5-patch-for-react-19'

  1. npm create vite@latest 项目名称

    根据需要选择用vue还是react, 是否使用typescript等等

    1. 配置antd design
    javascript 复制代码
    // 安装
    npm install --save antd-mobile
    // 在文件中直接引入使用
    import { Button } from 'antd-mobile'
    <Button></Button>
  2. 更改webpack配置

csharp 复制代码
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path'; // 导入path模块

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  css: {
    postcss: {
      plugins: [require('postcss-px-to-viewport')], // 使用外部的 postcss.config.js 配置文件
    }
  },
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src'), // 将@指向src目录
      // 可以继续添加其他别名
      // 例如:'@components': path.resolve(__dirname, './src/components')
    }
  },
  // server:{
  //   port: "8080",
  //   host: "",
  // }
});
javascript 复制代码
// 4.配置postcss.config.js
const pxToViewport = require('postcss-px-to-viewport-8-plugin');

module.exports = {
  plugins: [
    pxToViewport({
      unitToConvert: 'px',
      viewportWidth: 375,
      unitPrecision: 5,
      propList: ['*'],
      viewportUnit: 'vw',
      fontViewportUnit: 'vw',
      selectorBlackList: [],
      minPixelValue: 1,
      mediaQuery: false,
      replace: true,
      exclude: [/node_modules/, /antd-mobile/],
      include: /\.(css|scss)$/
    })
  ]
};
  1. 配置路由(react-router-dom)
javascript 复制代码
// 安装路由
npm install react-router-dom
javascript 复制代码
// 页面内直接配置
import React, { Suspense } from "react";
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";

const Home = React.lazy(() => import("@/pages/home"))
const Login = React.lazy(() => import("@/pages/login"))

export default function App() {
  return (
    <BrowserRouter>
      <Link to="/login">login</Link>
      <Link to="/home">home</Link>
      <Suspense fallback={ (<div>loading...</div>) }>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="login" element={<Login />} />
          <Route path="home" element={<Home />} />
        </Routes>
      </Suspense>
    </BrowserRouter>
  );
}

提取路由

javascript 复制代码
// 新建router/index.js,引入组件进行路由配置,导出router实例

const Home = React.lazy(() => import("@/pages/home"))
const Login = React.lazy(() => import("@/pages/login"))

import { createBrowerRouter } from "react-router-dom"
const router = createBrowerRouter([{
	path: '/home',
	element: <Home />
}, {
	path: '/login',
	element: <Login />
}])

export default router

// 在入口文件中渲染<RouterProvider />, 传入router实例
import { createRoot } from 'react-dom/client'
import { RouterProvider } from 'react-router-dom'
import router from './router'

createRoot(document.getElementById('root')!).render(
  <RouterProvider router={router} />,
)
  1. 配置redux 参考文档
javascript 复制代码
// 1. 安装
npm install @reduxjs/toolkit react-redux
// 2. 创建store文件夹,内有index.js和modules文件夹
// 3. store -> index.js
import { configureStore } from '@reduxjs/toolkit'
import counterReducer from './modules/counterReducer'
export default configureStore({
  reducer: {
	counter:counterReducer 
  }
})
// 4. 配置modules/counterReducer文件
import {createSlice} from '@reduxjs/toolkit'
export const counterStore = createSlice({
    name: 'counter',
    initialState: {
        count: 1
    },
    reducers: {
        updateData: (state, action) => {
            console.log('state:action', state, action);
            state.count = action.payload
        }
    }
})

// 异步请求部分
const fetchData = () => {
	return async (dispatch) => {
		const res = await 请求方法(请求地址)
		dispatch(updateData(res.data))
	}
}

const { updateData } = counterStore.actions; 
const counterReducer = counterStore.reducer;

export { updateData, fetchData  }
export default counterReducer;
// 5. 配置入口文件
import store from './store'
root.render(
	<Provider store={store}>
		<App />
    </Provider>
)
// 5. 组件中使用
import { useSelector, useDispatch } from "react-redux";
import { updateData, fetchData } from "@/store/modules/counterReducer"
// useSelector 从Store中读取State
const {count} = useSelector((state) => state.counter);
// useDispatch 用来Dispatch Action
const dispatch = useDispatch()
dispatch({ type: 'counter/updateData', payload: 8})
或
dispatch(updateData(8))
// 使用useEffect触发异步请求执行
useEffect(() => {
	dispatch(fetchData())
}, [dispatch])
// 6. 调试工具 Redux-Devtools
相关推荐
米码收割机几秒前
【Python】Flask+SQLite_web 宠物领养系统 (源码+文档)【独一无二】
前端·python·flask
寒水馨15 分钟前
macOS下载、安装 Tailwind CSS-v4.3.3(附安装包tailwindcss-macos-arm64)
前端·css·macos·tailwind css·utility-first·css 框架·实用优先
shawxlee30 分钟前
vue3+axios挑战最简洁实用的配置封装+接口调用:请求拦截器、响应拦截器、通用请求方法(单个请求/并发请求/下载文件)、统一接口管理
前端·经验分享·vue·接口·axios·api
yuhaiqiang1 小时前
上线一个人静态网站需要多少钱,难不难?
前端·后端·程序员
宸津-代码粉碎机1 小时前
Jar热部署进阶实战|修复原生方案OOM与类冲突问题,生产级无BUG优化方案
java·大数据·服务器·开发语言·前端·人工智能·python
To_OC9 小时前
写了三遍 Todo List,我终于搞懂了 React 父子组件到底怎么通信
前端·javascript·react.js
勇往直前plus10 小时前
Vue3(篇一) 核心概念——响应式模板语法与组件基础
前端·javascript·vue.js
咩咩啃树皮10 小时前
第43篇:Vue3计算属性(computed)完全精讲——缓存机制、依赖计算、业务最优解
前端·vue.js·缓存
徐小夕12 小时前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
kyriewen13 小时前
别再乱用useEffect了——你写的10个里有8个不该存在
前端·javascript·react.js