个人react笔记

DSP(数字信号处理器)技术概要 数字信号处理器(digital signal processor,DSP)是一种用于数字信号处理的可编程微处理器,它的诞生与快速发展,使各种数字信号处理算送得以实时实现,为数字信号处理的研究和应用打开了新局面,提供了低成本的实际工作环境和应用平台,推动了新的理论和应用领域的发展。目前,DSP技术在通信、航空、航天。雷达、工业控制、医疗、网络及家用电器等各个领域都得到了广泛应用。 1.1 DSP系统和芯片的结构特点1.1.1 DSP系统的基本结构通过传感数将非电物理量转换为模拟电信号,预处理一般包括放大器和滤 阅读详情

一、初始化项目(create-react-app)

create-react-app 项目名

二、配置别名(alias)

1、安装依赖

yarn add customize-cra react-app-rewired --save-dev

  

2、根目录创建config-overrides.js文件,注意名字不要写错,内容如下

const { override, addDecoratorsLegacy, addWebpackAlias } = require("customize-cra");
const path = require("path");
​
module.exports =  override(
  addDecoratorsLegacy(),
  addWebpackAlias({
    "@": path.resolve(__dirname, './src')
  })
);

  

3、修改package.json的scripts部分,如下

"scripts": {
    "start": "react-app-rewired start",
    "build": "react-app-rewired build",
    "test": "react-app-rewired test",
    "eject": "react-app-rewired eject"
  }

三、配置反向代理(http-proxy-middleware)

yarn add http-proxy-middleware
在src目录下创建 setupProxy.js  文件
// setupProxy.js 
const { createProxyMiddleware } = require('http-proxy-middleware')
​
module.exports = function (app) {
    app.use(createProxyMiddleware('/api', {
        target: 'http://152.136.185.210:4000',
        secure: false,
        changeOrigin: true,
        pathRewrite: {
            "^/api": ""
        }
    }))
}

四、引入样式( scss / less / style-component )

scss

npm install sass-loader node-sass --save-dev

npm install --save-dev sass-resources-loader
​
在用scss预处理器的时候,会常用变量/函数/混合等功能。目前如果想要使用变量/函数的话需要在每个文件中单独引入,这样明显不合理,我们需要的是引入一次,所以我们就需要定义全局主题的样式变量,也就是利用sass-resources-loader这个loader将scss变量打包到每个文件中。首先我们要安装sass-resources-loader。

//在项目根目录,也就是和package.json同级创建config-overrides.js文件,该文件配置代码如下:
​
const { override, adjustStyleLoaders } = require("customize-cra");
module.exports = override(
  // ...其他配置...
  adjustStyleLoaders(rule => {
    if (rule.test.toString().includes("scss")) {
      rule.use.push({
        loader: require.resolve("sass-resources-loader"),
        options: {
          resources: "./src/assets/scss/output.scss" //这里是你自己放公共scss变量的路径
        }
      });
    }
  })
);

styled-components

npm install styled-components
新建一个专门负责样式的 style.js 文件
​
import styled , { ThemeProvider } from 'styled-components'
 ThemeProvider 
 是最外层的样式组件
 <ThemeProvider theme={{themeColor : "red"}}>
    <Children/>
 <ThemeProvider/>
可以用来提供主题。在子组件中通过  ${props => props.theme.themeColor} 访问

五、引入请求模块(axios)

yarn add axios

六、引入路由模块(react-router-dom)

yarn add react-router-dom
import { Link , NavLink , withRouter , Route, Switch , BrowserRouter ,withRouter } from 'react-router-dom'
1.  <BrowserRouter>     history路由   
2.  <HashRouter>        hash路由
3.  <Route>         跳转路由 path="路径",component={组件}
4.  <Redirect>      重定向 to="路径"
5.  <Link>          跳转标签
6.  <NavLink>       高亮跳转标签 添加 active  类名  
7.  <Switch>        选中一个后停止匹配,用于优化
8.  withRouter函数   将非路由组件转换为路由组件,使其能够编程式跳转路由  withRouter(组件)
                   入口文件必须制定路由模式,并包裹组件或其祖宗组件才能使用
内置组件

1.编程式跳转

