React-从0到1搭建一个React项目(二)

REACT实战项目从0到1搭建(仅供参考) 按照。 阅读详情

本篇是《从0到1搭建react项目》的第二篇,主要介绍react路由配置、数据层和容器层实现。
相关文章:React-从0到1搭建一个React项目(一)

react路由

react-router基本已成为react路由的标准解决方案。我使用的是react-router-dom。
react-router包含了所有react-router-dom和react-router-native的公共组件,实现了路由的核心功能。通常情况下,如果是开发web应用,使用react-router-dom就能满足需求。如果是用react-native开发,就用react-router-native。
具体的一些介绍,可以参考:

  1. https://github.com/ReactTraining/react-router/issues/4648
  2. https://stackoverflow.com/questions/42684809/react-router-vs-react-router-dom-when-to-use-one-or-the-other

路由配置

路由的使用可以参考官方文档。也可以按下面的步骤来:

  1. 在项目src目录下新建一个routes.js文件,用来管理所有的路由。这里import了App组件,如果后续还有别的组件,import进来,增加一条Route即可
import React from 'react'
import { BrowserRouter as Router, Route } from "react-router-dom";
import App from './App'

const AppRouter = () => (
  <Router >
    <div>
      <Route path={ "/" } exact={ true } component={ App } />
    </div>
  </Router>
);

export default AppRouter;
  1. 在index.js文件中引入AppRouter
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import * as serviceWorker from './serviceWorker';
import AppRouter from './routes'

ReactDOM.render(<AppRouter />, document.getElementById('root'));

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

到这里,实现了一个简单的路由功能。接下来实现数据层。

数据层

React Redux可以让react组件从redux store中读取数据,并且通过dispatch action更新store中的数据。详细使用可查看官方文档。
我们的数据层就是使用react-redux来管理整个应用的状态。
React Redux提供了<Provider/>组件,可以让web应用的所有组件都能操作redux store。<Provider/>组件接收一个store作为参数,而创建store前,需要先定义好action和reduce。下面先来看下action的定义。

定义action

  1. 在/src/actions/目录下新建actions.js文件,如果项目的action比较多,可以拆分成多个action.js文件。
  2. 定义action名称和方法。假设要实现的action是一个保存用户信息的操作。可以定义如下:
export const SAVE_USER_INFO = "SAVE_USER_INFO"
export const saveUserInfo = (userInfo) => ({
	type: SAVE_USER_INFO,
	userInfo
})

这里定义了一个type常量SAVE_USER_INFO,用来标识action的类型;定义了一个方法saveUserInfo,接收userInfo参数,用来更新store中的用户信息。
定义好action之后,就可以实现reduce了。

实现reduce

  1. 在/src/reduce目录下新建两个文件index.js和home-reduce.js,其中index.js里通过redux的combineReducers把各个业务模块的reduce组合成一个reduce,home-reduce.js里面是业务模块的reduce,这里就是实现一个保存用户信息的操作。代码如下:
//index.js
import { combineReducers } from 'redux'
import home from './home-reduce'

export default combineReducers({
  home
})
//home-reduce.js
import { SAVE_USER_INFO } from '../actions/actions'

const initialState = {
  userInfo: null

}

const home = (state = initialState, action) => {
  switch (action.type) {
  case SAVE_USER_INFO:
    return Object.assign({}, state, {
      userInfo: action.userInfo
    })
  default:
    return state
  }
}

export default home

创建store

查看官方步骤

  1. 在/src/configureStore目录下,新建configureStore.js文件,内容:
import { applyMiddleware, createStore } from 'redux'
import thunkMiddleware from 'redux-thunk'
import { createLogger } from 'redux-logger'
import { composeWithDevTools } from 'redux-devtools-extension'
import rootReducer from '../reducers'

