可先查看我的redux簡單入門
react-redux簡介
react-redux是使用redux開發react時使用的一個插件,另外插一句,redux不是react的產品,vue和angular中也可以使用redux;下面簡單講解,如何使用react-redux來開發react。
描述
這個插件可以讓我們的redux代碼更加的簡潔和美觀。我假設你已經有一個使用create-react-app創建的一個可以顯示hello world的react環境,并且已經安裝來redux。
注意:如果是剛使用create-react-app創建的,需要運行 npm run eject彈出個性化設置,這樣就可以自定義配置了。
安裝
npm i react-redux --save
使用
react-redux提供了兩個重要的接口:Provider、connect,使用了這個插件,react-redux的subscribe和dispatch就可以忘記來,它們就用不著了。
代碼結構
//index.jsimport React from 'react';import ReactDOM from 'react-dom';import './index.css';import App from './App';import registerServiceWorker from './registerServiceWorker';import { createStore, applyMiddleware } from 'redux';import thunk from 'redux-thunk';import { reducer } from './index.redux';import { Provider } from 'react-redux'const store = createStore(reducer, applyMiddleware(thunk));ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById('root'));registerServiceWorker();Provider中應用的最外層,把store傳給它,只使用這一次。
//app.jsimport React, { Component } from 'react';import { addCreator, removeCreator, addAsync } from './index.redux';import { connect } from 'react-redux';class App extends Component { render() { return ( <div className="App"> <h1>現在有美女{this.props.num}個。</h1> <button onClick={this.props.addCreator}>add</button> <button onClick={this.props.removeCreator}>remove</button> <button onClick={this.props.addAsync}>addAsync</button> </div > ); }}//定義把state中哪個屬性放到props中 function mapStateToProps(state) { return { num: state } } //定義把哪些方法放到props中 const actionCreators={ addCreator, removeCreator, addAsync }; //connect其實就是一個高階組件,把app傳進去,返回一個新的app組件 App = connect(mapStateToProps, actionCreators)(App);export default App;connect負責從外部獲取組件需要的參數。通過connect定義后,放到props中的屬性和方法就可以直接通過this.props來獲取。
下面是reducer的定義。
//react.redux.jsconst Add = 'addGirl', Remove = "removeGirl";export function reducer(state = 0, action) { switch (action.type) { case Add: return state + 1; case Remove: return state - 1; default: return 10; }}export function addCreator() { return { type: Add };}export function removeCreator() { return { type: Remove };}export function addAsync() { return (dispatch, getState) => { setTimeout(function () { dispatch(addCreator()); }, 1000); }}
新聞熱點
疑難解答
圖片精選