1.  history对象       函数式组件需在函数参数声明形参props后,通过props可以拿到这些对象参数
2.  match对象         获取query
3.  location对象      locations.pathname 可以拿到当前路径
其它对象
​
注:若不是路由组件,需使用withRouter()函数进行包装成路由组件
​
import React from 'react'
import { Switch, Route, Redirect,withRouter } from 'react-router-dom'
export default function Discover(props) {
    function changeRouter(path) {
        if (props.location.pathname !== path) {
            props.history.push(path)
        }
    }
    return <div>
            <button
                style={{
                    color: pathname === '/home/recommend' ? 'red' : null,
                }}
                onClick={(e) => changeRouter('/home/recommend')}
            >
                点击我跳转推荐页
            </button>
</div>
}
​

2.动态路由参数

params传的参数是暴露在url中的   // 且后代路由都会接收到该参数                                              // 主
需要 先声明 后注册传递参数
​
注册声明 <Route path=' /sort/:id '   component={Sort}></Route>
​
传递参数 this.props.history.push(  '/sort/'+'2'  )、
​
取值 props.match.params.id(函数式组件)
state传的参数是加密的    // 且后代路由不会接收到该参数,  重要的一点 :  刷新也可以保持住参数                 // 主
无需声明,直接注册使用即可
​
传递参数 props.history.push({ pathname: path, state: { name: '孙悟空' } })
​
取值 props.location.state.name(函数式组件)
search(query) 需要解析,所以略过  // 且后代路由都会接收到该参数
无需声明,直接注册使用即可
​
传递参数 props.history.push({ pathname, query: { name: ' sunny' } })
​
取值 this.props.location.query.name

七、路由集中管理(react-router-config)

yarn add react-router-config
import { renderRoutes } from 'react-router-config';
//renderRoutes 可以配置 路由管理映射
​
//子路由通过组件内的  const { route } = props 拿到当前路由对象, 然后通过api renderRoutes(route.routes)
​
import React from 'react';
import { Redirect } from "react-router-dom";
​
import Discover  from "../../src/components/centerMain/discover" 
import Recommend from "../components/centerMain/discover/recommend"
​
const routes = [
  {
    path: "/",
    exact: true,
    render: () => (
      <Redirect to="/discover"/>
    )
  },
  {
    path: "/discover",
    component: Discover,
    routes: [
      {
        path: "/discover",
        exact: true,
        render: () => (
          <Redirect to="/discover/recommend"/>
        ),
        
      },
      {
        path: "/discover/recommend",
        component: Recommend
      }]
    }   
]
​
export default routes;
​

在根组件中使用

import React, { memo , Suspense } from 'react'
import { renderRoutes } from 'react-router-config';
import { Provider } from "react-redux"
​
import TopBar from "./components/topBar/index.js"
import Player from "./components/player/index.js"
import HYAppFooter from '../src/components/bottomBar';
​
import routes from './router';
import store from '../src/store'
​
import './assets/css/base.css'
import 'antd/dist/antd.css'; // or 'antd/dist/antd.less'
​
​
import { HashRouter } from 'react-router-dom';
​
export default memo(function App() {
    return (
        <Provider store={store}>
        <HashRouter>
            <TopBar></TopBar>
            <Suspense fallback={<div>page loading</div>}>
                {renderRoutes(routes)}
            </Suspense>
            <HYAppFooter/>
            <Player/>
        </HashRouter>
        </Provider>
    )
})
​

八、引入全局状态管理工具(redux)

yarn add redux react-redux redux-thunk 
// redux        全局状态管理工具
// react-redux  将react和redux连接起来
// redux-thunk  用于异步操作

九、引入antd组件库

1.安装依赖

npm install antd --save
yarn add antd

2.引入样式

import 'antd/dist/antd.css';   // or 'antd/dist/antd.less'

3.在需要使用的页面中引入antd组件

import { DatePicker } from 'antd';

Form

const [form] = Form.useForm() //可以拿到表单实例
​
form.setFieldsValue({ name: 'Hi there!' })// 可以设置表单对应字段的值 可以输入多个字段
​
form.resetFields() //重置表单

安装脚手架(react-cli)