export default function configureStore(preloadedState) {
  const middlewares = [thunkMiddleware]
  if (process.env.NODE_ENV !== 'production') {
      middlewares.push(createLogger())
  }

  const middlewareEnhancer = applyMiddleware(...middlewares)

  const enhancers = [middlewareEnhancer]
  const composedEnhancers = composeWithDevTools(...enhancers)

  const store = createStore(rootReducer, preloadedState, composedEnhancers)

  //reducer hot loading 
  if (process.env.NODE_ENV !== 'production' && module.hot) {
    module.hot.accept('../reducers', () => store.replaceReducer(rootReducer))
  }

  return store
}

这里面核心的代码就是const store = createStore(rootReducer, preloadedState, composedEnhancers)。createStore传递了三个参数,第一个参数是reduce,提供了更新state的实现。preloadedState是预加载的state,服务端渲染时会用到。composedEnhancers中集成了多个Middleware,你可以利用 Redux middleware 来进行日志记录、创建崩溃报告、调用异步接口或者路由等等。

使用 Provider

在根组件上使用<Provider/>,修改src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import AppRouter from './routes';
import configureStore from '../../configureStore/configureStore';
import './index.css';

const store = configureStore()

ReactDOM.render(
  <Provider store={store}>
  	<AppRouter/>
  </Provider>,
  document.getElementById('root'))

到这里数据层就算完成了,接下来看下怎么在容器层调用保存用户信息的方法以及如何使用store里面的数据。

容器层

实现一个组件

在/src/container目录下新建一个容器组件home.js。代码为:

import React from 'react'
import styled from 'styled-components'
import PropTypes from 'prop-types'
import { saveUserInfo } from '../actions/actions'
import { connect } from 'react-redux'
import Input from '@material-ui/core/Input';

const Container = styled.div`
  display: flex;
  height:100%;
  width:100%;
  flex-direction:column;
  align-items:center;
  background-color:#F0F0F0;
`
const NameFromStore = styled.div`
	font-size:large;
`

class Home extends React.Component {
	constructor(props) {
		super(props)
		this.handleChange = this.handleChange.bind(this)
	}

	handleChange(event) {
		var userInfo = {
			name: event.target.value
		}
		this.props.saveUserInfo(userInfo)
	}

	render() {
		return (
			<Container>
			<Input placeholder="姓名" onChange={ this.handleChange } />
			<NameFromStore>
				{this.props.userInfo && this.props.userInfo.name}
			</NameFromStore>
			</Container>
		);
	}

}

const mapStateToProps = state => ({
  userInfo: state.home.userInfo
})

const mapDispatchToProps = dispatch => {
  return {
    saveUserInfo: (userInfo) => (
    dispatch(saveUserInfo(userInfo))
    )
  }
}

Home.propTypes = {
  saveUserInfo: PropTypes.func,
}

export default connect(mapStateToProps, mapDispatchToProps)(Home)

home.js组件实现的功能:定义了一个input输入框,将输入的信息保存到store中,再从store中取出保存的信息展示出来。

组件CSS

home.js中使用了styled-components,它可以让我们在组件的js文件中直接编写css代码。传统的在css文件中编写样式的方法存在诸多弊病,比如定义的class-name是全局的,很容易导致样式覆盖。styled-components是一个现代的解决方案,同时还提供了主题设置,方便应用样式的统一。感兴趣的可以查看官网。

如何调用reduce中的方法和使用store中的数据

正如第一篇文章的架构图中画的一样,容器层的组件和数据层reduce的交互是通过定义的action作为桥梁的。在容器层的home.js中,把actions.js中定义的更新store的方法import进来,然后定义了一个mapStateToProps方法和mapDispatchToProps,分别定义了store中的state到组件的props映射和dispatch方法到组件props方法的映射,再通过connect将两种映射和组件关联起来。

import { saveUserInfo } from '../actions/actions'
...

//将store中的state数据映射到组件的props属性
const mapStateToProps = state => ({
  userInfo: state.home.userInfo
})

//将组件的saveUserInfo属性映射到dispatch()方法,从而通过action调用到reduce中定义的方法更新store
const mapDispatchToProps = dispatch => {
  return {
    saveUserInfo: (userInfo) => (
    dispatch(saveUserInfo(userInfo))
    )
  }
}

