bindActionCreators、combineReducers 和 中间件

bindActionCreators

import * as listActions from './action/actiosCreator'
class App extends React.Component {
  render() {
    const {listActions : {addUserItem, removeUserItem}} = this.props
    return (
      <div>
        <ul>
          {this.props.list.map((item, index) => (
            <li style={{ background: 'pink', marginTop: '10px' }} key={index} onClick={() => { removeUserItem(index) }}>
              <span>{item.name}</span> ----------- <span>{item.age}</span>
            </li>
          ))}
          <button onClick={() => addUserItem({name: 'meow', age: 85})}>添加</button>
        </ul>
      </div>
    )
  }
}
const mapDispatchToProps = (dispatch) => {
  return {
    listActions : bindActionCreators(listActions , dispatch)
  }
}
// 如果想传入单个 action 
// export default connect(mapStateToProps, {addUserItem: listActions .addUserItem })(App);
export default connect(mapStateToProps, mapDispatchToProps)(App);

combineReducers

import {user} from './reducerUser'
import {combineReducers} from 'redux'
const rootReducer = combineReducers({
    user
})
export default rootReducer
const mapStateToProps = (state) => {
  return {
    list: state.user
  }
}

中间件

import { createStore, applyMiddleware, compose } from 'redux';
import rootReducer from './reducer'
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

// ES 5
const logger = function (store) {
  return function(next){
    return function(action) {
      console.log('dispatch', action)
      let result = next(action)
      console.log('state', store.getState())
      return result
    }
  }
}
// ES 6
const logger = store => next => action => {
  console.log('dispatch', action)
  let result = next(action)
  console.log('state', store.getState())
  return result
}
const store = createStore(rootReducer, composeEnhancers(
    applyMiddleware(logger)
  ));
export default store

redux-thunk

普通 action

export const addUserItem = (data) => {
  return {
    type: ADD_ITEM,
    data
  }
}

异步 action

export const delayAddUserItem = (data) => {
 return (dispatch, getState) => {
     setTimeout(() => {
       dispatch(delayAddUserItem)
    }, 1000)
     return /**这里的返回值页面可以获取到**/
   }
}

redux-thunk 核心代码

const thunk = ({ dispatch, getState }) => next => action => {
  if (typeof action === 'function') {
    return action(dispatch, getState);
  }
  return next(action);
};

redux-saga

新建 saga.js

import {delay, put, call, takeEvery, all } from 'redux-saga/effects';
import {ADD_ITEM, REMOVE_ITEM} from './action/actionTypes';
import {addUserItem, removeUserItem} from './action/actiosCreator'
const callback = (msg) => {
  console.log(msg);
};
export function* delayChangeBtnText(action) {
  console.log(action) // 触发的 action {type: 'ADD_ITEM'}
  yield delay(1000); // 延迟 1s
  const json = yield fetch('http://localhost:3000/api')
  const res = yield json.json()
  //  dispatch
  yield put(removeUserItem(res.index));
  // call(回调, 参数)
  yield call(callback, 'complete');
}
 function * watchGetHeader() { // 监听器
  yield takeEvery(ADD_ITEM, delayChangeBtnText) // 当执行 ADD_ITEM 的 action 的时候, 触发这个回调
}
export default function* rootSage() {   // 整合多个 监听器
  yield all([
    watchGetHeader()
  ])
}
import createSagaMiddleware from 'redux-saga';
import rootSage from './sagas';
const store = createStore(rootReducer, composeEnhancers(
  applyMiddleware(sagaMiddleware)
));
sagaMiddleware.run(rootSage);

redux-saga 更像是一种 action 之后的副作用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。