這一章終於大集成了react
react
源碼git
import React from 'react' import ReactDom from 'react-dom' class App extends React.Component { render() { return (<div>react</div>) } } ReactDom.render( <App/>, document.getElementById('app') )
說明:github
react
主要是用到react
、react-router
庫react-router
源碼redux
import React from 'react' import ReactDom from 'react-dom' import {BrowserRouter, Route, withRouter} from 'react-router-dom' class Article extends React.Component { render() { return ( <p>article</p> ) } } let MyArticle = withRouter(Article) class App extends React.Component { render() { return (<div> <Route component={MyArticle}></Route> </div>) } } let MyApp = withRouter(App) ReactDom.render( <BrowserRouter> <MyApp/> </BrowserRouter>, document.getElementById('app') )
說明react-router
react-router-dom
庫,是針對react-router
庫在dom
環境下的封裝withRouter
組件,注入match
、location
、history
等屬性BrowserRouter
接管跟組件Route
指定路由和組件的對應關係redux
源碼app
引入redux
相關的包dom
import {Provider, connect} from 'react-redux' import {createStore} from 'redux'
reducer
ide
const counter = (state = {counter: 0, num: 0}, action) => { switch (action.type) { case ACTION_INCREMENT: return {...state, ...{counter: ++state.counter}} case ACTION_DECREMENT: return {...state, ...{counter: --state.counter}} default: return state } }
action
和actionCreators
this
// action const ACTION_INCREMENT = 'INCREMENT' const ACTION_DECREMENT = 'DECREMENT' // action creator const increment = () => ({ type: ACTION_INCREMENT }) const decrement = () => ({ type: ACTION_DECREMENT })
連接組件spa
// store const store = createStore(counter) class Article extends React.Component { render() { return ( <p>{this.props.counter}</p> ) } } let MyArticle = withRouter(connect((state) => { return { counter: state.counter } })(Article)) class App extends React.Component { render() { return ( <div> <Route component={MyArticle}></Route> <button onClick={() => this.props.increment()}>+</button> <button onClick={() => this.props.decrement()}>-</button> </div> ) } } let MyApp = withRouter(connect(() => ({}), (dispatch) => { return { increment: () => dispatch(increment()), decrement: () => dispatch(decrement()) } })(App)) ReactDom.render( <Provider store={store}> <BrowserRouter> <MyApp/> </BrowserRouter> </Provider>, document.getElementById('app') )
說明
redux
、react-redux
庫reducer
、action
、actionCreators
都是redux
用的Provider
接管BrowserRouter
,並注入store
connect
鏈接組件和store
,爲組件注入reducer
每一步都搞懂,下一步才能更明確。