react-redux的使用

react-redux的使用

代码:github-learn-react

分别存放action和reducer

如postReducer

export const postReducer = function (state: any = { list: [{ title: 'hellow', id: -1 }] }, action: any) {
  switch (action.type) {
    case 'LOAD_POSTS':
      return {
        ...state, list: action.payload
      }
    case 'CLEAR_POSTS':
      return {
        ...state, list: action.payload
      }
  }

  return state;
}

post的action

import axios from 'axios';
export const loadPostsAction = (dispatch: any) => {
    axios.get('https://jsonplaceholder.typicode.com/posts').then((res: any) => {
        dispatch({
            type: 'LOAD_POSTS',
            payload: res.data
        });
    });
}
export const clearPostList = (dispatch: any) => {
    dispatch({
        type: 'CLEAR_POSTS',
        payload: []
    })
}

创建store并合并一些中间键

import { createStore, compose, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import {RootReducer }  from './reducers/root.reducer';
export const store = createStore(
    RootReducer,
    compose(
        applyMiddleware(...[thunk]),
        (window as any).__REDUX_DEVTOOLS_EXTENSION__ && (window as any).__REDUX_DEVTOOLS_EXTENSION__(),
    )
);

用到了异步所以加了thunk
(window as any).REDUX_DEVTOOLS_EXTENSION && (window as any).REDUX_DEVTOOLS_EXTENSION(),
)这个添加浏览器插件reduxDevtools

通过react-redux把redux和react结合

import React from 'react';
import ReactDOM from 'react-dom';
import './index.scss';
import App from './App';
import * as serviceWorker from './serviceWorker';
import { store } from './store';
import { Provider } from 'react-redux';
ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>
    , document.getElementById('root')
);
serviceWorker.unregister();

在组件中使用

import React from 'react';
import { connect } from 'react-redux';
import { loadPostsAction, clearPostList } from '../store/actions/post.action';
class PostListComponentsd extends React.Component<any, any> {
    componentDidMount() {
        this.props.load()
    }
    render() {
        const { list } = this.props.post;
        let post = list.map((item: any) => {
            return (<li key={item.id}>{item.title}</li>)
        });
        return (
            <div>
                <div>
                    <button onClick={this.props.clear}>清除</button>
                    <button onClick={this.props.load}>加载</button>
                </div>
                <ul>
                    {post}
                </ul>
            </div>
        ) 
    }
};
const mapStateToProps = (state: any, ownProps: any) => {
    console.log(state)
    return {
        post: state.post
    }
};
const mapDispatchToProps = (dispatch: any, ownProps: any) => {
    return {
        clear: () => dispatch(clearPostList),
        load: () => dispatch(loadPostsAction)
    }
}
const mergeProps = (...param: any) => {
    return Object.assign({}, ...param);
}
export const PostListComponents = connect(mapStateToProps, mapDispatchToProps, mergeProps)(PostListComponentsd);

connect的定义

    function connect(
        mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
        mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
        mergeProps?: MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps>,
        options?: Options<State, TStateProps, TOwnProps, TMergedProps>        
    ){}

mapStateToProps: 作用是将组件内部的state和组件的props合并,但是其实这个state就是store的数据,可能是做一些简化处理
mapDispatchToProps: 将dispatch的操作合并到props中
mergeProps:可选参数控制如何合并 const mergeProps = (…param: any) => {
return Object.assign({}, …param);
}直接合并,和输这个参数的结果一样
options:不详

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值