资讯专栏INFORMATION COLUMN

30分钟极速通关react mobx react-router及打通springboot

马忠志 / 2909人阅读

摘要:接入步骤安装依赖启用装饰器语法如果有的话,要将没有保存的文件上传之后或者删除之后才能跑命令在中找到项目在里面增加加入在下增加文件改写改写一下,来看看效果吧简要说明表示注入在中的的属性。

内容导航

简单开发react

将react与mobx结合开发

使用react-router进行多页面开发

将项目打包到后端项目中进行部署

将完成的项目做成脚手架,避免重复的环境搭建

需要环境

确保node已经安装

确保npm已经安装

创建项目

</>复制代码

  1. npx create-react-app test
  2. # test 为你需要创建项目的名字,会在命令当前目录下创建test的目录,包含项目所有的文件

你已经完成了创建,开始跑起来

</>复制代码

  1. npm start

你可以看到react已经能够在local host:3000访问了,只有一个欢迎页面

目录结构

node_modules

是当前目录安装的模块存放的地方

public

index.html 是单页面的入口

src

可存放自己编写的代码,App是默认生成的欢迎页面逻辑,index 是js的主入口

开始更改你的代码 A. react简单开发

1.将App.js的代码更改如下

</>复制代码

  1. import React, {Component} from "react";
  2. import "./App.css";
  3. class App extends Component {
  4. constructor(props) {
  5. super(props)
  6. this.state = {todos: [{checked: false, text: "hello"}, {checked: true, text: "world"}]}
  7. this.handleClick=this.handleClick.bind(this)
  8. }
  9. handleClick(index) {
  10. let todos = this.state.todos
  11. todos[index].checked = !todos[index].checked
  12. this.setState({todos:todos})
  13. }
  14. render() {
  15. let todos = this.state.todos
  16. let todosDiv = todos.map((item, index) => {
  17. return ()
  18. })
  19. return (
  20. {todosDiv}
  21. );
  22. }
  23. }
  24. class Todo extends Component {
  25. constructor(props){
  26. super(props)
  27. this.handleClick=this.handleClick.bind(this)
  28. }
  29. handleClick() {
  30. let index = this.props.index
  31. this.props.handleClick(index)
  32. };
  33. render() {
  34. return (
  35. {this.props.text}:{this.props.index}
  36. )
  37. }
  38. }
  39. export default App;

再次npm start一下看看效果吧~

可以看到我们组件已经能够响应点击了

B. 引入mobx作为状态管理 提出问题

在上面我们可以看到想要更改状态是比较困难的,首先要将handClick方法由子组件传给父组件,再进行处理。如果我们的组件是

四五层组件的时候得一步一步的往上级传递,这就会导致组件传递写的很臃肿。这个时候就需要一个将状态(即state这个值)独立开来。

react有很多状态管理的组件,比如redux,mobx。但redux写起来还是不如mobx简单明了。下面我们就来接入mobx。

接入步骤

安装依赖

</>复制代码

  1. npm install mobx --save
  2. npm install mobx-react --save

启用装饰器语法

</>复制代码

  1. # 如果有git的话,要将没有保存的文件上传之后或者删除之后才能跑eject命令
  2. yarn run eject
  3. npm install --save-dev babel-preset-mobx

在package.json中找到babel项目,在presets里面增加"mobx"

</>复制代码

  1. "babel": { 
  2. "presets": [   
  3. "react-app",   
  4. "mobx" 
  5. ]},

加入core-decorators

</>复制代码

  1. npm install core-decorators --save

在src下增加store.AppStore.js文件

</>复制代码

  1. import {action, observable} from "mobx";
  2. class AppStore {
  3. @observable todos;
  4. constructor() {
  5. this.todos = [{checked: false, text: "hello"}, {checked: true, text: "world"}]
  6. }
  7. @action.bound handleClick(index) {
  8. let todos = this.todos
  9. todos[index].checked = !todos[index].checked
  10. }
  11. }
  12. export default AppStore;