Home.propTypes = {
  saveUserInfo: PropTypes.func//定义Home的props属性
}
export default connect(mapStateToProps, mapDispatchToProps)(Home)

我们修改routes.js的代码,将Home组件作为第一个渲染的组件,看下效果


import React from 'react'
import { BrowserRouter as Router, Route } from "react-router-dom";
import Home from './container/home'

const AppRouter = () => (
  <Router >
    <div>
      <Route path={ "/" } exact={ true } component={ Home } />
    </div>
  </Router>
);

export default AppRouter;

效果图:
在这里插入图片描述
到这里,我们项目的架子基本上搭建完成了,剩下的只要根据自己的业务划分不同的模块,分别放入相应的数据层、容器层和组件层。
接下来的文章会分享一下react项目中如何解决自定义环境变量、开发测试生产打包以及多页面(html)的问题。

Demo

附上Demo的github地址:https://github.com/miguoer/react-sample

React实战项目从0到1 ps:Last but not least,放几个下载地址,至于安装和使用的详细教程,就劳请各位出门右转,伸出智慧的右手搜一下吧,一定会有详细教程的,啦啦啦。README.md:项目的介绍文件,运用markdown标记语言编写,在github等开源代码网站上,项目常用.md文件来进行介绍。关于React创建项目的宝宝级教程就介绍到这了,React框架的深入学习,还需要我们继续探索,一起加油吧~logo.svg:react的一个标志文件,sug文件是纯粹的XML,保证了在放大缩小时图像不失真。 阅读详情

相关推荐

create-react-app 快速搭建一个react项目(完整结构)

说明 这是facebook团队的一个小项目,可以快速搭建一个react的项目结构,容易上手,非常适合像我这样的初学者。 步骤 node.js环境: 首先你得安装这个,因为后续的npm命令是基于这个的,不赘述。 直接安装: 运行npm install -g create-react-app; 为什么要-g这个我说一下我的情况,因为我在创建my-app的时候,一开始没有全局安装,导致np...

u012805132的博客 5429

React-Router路由基础篇(简单易学)

React Router的正确使用包括路由配置,路由导航等

weixin_58149434的博客 5796

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

yang1067155909的专栏 4291

react-router详解

react-router详解react-router详解路由的基本使用安装react-router使用react-router头部一般组件主体内容路由组件路由组件与一般组件NavLink与封装NavLinkSwitch的使用解决多级路径刷新页面样式丢失的问题路由的严格匹配与模糊匹配Redirect的使用嵌套路由向路由组件传递参数编程式路由导航BrowserRouter与HashRouter的区别 react-router详解 React Router 是一个基于 React 之上的强大路由库,它可以让你向应

输入技术、输出想法 3万+

从拆箱到跑通:Intel RealSense D435i开箱实测+ROS驱动配置全流程

本文详细记录了Intel RealSense D435i深度相机的开箱体验,并提供了在Ubuntu 22.04与ROS2 Humble环境下,从安装librealsense2 SDK到配置ROS2驱动的完整流程。重点解决了驱动安装、数据流发布、点云对齐以及IMU数据融合等关键步骤,帮助研究者和开发者快速实现D435i与机器人系统的集成。

weixin_29168393的博客 306

2024年最全scrapy+scrapyd+gerapy 爬虫调度框架,字节跳动面试时间

scrapyd是一个用于部署和运行scrapy爬虫的程序,它允许你通过JSON API来部署爬虫项目和控制爬虫运行,scrapyd是一个守护进程,监听爬虫的运行和请求,然后启动进程来执行它们方便地控制爬虫运行直观地查看爬虫状态实时地查看爬取结果简单地实现项目部署统一地实现主机管理轻松地编写爬虫代码。

2401_84140653的博客 1202

React-Router详解

React-Router是一款用于构建单页面应用(SPA)中处理路由的JavaScript库。在现代的Web应用中,SPA已经成为了一种常见的应用架构模式,它允许在不刷新整个页面的情况下进行交互式的用户体验。而React-Router作为React生态系统中的路由管理工具,为开发者提供了一种简洁、灵活且强大的方式来处理应用中的页面导航和状态管理。React-Router在React应用中的重要性不可忽视。它不仅仅是简单的URL路由管理工具,更是一个可以帮助开发者构建复杂SPA的工具集。