cmd : 
1.更换npm源
npm config set registry https://registry.npm.taobao.org
​
2.检查是否更换成功
npm config get registry
//如果显示 https://registry.npm.taobao.org 该地址就表示配置成功了
​
3.全局安装 react 脚手架
cnpm install -g create-react-app
​
4.创建react脚手架项目
create-react-app + 项目文件夹名称
​
5.启动项目
npm start
​
6.打包项目
npm build

引入eslint

一、

安装vscode插件

EditorConfig for VS Code

根目录添加文件

// .editorconfig
# http://editorconfig.org
​
root = true
​
[*] # 表示所有文件适用
charset = utf-8 # 设置文件字符集为 utf-8
indent_style = space # 缩进风格(tab | space)
indent_size = 2 # 缩进大小
end_of_line = lf # 控制换行类型(lf | cr | crlf)
trim_trailing_whitespace = true # 去除行首的任意空白字符
insert_final_newline = true # 始终在文件末尾插入一个新行
​
[*.md] # 表示仅 md 文件适用以下规则
max_line_length = off
trim_trailing_whitespace = false

二、

VSCode需要安装Prettier - Code formatter的插件

npm install prettier -D

配置.prettierrc文件:

{
  "useTabs": false, //使用tab缩进还是空格缩进,选择false;
  "tabWidth": 2,   // tab是空格的情况下,是几个空格,选择2个;
  "printWidth": 80,  //当行字符的长度,推荐80,也有人喜欢100或者120;
  "singleQuote": true,  //使用单引号还是双引号,选择true,使用单引号;
  "trailingComma": "none",  //在多行输入的尾逗号是否添加,设置为 `none`;
  "semi": false   //语句末尾是否要加分号,默认值true,选择false表示不加;
}

配置.prettierignore忽略文件