改写index.js

</>复制代码

  1. import React from "react";
  2. import ReactDOM from "react-dom";
  3. import "./index.css";
  4. import App from "./App";
  5. import * as serviceWorker from "./serviceWorker";
  6. import {Provider} from "mobx-react";
  7. import AppStore from "./store/AppStore"
  8. let rootStore = {}
  9. rootStore["app"] = new AppStore()
  10. ReactDOM.render(
  11. , document.getElementById("root"));
  12. // If you want your app to work offline and load faster, you can change
  13. // unregister() to register() below. Note this comes with some pitfalls.
  14. // Learn more about service workers: https://bit.ly/CRA-PWA
  15. serviceWorker.unregister();

改写App.js

</>复制代码

  1. import React, {Component} from "react";
  2. import "./App.css";
  3. import {inject, observer} from "mobx-react";
  4. import {autobind} from "core-decorators";
  5. @inject("app")
  6. @autobind
  7. @observer
  8. class App extends Component {
  9. constructor(props) {
  10. super(props)
  11. }
  12. render() {
  13. let todos = this.props.app.todos
  14. let todosDiv = todos.map((item, index) => {
  15. return ()
  16. })
  17. return (
  18. {todosDiv}
  19. );
  20. }
  21. }

</>复制代码

  1. @inject("app")
  2. @autobind
  3. @observer
  4. class Todo extends Component {
  5. constructor(props) {
  6. super(props)
  7. }
  8. handleClick() {
  9. let index = this.props.index
  10. this.props.app.handleClick(index)
  11. };
  12. render() {
  13. let index = this.props.index
  14. let todo = this.props.app.todos[index]
  15. return (
  16. {todo.text}:{index}
  17. )
  18. }
  19. }
  20. export default App;
  21. ```

npm start一下,来看看效果吧

简要说明

@inject("app")表示注入在index.js中的rootStore的属性app。是由这个标签来实现动态的注入的

@autobind 将组件之间的绑定自动完成

@observer mobx用来将react组件转换为响应式组件的注解,详情查看mobx的文档

上面可以看出,将原本的state的属性抽离到AppStore中了,对值得更改方法也是直接调用AppStore的方法,从而避免了react组件的一级一级往上传递

C. 引入react-router作为多页面管理 提出问题

上面我们完成了单页面的开发。当需要多个页面时我们就需要使用react-router来对不同路径进行渲染了

接入react-router步骤

安装依赖

</>复制代码

  1. npm install react-router mobx-react-router --save

增加新的页面,在src中增加component/Test.js

</>复制代码

  1. import * as React from "react";
  2. class Test extends React.Component{
  3. render() {
  4. return(

    welcome!

    )
  5. }
  6. }
  7. export default Test;

更改index.js

</>复制代码

  1. import React from "react";
  2. import ReactDOM from "react-dom";
  3. import "./index.css";
  4. import App from "./App";
  5. import * as serviceWorker from "./serviceWorker";
  6. import {Provider} from "mobx-react";
  7. import AppStore from "./store/AppStore"
  8. import {Route, Router, Switch} from "react-router";
  9. import {RouterStore, syncHistoryWithStore} from "mobx-react-router";
  10. import createHashHistory from "history/createHashHistory"
  11. import Test from "./component/Test"
  12. let rootStore = {}
  13. const hashHistory = createHashHistory()
  14. const routerStore = new RouterStore()
  15. const history = syncHistoryWithStore(hashHistory, routerStore)
  16. rootStore["app"] = new AppStore()
  17. routerStore["routing"] = routerStore
  18. ReactDOM.render(
  19. here is the menu

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

npm start一下,访问下/#/test,和/#/路径,看看效果吧

简要说明

createHashHistory是单页面的访问,会在url加个#号作为定位,这个对于要打包到后台作为页面时是很方便的。

如果你直接使用node部署的话可以直接使用createBrowserHistory,url就会是没有#号的url。

D. 结合ui框架 接入步骤

找到一个合适的react ui框架,install之后按照ui框架的教程就可以开发一个相对比较好看的页面了

常见的框架有semantic,bootstrap,ant等。

E. 结合maven打包进spring boot项目 提出问题

当我们需要跟spring boot等后端项目结合,而又不想多带带部署前端页面时,就需要打包进后端项目了

接入步骤

新建一个多模块的maven项目

按照之前创建的步骤,创建前端的模块,假设模块名字为view,并在前端模块的目录下增加pom.xml

</>复制代码

  1. com.github.eirslett
  2. frontend-maven-plugin
  3. 1.2
  4. <-- Install our node and npm version to run npm/node scripts-->
  5. install node and npm
  6. install-node-and-npm
  7. <-- 指定node的版本例如 v6.9.1 -->
  8. ${nodeVersion}
  9. ${npmVersion}
  10. https://npm.taobao.org/mirrors/node/
  11. http://registry.npmjs.org/npm/-/
  12. <-- Set NPM Registry -->
  13. npm set registry
  14. npm
  15. <--config set registry https://registry.npmjs.org-->
  16. config set registry https://registry.npm.taobao.org
  17. <-- Set SSL privilege -->
  18. npm set non-strict ssl
  19. npm
  20. <-- Optional configuration which provides for running any npm command -->
  21. config set strict-ssl false
  22. <-- Install all project dependencies -->
  23. npm install
  24. npm
  25. <-- optional: default phase is "generate-resources" -->
  26. generate-resources
  27. <-- Optional configuration which provides for running any npm command -->
  28. install
  29. <-- Build and minify static files -->
  30. npm run build
  31. npm
  32. run build

当进行mvn package时就会在目录下生成build目录,包含所有的页面和脚本了。

在spring boot后端项目中,将前端打包好的页面拷贝到后端目录中

</>复制代码

  1. maven-resources-plugin
  2. Copy App Content
  3. generate-resources
  4. copy-resources
  5. src/main/resources/public
  6. true
  7. ${project.parent.basedir}/view/build
  8. static/
  9. index.html
  10. org.springframework.boot
  11. spring-boot-maven-plugin

其中outputDirectory指明要放入的文件夹

directory指明要拷贝哪里的资源文件,需要根据你的前端模块名进行相应的修改

mvn package 一下,后端模块的打包jar里面就会有相应的资源文件啦

F. 前后端联调 步骤

在前端项目package.json中指明接口的代理

</>复制代码

  1. "proxy":"http://localhost:8080/"

如果servletPath不为/,则需要在后面补上相应的servletPath

当你的后端项目有设置servletPath的时候,需要相应配置前端的打包的servletPath,否则默认为/的servletpath

方法1: package.json 增加

</>复制代码

  1. "homepage": "."

方法2: config.paths.js文件下修改配置

</>复制代码

  1. function getServedPath(appPackageJson) {
  2. const publicUrl = getPublicUrl(appPackageJson);
  3. ///修改为./
  4. const servedUrl =
  5. envPublicUrl || (publicUrl ? url.parse(publicUrl).pathname : "./");
  6. return ensureSlash(servedUrl, true);
  7. }

G. 将你创建好的项目做成脚手架 提出问题

如果每个项目都要经历上面的步骤,才能完成,那前期工作量是在太繁琐又重复

借助maven的archetype来帮你自动生成一个初始项目吧

接入步骤

按照上面的流程我们已经建好了项目

在项目目录下执行 mvn archetype:create-from-project,生成的target就是你的脚手架项目

cd target/generated-sources/archetype 目录下,执行mvn install 就把archetype放入了本地仓库了,可以进行使用了

为了deploy到远程仓库中,需要在target/generated-sources/archetype 目录下的pom.xml中加入自己的远程仓库的地址,然后在target/generated-sources/archetype 目录下mvn deploy就可以了

屏蔽掉部分不想打包进archetype的文件

要屏蔽部分文件夹时在pom中加入plugin

</>复制代码

  1. maven-archetype-plugin
  2. 3.0.1
  3. archetype.properties

新建archetype.properties文件,配置要忽略的通配符excludePatterns=/.idea/,**.iml

怎么使用archetype

创建项目在idea中,在点击file-> new-> project后弹出的对话框中选择maven

在create from archetype打勾,点击Add archetype加入创建好的archetype

填写对应的groupId,artifaceId,version后在列表中选择已有的archetype

按引导进行后续步骤的创建,然后就会自动生成跟你项目一样的啦

跨store的访问 什么是跨store访问

在上面我们有这样的代码

</>复制代码

  1. const routerStore = new RouterStore()
  2. rootStore["app"] = new AppStore()
  3. routerStore["routing"] = routerStore

有时候我们往往需要在一个store的方法中去访问下别的store的内容,这个时候就是跨store的访问,就需要在初始化时将rootStore传给这个store,通过rootStore去访问,改写index.js

</>复制代码

  1. rootStore["app"] = new AppStore(rootStore)

改写AppStore.js,增加构造函数

</>复制代码

  1. constructor(rootStore) {
  2. this.rootStore = rootStore
  3. }

这样就可以在AppStore.js的函数中通过this.rootStore 去获取所有store的json,从而访问所有的store了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103060.html

相关文章

  • 30分钟极速通关react mobx react-router打通springboot

    摘要:接入步骤安装依赖启用装饰器语法如果有的话,要将没有保存的文件上传之后或者删除之后才能跑命令在中找到项目在里面增加加入在下增加文件改写改写一下,来看看效果吧简要说明表示注入在中的的属性。 内容导航 简单开发react 将react与mobx结合开发 使用react-router进行多页面开发 将项目打包到后端项目中进行部署 将完成的项目做成脚手架,避免重复的环境搭建 需要环境 确保...

    sunnyxd 评论0 收藏0
  • React结合TypeScript和Mobx初体验

    摘要:结合编辑器可以推导变量对应的类型以及内部的结构,提高代码的健壮性和可维护性。通过充分利用时间回溯的特征,可以增强业务的可预测性与错误定位能力。对于对象的哪部分需要成为可观察的,提供了细粒度的控制。 showImg(https://segmentfault.com/img/bVba6Ts?w=1218&h=525); 为什么要使用TypeScript 侦测错误 通过静态类型检测可以尽早检...

    dreambei 评论0 收藏0
  • electron + react + react-router + mobx + webpack 搭

    摘要:调试集成环境选择模块,简单分离开发,测试,线上环境。程序保护开机自启托盘最小化崩溃监控升级一行代码接入升级平台,实现客户端升级功能打包构建一个指令搞定打包项目地址 项目地址 : https://github.com/ConardLi/electron-react electron-react electron + react + react-router + mobx + webpac...

    pingan8787 评论0 收藏0
  • React + MobX 入门实例(一)

    摘要:前言现在最热门的前端框架,毫无疑问是。对于小型应用,引入状态管理库是奢侈的。但对于复杂的中大型应用,引入状态管理库是必要的。现在热门的状态管理解决方案,相继进入开发者的视野。获得计算得到的新并返回。 前言 现在最热门的前端框架,毫无疑问是React。 React是一个状态机,由开始的初始状态,通过与用户的互动,导致状态变化,从而重新渲染UI。 对于小型应用,引入状态管理库是奢侈的。 但...

    simon_chen 评论0 收藏0
  • React 328道最全面试题(持续更新)

    摘要:希望大家在这浮夸的前端圈里,保持冷静,坚持每天花分钟来学习与思考。 今天的React题没有太多的故事…… 半个月前出了248个Vue的知识点,受到很多朋友的关注,都强烈要求再出多些React相前的面试题,受到大家的邀请,我又找了20多个React的使用者,他们给出了328道React的面试题,由我整理好发给大家,同时发布在了前端面试每日3+1的React专题,希望对大家有所帮助,同时大...

    kumfo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<