1. 程式人生 > >案例:React+Redux使用非同步Action實現加減

案例:React+Redux使用非同步Action實現加減

其實很早就已經接觸react了,當時還看的是es5語法,本來js基礎就不紮實,秉著初生牛犢不怕虎的精神去看了react,結果看了雲裡霧裡,這種硬塞的知識過幾天就全忘了,過了一段時間,想著有空了,就又去看了react,這次直接看的es6語法,看完後順道看了react-redux,剛開始,很痛苦,本來react就已經不太容易理解了,再加上redux和react-redux,更加懵逼了,一個很簡單的應用還要分成action、reducer、UI元件、container元件,然後分別串聯工作,就感覺腦袋要炸了,但是跟著阮大神寫了第一個demo。

先看檔案目錄,我沒有想demo裡那樣全寫在一個檔案裡,分類可以幫助更好的理解。

1.加減計數器:先定義使用者有兩種操作,一種是加,一種是減,也就是action有兩種。

export const increaseAction = {
    type: 'increase'
}
 
export const decreaseAction = {
    type: 'decrease'
}

注意,action的type是必須的,明文規定必須要。 2.然後是reducer,reducer是收到action,然後計算得出新的state,以便讓UI元件渲染新的狀態,因為每個state對應不同的view。

const setCounter = (state = {count: 0}, action) => {
    switch (action.type) {
        case 'increase':
            return {count: state.count + 1};
        case 'decrease':
            return {count: state.count - 1}
        default:
            return state;
    }
}
 
export default setCounter;

reducer對action的加減操作都進行了判斷處理,然後返回新的state。 3.然後是UI元件,就是view部分。


import React, {PropTypes} from 'react';
 
class Counter extends React.Component {
    render() {
        const {value, onIncreaseClick,onDecreaseClick} = this.props,
                btnStyle = {
                    width: '110px',
                    height: '30px',
                    color: '#fff',
                    backgroundColor: 'green',
                    border: '1px solid green',
                    borderRadius: '5px',
                    cursor: 'pointer'
                },
                textStyle = {
                    fontSize: '20px'
                };
 
        return (
            <div>
                <span style={textStyle}>{value}</span>
                <br />
                <button style={btnStyle} type="button" onClick={onIncreaseClick}>Increase</button>
                 
                <button style={btnStyle} type="button" onClick={onDecreaseClick}>Decrease</button>
            </div>
        )
    }
}
 
Counter.propTypes = {
    value          : PropTypes.number.isRequired,
    onIncreaseClick: PropTypes.func.isRequired,
    onDecreaseClick: PropTypes.func.isRequired
}
 
export default Counter;

這裡UI元件接收了來自父元件的props,onIncreaseClick,onDecreaseClick是兩個按鈕事件,使用者點選觸發事件然後傳遞action,到container接收action。 4.container接收action,通過dispatch將action傳遞給store。


import {connect} from 'react-redux';
import Counter from '../components/Counter';
import {increaseAction, decreaseAction} from '../action/index';
 
const mapStateToProps = (state) => ({
    value: state.count
})
 
const mapDispatchToProps = (dispatch) => ({
    onIncreaseClick: () => dispatch(increaseAction),
    onDecreaseClick: () => dispatch(decreaseAction)
})
 
const App = connect(
    mapStateToProps,
    mapDispatchToProps
)(Counter)
 
export default App;

這裡呼叫了react-redux的connect方法,用於將UI元件生成容器元件,其實就是將兩者connect連線在一起,connect需要接受兩個引數,mapStateToProps和mapDIspatchToProps。 mapStateToProps方法是講state轉成props傳給UI元件,mapDIspatchToProps是UI元件引數到store.dispatch的對映,就是接收UI元件傳入的action,最後的Counter就是UI元件。

5.最後是store的生成場所。

import React from 'react';
import ReactDOM from 'react-dom';
import {Provider} from 'react-redux'
import {createStore} from 'redux';
import reducer from './reducer/index';
import App from './container/App';
 
const store = createStore(reducer);
 
ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>,
    document.getElementById('app')
);

這邊createStore(reducer)將reducer傳入,這樣在action通過dispatch傳入store的時候會通過reducer處理action,從而生成相應的新的state,再讓UI元件重新渲染。

以上就是我第一個小demo,記錄我學習的腳步,有問題歡迎dalao們指出,請多關照