React:创建管理后台项目demo
<p>1、全局安装create-react-app</p><p>npm install -g create-react-app</p>
<p>2、创建项目,安装依赖</p>
<p>create-react-app my-react-app</p>
<p>3、进入项目</p>
<p>cd my-react-app</p>
<p>4、启动项目</p>
<p>npm start</p>
<p>这是你就有了一个react demo</p>
<p>接着是对demo的改造了。。。这里是改造后的项目目录</p>
<p><img src="https://img2020.cnblogs.com/blog/1247274/202007/1247274-20200707102148112-441213334.png"></p>
<p>1、配置路由:</p>
<p>首先安装路由组件:react-router-dom</p>
<p>npm install react-router-dom --save-dev</p>
<p>router.js如下</p>
<div class="cnblogs_code">
<pre>import React, { Component } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import { HashRouter, Switch, Route } </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react-router-dom</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import home </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@/pages/home/home</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import login </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@/pages/login/login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> RouteConfig extends Component {
render() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><HashRouter>
<Switch>
<Route path=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span> exact component={login} />
<Route path=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">"</span> exact component={login}/>
<Route path=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/home</span><span style="color: rgba(128, 0, 0, 1)">"</span> exact component={home}/>
</Switch>
</HashRouter><span style="color: rgba(0, 0, 0, 1)">
)
}
}</span></pre>
</div>
<p>2、根目录下的index.js内容</p>
<div class="cnblogs_code">
<pre>import React <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
import ReactDOM </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react-dom</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
import Route </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./router/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import </span>* <span style="color: rgba(0, 0, 255, 1)">as</span> serviceWorker <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./serviceWorker</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
import </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./assets/css/index.css</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> render = Component =><span style="color: rgba(0, 0, 0, 1)"> {
ReactDOM.render(
</span><Component /><span style="color: rgba(0, 0, 0, 1)">,
document.getElementById(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">root</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">))
}
render(Route)
</span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (module.hot) {
module.hot.accept(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./router/</span><span style="color: rgba(128, 0, 0, 1)">'</span>, () =><span style="color: rgba(0, 0, 0, 1)"> {
render(Route)
})
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> If you want your app to work offline and load faster, you can change
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> unregister() to register() below. Note this comes with some pitfalls.
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Learn more about service workers: </span><span style="color: rgba(0, 128, 0, 1); text-decoration: underline">https://bit.ly/CRA-PWA</span>
serviceWorker.unregister();</pre>
</div>
<p>最后是pages文件的改造:</p>
<p>1、home.jsx</p>
<p>在home.jsx中用到了immutable插件,所以我们需要install下</p>
<div class="cnblogs_code">
<pre>npm install immutable</pre>
</div>
<p>同时附上immutable的JDK:immutable详解</p>
<div class="cnblogs_code">
<pre>import React, { Component } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import { </span><span style="color: rgba(0, 0, 255, 1)">is</span>, fromJS } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">immutable</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Home extends Component {
state </span>=<span style="color: rgba(0, 0, 0, 1)"> {
name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wql</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
}
componentWillMount () {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 组件初始化时调用,更新不调用,整个生命周期只有一次,可以修改state</span>
<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wql123</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
})
}
componentDidMount () {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 组件渲染之后调用,只能调用一次</span>
console.log(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">componentDidMount</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
}
componentWillReceiveProps () {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 组件初始化不调用,组件接收新的props时调用</span>
<span style="color: rgba(0, 0, 0, 1)"> }
componentWillUpdate () {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 组件初始化时不调用,组件更新完成后调用,此时可以获取dom节点</span>
<span style="color: rgba(0, 0, 0, 1)"> }
componentWillUnmount () {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 组件将要卸载时调用,一些事件监听和定时器需要在此时清除</span>
<span style="color: rgba(0, 0, 0, 1)"> }
shouldComponentUpdate (nextProps, nextState) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 组件判断是否需要重新渲染时调用
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> fromJS: 将纯 JS 对象和数组深层转换为不可变映射和列表
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> is: 判断是否值相等</span>
console.log(!<span style="color: rgba(0, 0, 255, 1)">is</span>(fromJS(<span style="color: rgba(0, 0, 255, 1)">this</span>.props),fromJS(nextProps)) || !<span style="color: rgba(0, 0, 255, 1)">is</span>(fromJS(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state), fromJS(nextState)))
</span><span style="color: rgba(0, 0, 255, 1)">return</span> !<span style="color: rgba(0, 0, 255, 1)">is</span>(fromJS(<span style="color: rgba(0, 0, 255, 1)">this</span>.props),fromJS(nextProps)) || !<span style="color: rgba(0, 0, 255, 1)">is</span>(fromJS(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state), fromJS(nextState))
}
deal </span>= (val) =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(val)
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
name: val
})
}
render () {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><div>
<div><span style="color: rgba(128, 0, 128, 1)">11</span>{<span style="color: rgba(0, 0, 255, 1)">this</span>.state.name}</div>
<a onClick={<span style="color: rgba(0, 0, 255, 1)">this</span>.deal.bind(<span style="color: rgba(0, 0, 255, 1)">this</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">12123</span><span style="color: rgba(128, 0, 0, 1)">'</span>)}>click it</a>
</div><span style="color: rgba(0, 0, 0, 1)">
)
}
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Home</pre>
</div>
<p>启动项目即可,自带热更新。</p>
<p>下边提供将src根路径替换成@的方法,效果如下</p>
<p><img src="https://img2020.cnblogs.com/blog/1247274/202007/1247274-20200707144421416-1280181021.png"></p>
<p> </p>
<p> </p>
<p>方法:</p>
<p>1、安装react-app-rewired </p>
<p>npm install react-app-rewired --save-dev</p>
<p>2、跟路径下,添加config-overrides.js,如下</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> path = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">path</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
module.exports </span>= function <span style="color: rgba(0, 0, 255, 1)">override</span><span style="color: rgba(0, 0, 0, 1)"> (config,env) {
config.resolve.alias </span>=<span style="color: rgba(0, 0, 0, 1)"> {
...config.resolve.alias,
</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">@</span><span style="color: rgba(128, 0, 0, 1)">'</span>: path.resolve(__dirname, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">src</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> config
}</span></pre>
</div>
<p>3、修改package.json,如下</p>
<p><img src="https://img2020.cnblogs.com/blog/1247274/202007/1247274-20200707144619165-1810761746.png"></p>
<p> 参考学习 github地址:https://github.com/shenqinglin/react-antdesign.git</p><br><br>
来源:https://www.cnblogs.com/WQLong/p/13278989.html
頁:
[1]