相信不少小夥伴已經在社區看到不少有關以上各個技術的最新進展和分享了,可是對於想輕鬆上手,卻又缺少必定的腳手架配置經驗的小夥伴依然無所適從,想實踐起來又容易踩到各類坑。css
咱們一塊兒學貓叫,一塊兒喵喵喵喵喵~node
本腳手架主要採用較新的庫搭建,請注意node版本也要跟上哦~react
請忽略package文件夾,它是存放打包文件的webpack
import { render } from 'react-dom';
import { applyMiddleware, createStore} from 'redux'
import { Provider } from 'react-redux'
import thunk from 'redux-thunk'
import promise from 'redux-promise-middleware'
import Routers from './router'
import reducers from './reducers'
const middleware = applyMiddleware(promise(), thunk)
const store = createStore(reducers, middleware)
render(
<Provider store={store}>
<Routers />
</Provider>,
document.getElementById("app")
)
複製代碼
import React from 'react'
import { connect } from 'react-redux'
import { replace } from 'react-router-redux'
import { BrowserRouter as Router, Route, Link, Redirect, Switch } from 'react-router-dom';
import AsyncComponent from 'components/AsyncComponent';
const NotMatch = AsyncComponent(() => import('components/NotMatch'));
const App = AsyncComponent(() => import('pages/app'));
@connect(null, {replace})
export default class RootRouter extends React.Component{
render(){
const props = this.props;
//若是沒有權限,在此進行斷定並replace跳轉
return (
<Router>
<div>
<ul>
<li><Link to='/'>首頁</Link></li>
<li><Link to='/about'>關於</Link></li>
<li><Link to='/topics'>主題列表</Link></li>
</ul>
<hr/>
<Switch>
<Route exact path="/" render={() => <Redirect to='/login'/>}/>
<Route path="/login" component={App} />
<Route path="/about" component={App} />
<Route path="/topics" component={App} />
<Route component={NotMatch} />
</Switch>
</div>
</Router>
)
}
}
複製代碼
const App = (location, cb) => {
require.ensure([], require => {
cb(null, require('./components/App'))
})
}
複製代碼
<Route path="/" getComponent={ App }/>
ios
AsyncComponent.jsx
git
import React, { Component } from "react";
export default importComponent => class AsyncComponent extends Component {
state = {
component: null
}
async componentDidMount(){
const {default: component} = await importComponent();
this.setState({component});
}
render() {
const C = this.state.component;
return C ? <C {...this.props} /> : null;
}
};
複製代碼
其實這也是一個組件,只不過是該組件加載完成後,再導入真正須要加載的組件。此時還要配合webpack打包配置的output.chunkFilename屬性,稍後會貼出代碼。github
再日後就很清晰了,./components/App下的組件就是咱們的業務組件了。web
import React, { useState, useEffect, useRef } from 'react';
const effect = count => {
// Update the document title using the browser API
document.title = `You clicked ${count} times`;
return () => document.title = 'clear'
};
export default ({change}) => {
let [count, setCount] = useState(2);
const click = e => {
count++;
change(count);
setCount(count);
};
useEffect(effect.bind(null, count));
const inputEl = useRef(null);
const onButtonClick = () => {
// `current` points to the mounted text input element
inputEl.current.focus();
};
return <React.Fragment>
<div onClick={click}>
{count}
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Focus the input</button>
</div>
<p>你穩定不點個贊再走嗎?</p>
</React.Fragment>
}
複製代碼
咱們期待的hooks登場啦啦啦~~~但今天不是講hooks的,社區講它的不少很詳細,這裏直接用了。順便把useRef,React.Fragment等用法也貼了上來。面試
同時爲了方便直接開展業務,reducer,action,接口格式,axios二次封裝以及示例函數均已寫好,由於有代碼潔癖,因此文件夾佈局以及重複邏輯均作了處理。redux
之前有面試官問我怎樣使用ES6的語法書寫配置文件,當時確實沒有思考過這個問題,直接告訴她我對這個不感興趣~~~不過今天的配置文件用的ES6來寫的,配置文件名稱後加上.babel後綴便可......就是這麼簡單。 完了,再發一張個人貓吧