Open NARUTOne opened 6 years ago
当我们使用react-router v3
的时候,我们想跳转路由,我们一般这样处理
我们从react-router
导出browserHistory
。
我们使用browserHistory.push()
等等方法操作路由跳转。
类似下面这样
import browserHistory from 'react-router';
export function addProduct(props) {
return dispatch =>
axios.post(`xxx`, props, config)
.then(response => {
browserHistory.push('/cart'); // 这里
});
}
but!! 🐛 问题来了,在react-router v4
中,不提供browserHistory
等的导出~~
withRouter
高阶组件,提供了history让你使用~
import React from "react";
import {withRouter} from "react-router-dom";
class MyComponent extends React.Component {
...
myFunction() {
this.props.history.push("/some/Path");
}
...
}
export default withRouter(MyComponent);
这是官方推荐做法哦。但是这种方法用起来有点难受,比如我们想在redux
里面使用路由的时候,我们只能在组件把history
传递过去。
就像问题章节的代码那种场景使用,我们就必须从组件中传一个history
参数过去。。。
react-router v4
在 Router
组件中通过Contex
暴露了一个router
对象~
在子组件中使用Context
,我们可以获得router
对象,如下面例子~
import React from "react";
import PropTypes from "prop-types";
class MyComponent extends React.Component {
static contextTypes = {
router: PropTypes.object
}
constructor(props, context) {
super(props, context);
}
...
myFunction() {
this.context.router.history.push("/some/Path");
}
...
}
当然,这种方法慎用~尽量不用。因为react
不推荐使用contex
哦。在未来版本中有可能被抛弃哦。
其实分析问题所在,就是v3中把我们传递给Router
组件的history
又暴露出来,让我们调用了~~
而react-router v4
的组件BrowserRouter
自己创建了history
,
并且不暴露出来,不让我们引用了。尴尬~
我们可以不使用推荐的BrowserRouter
,依旧使用Router
组件。我们自己创建history
,其他地方调用自己创建的history
。看代码~
我们自己创建一个history
// src/history.js
import createHistory from 'history/createBrowserHistory';
export default createHistory();
我们使用Router
组件
// src/index.js
import { Router, Link, Route } from 'react-router-dom';
import history from './history';
ReactDOM.render(
<Provider store={store}>
<Router history={history}>
...
</Router>
</Provider>,
document.getElementById('root'),
);
其他地方我们就可以这样用了
import history from './history';
export function addProduct(props) {
return dispatch =>
axios.post(`xxx`, props, config)
.then(response => {
history.push('/cart'); //这里
});
}
确实,react-router v4
推荐使用BrowserRouter
组件,而在第三个解决方案中,我们抛弃了这个组件,又回退使用了Router
组件。
怎么办。 你去看看BrowserRouter的源码,我觉得你就豁然开朗了。
源码非常简单,没什么东西。我们完全自己写一个BrowserRouter
组件,然后替换第三种解决方法中的Router
组件。嘿嘿 😃 。
redux 中间件处理 异步副作用
本项目采用 redux-saga
, 其他方案,可以见Redux 异步数据流方案对比
saga
中间层
react-scaffold
写在前面
部分技术选择:
UI:
规范:
init
创建项目需要文件夹
webpack
webpack 配置
build/
Babel
babel 中文 Babel 入门教程
开始
babel-preset-react 用于解析 JSX
babel-preset-stage-0 用于解析 ES7 提案
babel-preset-env: babel常用的转义器:相当于 es2015 ,es2016 ,es2017 及最新版本。
stage-x:
.babelrc 配置
资源处理
url-loader file-loader
编译css
css-loader使你能够使用类似@import 和 url(...)的方法实现 require()的功能;
style-loader将所有的计算后的样式加入页面中; 二者组合在一起使你能够把样式表嵌入webpack打包后的JS文件中。
使用less
样式兼容
配置
postcss.config.js
样式文件拆分
webpack.base.config.js
配置webpack-config
webpack-dev
webpack-prod
webpack-server
webpack-dev-server
express + + webpack-dev-middleware
webpack-build-prod
webpack 其他配置
1、copy静态资源 static
2、压缩打包文件
规范
vscode + eslint
stylelint autofix
webpack-config
running
持续集成服务 Travis CI
React
react-router
react-router history跳转
redux
react-router-redux 这个包的正式版4.x不支持react-router v4。你需要用 alpha 版 的react-router-redux。在package.json 里加入react-router-redux~5.0.0或者用yarn:
redux 异步
react应用热更新
https://github.com/gaearon/react-hot-loader/issues/511#issuecomment-288673129
异步import, code split
配置使用 解决异步loadable引入导致react-hot-loader失效
Antd
babel-config:
定制主题
config/theme.js:
package.json:
webpack.base.config.js: