React.js程序员

Redux详解

2018-08-17  本文已影响27人  前端小兵

Redux是什么

什么场景使用Redux

Redux概念

Reduc使用

├── store/              # Redux全局状态管理仓库
        ├── index.js                # 生成store容器并导出的地方
        ├── state.js                # 全局数据存储state
        ├── actions.js              # 定义actions创建函数
        ├── action-types.js         # 定义action的type字符串常量
        ├── reducers.js             # reducer规则

state.js示例

//Redux全局初始状态
export default {
    cityName: '北京',//定位地址 默认北京
    userName: '',//用户名
    id:[],
}

action-types.js示例

//所有actions函数的`type`字符串常量
export const STORE_UPDATE = 'STORE_UPDATE';
export const STORE_ADD = 'STORE_ADD';
export const STORE_RM = 'STORE_RM';

actions.js示例

//定义`action`创建函数生成`action`对象
import * as actionTypes from './action-types.js'

export function update(data) {
    return {
        type: actionTypes.STORE_UPDATE,
        data
    }
}

export function add(item) {
    return {
        type: actionTypes.STORE_ADD,
        data: item
    }
}

export function rm(item) {
    return {
        type: actionTypes.STORE_RM,
        data: item
    }
}

reducers.js示例

//定义Redux规则
import { combineReducers } from 'redux';
import * as actionTypes from './action-types.js';
import initialState from './state.js';

const userInfo = (state = initialState, action) => {
    switch (action.type) {
        case actionTypes.STORE_UPDATE:
            return action.data;
        case actionTypes.STORE_ADD:
            state.id.unshift(action.data.id);
            return state;
        case actionTypes.STORE_RM:
            state.id = state.id.filter(item => {
                if(item !== action.data.id) {
                    return state.id;
                }
            })
            return state;
        default:
            return state
    }
}

export default combineReducers({
    userInfo
})

index.js示例

//生成store容器

import { createStore } from 'redux';
import Reducers from './reducers';

export default function configureStore(initialState) {
    const store = createStore(Reducers,initialState,
        // 触发 redux-devtools
        window.devToolsExtension ? window.devToolsExtension() : undefined
    );
    return store;
}

在React框架中配合react-redux使用

App.js跟组件中

import React, { Component } from 'react';
import { Provider } from 'react-redux';
import RouteMap from './router/router.jsx';
import configureStore from './store/index.js';

import './style/reset.scss';
import './style/font.scss';
import './style/common.scss';

//创建Redux的store对象
const store = configureStore();

class App extends Component {
    render() {
        return (
            <Provider store={store}>
                <RouteMap></RouteMap>
            </Provider>
        );
    }
}
export default App;

React组件中引入和改变redux的状态

import React, {Component} from 'react';
import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import * as userInfoActionsFromOtherFile from "../../../../store/actions";

// 使用redux存储的状态
    loginCheck = () => {
        const id = this.props.id
        const userInfo = this.props.userInfo
        if (!userInfo.userName) {
            this.props.history.push({
                pathname:'/login',
                state: {
                    router: `/detail/${id}`
                }
            })
            return false
        }
        return true
    }

//改变redux状态
storeHandle = () => {
        // 验证登录,未登录则return
        const loginFlag = this.loginCheck()
        if (!loginFlag) {
            return
        }

        const id = this.props.id
        const userInfoActions = this.props.userInfoActions
        if (this.state.isStore) {
            // 已经被收藏了,则取消收藏
            userInfoActions.rm({id: id})
        } else {
            // 未收藏,则添加到收藏中
            userInfoActions.add({id: id})
        }
        // 修改状态
        this.setState({
            isStore: !this.state.isStore
        })
    }

// -------------------redux react 绑定--------------------
function mapStateTopProps(state) {
    return {
        userInfo: state.userInfo,
    };
}
function mapDispatchToProps(dispatch) {
    return {
        userInfoActions: bindActionCreators(userInfoActionsFromOtherFile, dispatch)
    }
}

export default connect(
    mapStateTopProps,
    mapDispatchToProps
)(Buy);
上一篇下一篇

猜你喜欢

热点阅读