虎哥LoveDroid 1万+

读书笔记:深度学习入门-基于python的理论与实现(俗称鱼书)

终于从头到尾把鱼书看完啦,真的是非常入门,非常查漏补缺,对新手很友好,对有一定基础的人也非常不错。看完不复习等于没看,所以今天开始复盘,顺便写这篇读书笔记。希望分享给没看过这本书或者看过这本书的同僚们参考,欢迎大家指教。我将从第三章神经网络开始复习,前两章内容书里已经非常基础and清楚了。(会持续更新滴).........

博客而已 1万+

React 之 Router - 路由详解

1. 安装react-router。3. 跳转Link && 占位组件。四、Not Found页面配置。hook只能在函数式组件中使用。配置放到一个地方进行集中管理。1. 创建router文件夹。2. 在App.jsx中使用。1. index.js中配置。一、Router的基本使用。一、Router的基本使用。2. search传递参数。三、Navigate导航。路由高阶组件再进一步封装。2. router中配置。路由高阶组件进一步封装。1. 动态路由的方式。

玄鱼殇 8555

告别手动烧录!给STM32H750外挂Flash制作Keil专用下载算法(保姆级避坑指南)

本文详细介绍了为STM32H750外挂Flash开发Keil专用下载算法的全过程,从原理到实战操作,特别针对QSPI Flash的配置和优化提供了保姆级避坑指南。通过定制下载算法,开发者可以告别手动烧录,实现一键下载到外部Flash,大幅提升开发效率。

weixin_42567497的博客 251

小工匠聊架构-分布式场景下的并发幂等性常见的解决方案

Pre 我们来回顾下单体时代 单体时代,应用部署在一台主机上,可以使用JVM级别的锁来控制并发请求 。 随着应用规模的不断扩大,集群化或者微服务化的分布式部署越来越普及,每个应用都是一个单独的JVM应用,所以单体时代的这种处理方式已经无法满足当前架构下的业务需求了。 JVM级别的锁已经无法满足跨进程之间访问控制了,进而演化出来了分布式锁。 分布式锁 能否解决幂等性问题? 分布式锁解决什么问题? 简言之: 解决跨进程间无法共享本地资源的问题 ,解决的是分布式场景下并发访问的问题。 为什么需要确保并发.

小工匠 2万+

React React Router

React Router 是 React 官方推荐的路由库,它可以帮助开发者在单页面应用中轻松实现多页面导航,而无需每次导航时刷新整个页面。React Router 的核心理念是路由即组件,即将路由逻辑通过 React 组件的方式进行管理。React Router 是 React 开发中不可或缺的工具,提供了强大的路由功能。无论是简单的单页面导航还是复杂的嵌套、多状态页面管理,React Router 都能高效解决问题。

Flying_Fish_roe的博客 2191

【Flink】Flink 消费一段时间1万多条数据就卡死

我们有个现场环境,发现了奇怪的现象,就是每次启动任务后,消费1万多条数据后就会卡死,然后整个流不消费,也不往下输出,看起来卡死了一样。缺图这里面出现的网闸原因导致的,但是经过我们写了一个简单的kafka消费程序,然后在出问题的节点上消费数据,实际排查,发现不是这个问题。这个问题,发现也不是,这段时间没有进行过kafka数据清理。里面的问题。因为这个问题,我们后面的代码刻意规范了,不这样操作。后来是在没办法了,然后我们dump了线程,发现有如下代码。

九师兄 351

【React进阶-1】从0搭建一个完整的React项目(入门篇)

这篇文章带领大家从零开始手动撸一个React项目的基础框架,集成React全家桶。万字长文,请各位有足够的时间时再来阅读和学习。概述 平时工作中一直在用React提供的脚手架工具搭建React项目,一行命令全都搞定,自己只管做需求开发即可,从来没仔细研究过各个模块代码怎么去配置,相互之间怎么去进行交互。这周正好有时间,所以决定仔细研究下React项目中的各个功能模块,所以我们来讲解下如何从零搭建一个完整的React项目。目录 项目初始化 安装NodeJS环境和初始化项目安装webpack新建项目目录和文件