/dist/*
.local
.output.js
/node_modules/**
​
**/*.svg
**/*.sh
​
/public/*

在package.json中配置一个scripts:

 "prettier": "prettier --write ."

三、ESLint

VSCode需要安装ESLint插件

npm i eslint-plugin-prettier eslint-config-prettier -D

在package.json中配置extend:

 extends: [
    "eslint:recommended",
    "plugin:prettier/recommended"
  ],

dva.js

安装脚手架

npm install dva-cli -g

创建项目

dva new dva-quickstart

全局状态管理dva

import {routerRedux} from 'dva/router'
// routerRedux 可以实现在状态管理下进行路由跳转
​
// 类似vuex模式
export default {
​
//命名空间
  namespace: 'example',
    
   // 状态
  state: {},
    
   // 初始化会执行
  subscriptions: {
    setup({ dispatch, history }) {  // eslint-disable-line
    },
  },
    
  //  相当于 vuex中action
    // payload 执行dispatch时传过来的参数
    // call是执行函数的方法
    // put 相当于 dispatch
  effects: {
    *fetch({ payload }, { call, put }) {  // eslint-disable-line
      yield put({ type: 'save' });
    },
  },
 
    
    //  相当于 vuex中mutation
  reducers: {
    save(state, action) {
      return { ...state, ...action.payload };
    },
  },
​
};
​

新的状态子模块需要在index.js入口文件中引入

app.model(require('./models/example').default);
​

umi.js

yarn create @umijs/umi-app

dva状态管理

根模块
1.在src目录下新建 models 文件夹,新建一个js文件。文件名就是根模块状态名
​
子模块
1.在src/pages/Home目录下新建 models 文件夹,新建一个js文件。文件名就是分模块状态名

模块文件js,书写如下

export default {
  state: {
    name: '王洪元',
  },
    
  effects: {
    *getUserInfoAction({ payload }: any, { call, put }: any) {
      yield put({ type: 'changeUserInfo', payload });
      console.log(payload);
    },
  },
​
  reducers: {
    changeUserInfo(state: any, action: any) {
      return {
        ...state,
        name: action.payload,
      };
    },
  },
};
​

组件中使用

import React from 'react';
import { connect } from 'dva';
const Home = ({ dispatch, rootUserName, homeUserName }: any) => {
  const handleChangeUserInfo = () => {
    dispatch({ type: 'global/getUserInfoAction', payload: '上古鬼' });
  };
  const handleChangeHomeUserInfo = () => {
    dispatch({ type: 'home/getUserInfoAction', payload: 'masjdge' });
  };
​
  return (
    <div>
      <div>
        <span>根姓名:{rootUserName}</span>
      </div>
      <div>
        <span>home姓名:{homeUserName}</span>
      </div>
​
      <div>
        <button onClick={handleChangeUserInfo}>根模块点击更改名字</button>
        <button onClick={handleChangeHomeUserInfo}>子模块点击更改名字</button>
      </div>
    </div>
  );
};
​
const mapStateToProps = (state: any) => {
  return {
    rootUserName: state.global.name,
    homeUserName: state.home.name,
  };
};
​
export default connect(mapStateToProps)(Home);
​

运行时配置

 //执行顺序      
 render  >  patchRoutes
​
// 往路由表中向前增加一条路由映射
export function patchRoutes({ routes }: any) {
  console.log(routes);
​
  routes[0].routes.unshift({
    path: '/foo',
    exact: true,
    title: '蕉叶',
    component: require('@/pages/Home/index').default,
  });
  routes[0].routes.unshift({
    path: '/',
    exact: true,
    redirect: '/home',
  });
}
​
// 比如用于渲染之前做权限校验,
// 覆写 render。
export function render(oldRender: any) {
  // console.log('中间件。路由在刷新前可以做一些事哦');
  console.log(123);
​
  oldRender();
}
​
// 在初始加载和路由切换时做一些事情。
export function onRouteChange({ location, routes, action, matchedRoutes }) {
  // 动态修改网页标题
  if (matchedRoutes.length) {
    document.title = matchedRoutes[matchedRoutes.length - 1].route.title || '';
  }
}
​
// 修改交给 react-dom 渲染时的根组件。
// 给根标签包裹一层组件
// export function rootContainer(container) {
//   return React.createElement(ThemeProvider, null, container);
// }

页面跳转

声明式

import { Link } from 'umi';
​
export default () => (
  <Link to="/list">Go to list page</Link>
);

命令式

import { history } from 'umi';
​
function goToListPage() {
  history.push('/list');
}

属性获取

export default (props) => (
  <Button onClick={()=>props.history.push('/list');}>Go to list page</Button>
);

引入图片

JS 里使用图片

通过 require 引用相对路径的图片。

比如:

export default () => <img src={require('./foo.png')} />

支持别名,比如通过 @ 指向 src 目录:

export default () => <img src={require('@/foo.png')} />

JS 里使用svg

组件式引入

import { ReactComponent as Logo } from './logo.svg'
function Analysis() {  return <Logo width={90} height={120} />}

url式引入

import logoSrc from './logo.svg'
function Analysis() {  return <img src={logoSrc} alt="logo" />}

CSS 里使用图片

通过相对路径引用。

比如,

.logo {
  background: url(./foo.png);
}

CSS 里也支持别名,但需要在前面加 ~ 前缀,

.logo {
  background: url(~@/foo.png);
}

注意:

  1. 这是 webpack 的规则,如果切到其他打包工具,可能会有变化

  2. less 中同样适用

图片路径问题

项目中使用图片有两种方式,

  1. 先把图片传到 cdn,然后在 JS 和 CSS 中使用图片的绝对路径

  2. 把图片放在项目里,然后在 JS 和 CSS 中通过相对路径的方式使用

前者不会有任何问题;后者,如果在 JS 中引用相对路径的图片时,在发布时会根据 publicPath 引入绝对路径,所以就算没有开启 dynamicImport 时,也需要注意 publicPath 的正确性。

Base64 编译

通过相对路径引入图片的时候,如果图片小于 10K,会被编译为 Base64,否则会被构建为独立的图片文件。

10K 这个阈值可以通过 inlineLimit 配置修改。

用KalmanNet搞定非线性状态估计:当卡尔曼滤波遇上神经网络 本文深入探讨了KalmanNet如何将神经网络与卡尔曼滤波结合,以解决非线性状态估计中的模型失配和噪声不确定性问题。通过保留经典滤波框架并用RNN学习卡尔曼增益,该方法在无人机导航、机器人定位等场景中实现了模型驱动与数据驱动的优势互补,提升了估计的鲁棒性和灵活性。 阅读详情

相关推荐

用Multisim仿真石英晶体振荡电路:从等效模型到频响曲线实战

本文通过Multisim软件,从构建石英晶体等效电路模型入手,详细演示了如何仿真分析其电抗频率特性曲线,并实战搭建与调试皮尔斯振荡电路。文章深入探讨了振荡必须工作在串联与并联谐振点之间感性区的原因,为电子设计者提供了从理论到仿真的完整可视化学习路径。

ik67890123的博客 502

主题提供器(theme_provider)使用教程

主题提供器(theme_provider)使用教程 项目介绍 theme_provider 是一个用于 Flutter 应用的包,它允许开发者轻松地在应用中提供和管理主题。这个包支持多种平台,包括 Android、iOS、Linux、macOS、web 和 Windows。通过 theme_provider,开发者可以方便地在整个应用中切换和管理主题,提供了简单易用的 API 和丰富的自定义选项。...

gitblog_01024的博客 1255

Rapid SCADA MQTT

一、配置RapidSCADA 1、准备KpMqtt.dll、Jint.dll库文件,从网盘下载。 2、将以上两个文件拷贝到SCADA安装目录的Comm/KP目录下,如下: C:\SCADA\ScadaComm\KP 3、新建SCADA项目 4、新建Line 5、新建Device 6、拷贝Config目录下的KpMqtt_001.xml文件、KpMqtt_Job.js文件到项目Comm\Config下,如下示例链接 C:\SCADA\Projects\MQTTProject\Instances\Defau

mumanquan1的博客 3007

React Native Elements 主题定制指南:ThemeProvider 深度解析

React Native Elements 主题定制指南:ThemeProvider 深度解析 【免费下载链接】react-native-elements Cross-Platform React Native UI Toolkit ...

gitblog_01174的博客 418

小红书图文AI创作:输入主题,一键生成图文(coze工作流教程+获取)

输入主题,工作流一键生成小红书风格图文,30s一条,可批量生成

2301_79384090的博客 2799

ESP32设备驱动-TB6612FNG直流电机驱动

TB6612FNG 是一款出色的双电机驱动器,非常适合将两个小型直流电机(例如微型金属齿轮电机)连接到微控制器,它还可以用于控制单个双极步进电机。 基于 MOSFET 的 H 桥比 L298N 和 Sanyo 的 LB1836M 等旧式驱动器中使用的基于 BJT 的 H 桥效率高得多,后者允许将更多电流输送到电机,而从逻辑电源汲取的电流更少 (对于真正低电压的应用,LB1836 仍然具有 TB6612 的优势)。

视觉与物联智能 3403

React中Context的使用

Context 提供了一种在组件之间共享值的方式,而不必显式地通过组件树的逐层传递 props。如果获取值和使用值的层级相隔很远,或者需要使用这个值的组件很多很分散,则可以使用Context来共享数据,避免使用大量重复的props来传递值。

柯南的博客 6173

时序预测 | MATLAB实现NGM(1,1)多变量灰色时间序列预测

时序预测 | MATLAB实现NGM(1,1)多变量灰色时间序列预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1514

基于provider实现主题状态管理

基于provider实现主题状态管理

weixin_43800535的博客 244

MediaPipe 教程:从安装到应用-全网最全

MediaPipe是Google推出的开源框架,专为构建机器学习管道设计,可以高效处理视频、音频等时间序列数据。本文教程从安装到应用逐步讲解: 安装步骤简单,只需通过pip安装mediapipe包并验证版本; 重点演示人体姿态检测功能,可识别33个身体关键点; 提供基础代码实现,包括视频捕获、关键点检测与可视化; 强调模块化开发,将功能封装成类以提高代码复用性。 教程适合初学者,通过清晰指引和实用代码示例,帮助快速实现计算机视觉应用。

FJN110的博客 1563

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

React Theme Provider 使用指南

React Theme Provider 使用指南 项目概述 React Theme Provider 是一个由 CallStack 开发的工具集,旨在帮助开发者轻松地创建自定义的 React 主题系统。它支持 React 和 React Native 环境,提供了一套简单步骤来定制颜色、字体等主题元素。 目录结构及介绍 以下是一般化的 React Theme Provider 项目可能拥有的基础...

gitblog_00925的博客 613

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

React 个人笔记 Hooks编程

React Hooks 是函数式编程中的重要工具,用于在不使用类的情况下管理组件状态和副作用。常用的 Hooks 包括 useState、useContext、useReducer、useEffect、useMemo 和 useCallback。前三个 Hooks 用于声明和管理状态,后三个则用于处理依赖项变化时的逻辑。useState 适用于简单状态管理,useReducer 适合处理复杂状态逻辑,useContext 用于跨层级组件数据共享,避免“prop drilling”。useEffect 用于执

JamSlade的博客 638

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

React 个人笔记

环境 node.js v10+ windows 64bit 学习 Webpack: node.js环境的打包工具 学习目标 1.构建打包环境 2.构建开发环境 3.四个核心概念: 入口:指定webpack打包或本地服务运行时的程序入口文件 出口:打包之后,打包的结果放在 某个文件夹 dist loaders:用于对代码中各种文件进行编译转换,目标是转换成浏览器能够识别的代码 plugins:用于扩展功能 webpack 起步 新建react-stack 初始化环境 : npm init -

qq_44973025的博客 412

React个人笔记

这是关于我学习react常用的一些笔记

weixin_50877746的博客 151

React 初学 - 静态组件 - 个人笔记56

需求:

树上骑个猴的博客 236

个人 尚硅谷React全家桶学习笔记(1)

个人 尚硅谷React全家桶学习笔记 (一) B站传送门 1.React简介 React是什么 ​ React是一个将数据渲染为HTML视图的开源JavaScript库。用于构建用户界面的JS库。 React由谁开发的 由Facebook开发,且开源。 1.起初由Facebook的软件工程师Jordan Walke创建。 2.于2011年部署于Facebook的newfeed。 3.随后在2012年部署于Instagram 4.2013年5月宣布开源。 … 为什么要学 原生JS的疼点 1.操作DOM繁

qq_54022138的博客 513

react 获取url参数_react源码个人笔记-版本17.0.0(笔记08)

// getRootHostContainer(1)// url: src/react/packages/react-reconciler/src/ReactFiberHostContext.old.js function getRootHostContainer(): Container { // 获取实例 const rootInstance = requiredContext(root...

weixin_39575758的博客 626

个人学习笔记 ReactJS part1

React的背景: 在前端开发的过程中,我们通常会进行频繁或者复杂的DOM操作,这些操作往往是引起性能瓶颈的原因,因此如何去优化页面的性能是前端开发的技术指标之一,而React恰好可以满足我们的需要; React的原理: React引入了虚拟DOM的机制,即在浏览器端用JS实现了一套DOM API,当我们用React进行开发的时候所有的DOM构造都是通过虚拟DOM进行构造。只要数据发

排骨汤 345

react-个人笔记

1. React 基础语法 2.组件(Class) 3.数据效验 4.Hooks(Func) 5.生命周期 6.路由 7.错误边界 8.redux 9.路径请求 10.其他

qq_42753091的博客 318

React 个人学习笔记

创建项目: 1、如果没有react脚手架,先安装一个 npm install -g create-react-app 2、创建 create-react-app my_project 3、启动 npm start

Bowen的博客 1145

React个人学习笔记

元素渲染 通过ReactDOM.render()方法渲染页面,可以使用ES6 class来定义一个组件: 如何解析HTMl里面的空格: 1. 使用空格的unicod 编码 :\u0020 2. 使用 dangerouslySetInnerHTML, 不建议使用,容易受到XSS攻击 class Welcome extends React.Component { r...

weixin_34381687的博客 84

React学习笔记(仅仅个人看)

React学习笔记 JSX能够简单理解为标签和js的结合 例如: const element=<h1>hello,world</h1> 具体的例子如下: import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; function formatName(user){ return user.firstName+''+user.lastName } const user={

weixin_43591127的博客 308

React.js个人学习笔记

react.js学习笔记

qq_54074936的博客 414

react-redux的個人使用筆記

react-redux

Felix_SIU的博客 216

个人React / Koa 项目上线——健身笔记

FitNote 健身笔记 FitNote的诞生是为了更好地记录在力量训练中负重的变化情况,也可以说是力量训练笔记本。 体验地址:fitnote.inhere.top 体验账号:abc / 123456 暂时暂未开放注册,有需要可以留言给你开通账号。 开发详情 前端 项目地址 前端基于React.js 16.0 +并采用material-ui前端UI框架。 目前项目不复杂,并未使用Redux等状态管...

weixin_33904756的博客 290
下一篇: react路由
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值