最近正在学习react,就想着能不能用react作一个项目,平时浏览掘金,就拿掘金练手吧!javascript
yarn create react-app react-juejin
复制代码
这个脚手架会自动帮助咱们搭建基础工程,同时安装React项目的各类必要依赖,若是在过程当中出现网络问题,请尝试配置代理或使用其余 npm registry。
进入项目并启动css
cd react-juejin
yarn start
复制代码
yarn add antd
复制代码
yarn add react-app-rewired customize-cra
复制代码
修改package.json 文件以下html
module.exports = function override(config, env) {
// do stuff with the webpack config...
return config;
};
复制代码
yarn add babel-plugin-import
复制代码
修改上步建立的config-overrides.jsjava
const { override, fixBabelImports } = require('customize-cra');
module.exports = override(
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
style: 'css',
})
);
复制代码
yarn add less less-loader
复制代码
修改config-overrides.jsreact
//const { override, fixBabelImports } = require('customize-cra');
const { override, fixBabelImports, addLessLoader } = require('customize-cra');
module.exports = override(
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
style: true,
}),
addLessLoader({
javascriptEnabled: true,
}),
);
复制代码
以上详细配置的话可参考ant-design官网webpack
yarn add redux react-redux --save
复制代码
// 建议使用这中结构
// 1.定义默认数据
let initialState = {
notificationCount: 0
}
// 2.Reducer
const pageHeaderReducer = (state = initialState, action) => {
switch (action.type) {
case 'CHANGE_COUNT':
return { ...state, notificationCount: action.notificationCount }
default:
return state
}
}
// 3.导出
export default pageHeaderReducer;
复制代码
(2)建立index.js,做为合并全部reducer的文件。git
import {combineReducers} from 'redux';
import pageHeaderReducer from './pageHeader.js';
const appReducer = combineReducers({
pageHeaderReducer
});
export default appReducer;
复制代码
(3)App.js中使用定义好的reducergithub
import { createStore } from 'redux'
import { Provider } from 'react-redux'
import appReducer from './reducers/index.js';
// 使用合并后的那个Reducer
const store = createStore(appReducer);
class App extends Component {
constructor(props){
super(props);
}
...
render() {
return (
<Provider store={store}>
<div className="App">
...
</div>
</Provider>
);
}
}
复制代码
(4)在header/index.js中使用reduxweb
import { connect } from 'react-redux';
class Header extends Component {
...
render() {
...
return (
<Affix offsetTop={this.state.top}>
...
<Badge count={this.props.count} overflowCount={10}>
<a href="/">
<Icon type="notification" />
</a>
</Badge>
</Affix>
);
}
}
const mapStateToProps = (state) => {
return {
count: state.pageHeaderReducer.notificationCount
}
}
Header=connect(mapStateToProps)(Header)
export default Header;
复制代码
到目前为止,就能够在外部修改notificationCount的值,经过redux,组件内部就能够正常获取到对应的count值。
更详细的redux配置能够参考redux中文文档npm
首页导航中存在5个tab切换,分别对应这不一样的页面内容。接下来介绍如何经过react-router实现不一样页面内容的跳转。
yarn add react-router-dom --save
复制代码
import { Switch, Route } from 'react-router-dom';
...
class Main extends Component {
constructor(props) {
super(props);
this.state = { }
}
render() {
return (
<div>
<Switch>
<Route exact path='/' component={Home}/>
<Route path='/timeline' component={Home}/>
<Route path='/dynamic' component={Dynamic}/>
<Route path='/topic' component={Topic}/>
<Route path='/brochure' component={Brochure}/>
<Route path='/activity' component={Activity}/>
</Switch>
</div>
);
}
}
复制代码
上面的exact表示绝对匹配/,若是不注明exact,则/还会匹配/timeline等等上面代码实现了一个相似tabbar切换的效果
render() {
return (
<ul>
{this.state.navs.map((item,index)=>{
return <li key={item.path} className={item.isActived?'activeLi':''} onClick={this.handelClick.bind(this,index)}>
<Link to={item.path}>{item.text}</Link>
</li>
})}
</ul>
);
}
复制代码
react-router中提供了Link和NavLik两种方式,若是仅仅须要匹配路由,使用Link就能够了,而NavLink的不一样在于能够给当前选中的路由添加样式, 好比上面写到的activeStyle和activeClassName
更详细的react-router配置能够参考React-router中文文档
到目前为止,基础结构就算是完成了,后续的就须要往各个页面添加实际内容了。
目前效果图如上所示,后续不断更新中。以上详细代码见github,欢迎点赞,您的点赞是个人动力。