jsjxxx的博客 1万+

Android Binder的两三事--基于Android14源码

Android14-Framework-Binder

保持专注,保持热爱 1141

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【React】从0到1搭建你的React18项目

从0到1搭建你的react18项目一,项目搭建安装脚手架CRA保留核心代码二、使用gitee管理项目三、使用scss预处理器四、配置路由基础路由在非组件环境下拿到路由信息路由懒加载五、组件库antd使用六、配置别名路径安装@craco/craco@别名路径提示七、安装dev-tools调试工具八、封装axios工具模块九、使用mobx模块化配置组件中使用mobx九、项目本地预览十、 打包体积分析 一,项目搭建 安装脚手架CRA 使用create-react-app生成项目 npx create-r

前端之行,任重道远! 7582

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

通过Umijs从0到1搭建一个React项目

有一阵时间没写react了,今天通过umi搭建一个demo项目复习一下react;umi是一个可扩展的企业级前端应用框架,在react市场中还是比较火的一个框架。

m0_66360096的博客 1056

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

React-从0到1搭建一个React项目(一)

#架构设计图

HuangLin的博客 2045

react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)

react全家桶从0到1(最新) 本文从零开始,逐步讲解如何用react全家桶搭建一个完整的react项目。文中针对react、webpack、babel、react-route、redux、redux-saga的核心配置会加以讲解,通过这个项目,可以系统的了解react技术栈的主要知识,避免搭建一次后面就忘记的情况。 代码库:https://github.com/teapot-py/react-...

郑清 1万+

如何创建一个 react 项目

本文介绍了构建React项目的四种方式:推荐使用Vite快速搭建纯前端项目,适合学习与SPA开发;Next.js App Router适用于全栈、SSR及AI应用,强烈推荐;create-react-app与generator-react-webpack已逐渐退位,仅用于老项目维护。文中详细对比了各工具的适用场景,并给出Vite和Next.js的创建命令,为开发者提供清晰的技术选型建议。

青蛙king的博客 3万+

从0到0.1:最简单的React项目搭建

教你从零搭建React项目。 自从React火遍大江南北后,相信很多人都在加入到React队伍的路上,但是如何从零开始搭建一个React项目呢?本文将为大家介绍如何快速简单地搭建一个新的React项目。

zhou_xiao_cheng的博客 6809

写给前端新人:从 0到1 搭建一个前端项目,都需要做什么?

点击上方关注前端技术江湖,一起学习,天天进步不使用脚手架搭建 React 项目:https://github.com/zhuyuanmin/react-0-1-build。读者可根据提交...

zz_jesse的博客 6118

简单React项目从0到1

一个小前端项目

m0_60695518的博客 1200

01【React再造之旅】从0搭建一个完整的React项目(初稿)

概述 平时工作中一直在用React提供的脚手架工具搭建React项目,一行命令全都搞定,自己只管做需求开发即可,从来没仔细研究过各个模块代码怎么去配置,相互之间怎么去进行交互。这周正好有时间,所以决定仔细研究下React项目中的各个功能模块,所以我们来讲解下如何从零搭建一个完整的React项目。 本文篇幅较长,请你耐心阅读~ 目录 概述 目录 操作步骤 一、项目初始化 1、安...

X北辰北的博客 1157

react项目,从0到1搭建

操作步骤 npm install --global create-react-app 目的:react依赖很庞大的技术栈,比如js需要使用bable,模块打包需要使用webpack等,每一项都需要单独的配置文件,所以,针对这些繁琐的配置,开发者可以通过create-react-app,自动安装所需配置,快速进入开发 create-react-app demo 通过create-react-app...

JackieMing0328的博客 660
上一篇: RxJava-Introduction
下一篇: React-从0到1搭建一个React项目(一)
Huang-Lin
博客等级 码龄10年 20粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值