1.0.0 • Published 3 years ago

react-redux-creator v1.0.0

Weekly downloads
4
License
MIT
Repository
github
Last release
3 years ago

react-redux-creator

集成了react-router, react-redux, redux, redux-actions, redux-saga, seamless-immutable, connected-react-router, 简化了redux/异步处理和路由集成的配置工作,开箱即用

使用redux常常需要创建大量的常量字面量,手动创建actions, 以及相应的reducers进行数据处理,并且redux跟路由配置对复杂难懂的初始化工作。

react-redux-creator简化redux的使用流程,降低集成的难度,对于redux的创建,只提供了一个API即buildRedux完成并集成了异步数据请求。提供了Provider组件直接集成react-router。

  • buildRedux提供了创建reducer以及redux-saga的异步处理
  • Provider集成了create store以及react-router
  • connect方法简化了bindActionsCreator的使用
  • 自动合并sagas与reducers
  • fetch自定义

安装

yarn install react-redux-creator
# or
npm install react-redux-creator

API

仅4个API, 1个非必要API

  • config
  • Provider
  • connect
  • buildRedux
  • createStore(optional)

1. config(options)

初始化方法

optionstypedescription
fetchMethod(config) => Promiseconfig: { url: string, method: string, // optional, default "GET" data: object, // optional headers: object, // optional extract: object, // optional}全局fetch方法, 通常应用的请求有公共的处理方式,比如针对400等错误的处理,此处定义通用的网络请求fetch方法
loggerboolean默认"true", 是否开启redux-logger
catchErrorboolean默认"true", 是否自动加redux error log
history'browser', 'hash', 'memory'默认'browser'路由方式,详细见history
autoActionsboolean(optional)默认"true", 自动执行success, reset方法
middlewareArray(optional)redux中间件

example

import { config } from 'react-redux-creator'
import fetch from './utils/fetch'

config({
  fetchMethod: fetch, // 全局配置fetch
  history: 'browser', // 默认
  logger: true, // 开启redux-logger
  autoActions: true, // 是否开启saga自动success和错误的reset
})

2. Provider 组件

集成路由

propstypedescription
routesReact.Component | () => React.Component路由配置
initStateobject(optional)初始化state

example

ReactDOM.render(
  <Provider routes={routes} />, {/* 配置路由 */}
  document.getElementById('app'),
)

3. connect(mapStateToProps, mapActionsToProps)(component)

简化了mapActionsToProps, 自动合并了bindActionCreators的处理

argumentstypesdescription
mapStateToProps(state) => object同react-redux方法
mapActionsToPropsobject自动合并了bindActionCreators
componentReact.Component同react-redux方法

4. buildRedux(actionName, initState)(config)

返回 start(params), success(data), reset(), error() 方法以供调用

默认初始化数据

{
  loading: false, // 异步加载状态, start()方法后会变true
  success: false, // 异步成功状态, success()方法后变true
  error: false, // 错误状态,error()方法后变true
  params: null, // start(params)方法传入
  data: null, // success(data)方法传入
}

// initState可扩展初始化数据
argumentschildtyperequireddescription
actionName-stringYredux的action字面量以及存储在state的数据key
initStateobjectN初始化数据, 默认(挂载到state中)包括{ loading: false, error: false, success: false, params: null, data: null,}
configsaga异步请求
urlstring | function*(payload, callbackConfig) => stringNcallbackConfig 见下表
methodstringNPOST, GET, PUT, DELETE...
dataobject | function*(payload, callbackConfig) => objectNGET自动转为url search,其他方式则为放body的数据
headersobjectN请求headers (传给fetch方法)
extractobjectN请求扩展项 (传给fetch方法)
onResultfunction*(data, payload, callbackConfig) => objectN当fetch请求完(如果有url,fetch后,否则直接到该方法),数据处理后返回给saga,自动调用redux success方法回传到reducer 并最终合并到state下。如果方法没有数据,则默认使用原始的data。 callbackConfig 见下表
onAfterfunction*(data, payload, callbackConfig) => objectNonResult完成以后执行,在这里可以继续执行其他的异步方法或者发起其他action,callbackConfig 见下表
onErrorfunction*(err, payload, callbackConfig) => anyN错误异常处理,自动调用redux的reset方法也可以在这里手动执行error方法callbackConfig 见下表

url, data, onResult, onAfter, onError 都可接受function或者generator function, 如果有异步处理,请使用function* 配合yield call(function, ...arguments) 或者 yield put(action)使用

callbackConfig

paramtypedescription
putfunctionredux-saga的effect, 发起dispatch
callfunctionredux-saga的effect, 发起异步处理
getAction(actionName) => Action通过actionName获取action(start, success, error, reset)
getState(actionName) => State通过actionName获取state节点数据

5. createStore(initState)

  • 在taro等框架无法使用提供Provider,可以使用createStore方法来生成store, 集成在项目当中

使用

完整示例

index.jsx(entry)

import '@babel/polyfill'

import React from 'react'
import ReactDOM from 'react-dom'
import { Provider, config } from 'react-redux-creator'
import fetch from './utils/fetch'
import routes from './routes'

// 初始化react-redux-creator
config({
  fetchMethod: fetch, // 全局定义fetch请求方法
  logger: true, // 是否开启redux-logger
  history: 'browser', // 路由的history
})

ReactDOM.render(
  <Provider routes={routes} />, {/* 配置路由 */}
  document.getElementById('app'),
)

routes(src/routes/index.jsx)

import * as React from 'react'

import { Route, Switch } from 'react-router' 
import Home from '../pages/home'

const routes = () => {
  return (
    <Switch>
      <Route exact path="/" component={Home} />
    </Switch>
  )
}
export default routes

redux (src/pages/home/redux.js)

import { buildRedux } from 'react-redux-creator'
import { obj2params } from '../utils/objectHelper'

export const companyAddRedux = buildRedux('companyAdd')({
  onResult: (data, payload, config) => ({ ..handled data })
})

export const companyListRedux = buildRedux('companyList' )({
  url: function*(payload, config){
    const { page, limit } = payload
    const { getState } = config
    const state = yield getState('companyList') // e.g. { name: 1, ... }
    const params = obj2params(state.params)
    
    // 返回请求 '/api/company?page=1&page-size=10&name=1'
    return `/api/company?page=${page}&page-size=${limit}&${params}` 
  },
  onResult: function*(data, payload, config) {
    // 对网络请求后的数据进行添加额外extract属性
    return {
      ...data,
      extract: 'extractData'
    }
  },
  onAfter: function* (data, payload, config) {
    const { put, getAction } = config
    
    // 发起其他的action
    yield put(getAction('companyAdd').start()) 
  },
  onError: (err) => console.log('Error', err)
})

// 备注:url, data, onResult, onAfetr, onError 都可接受function或者generator function, 
//      如果有异步处理,请使用function* 配合yield call(function, ...arguments) 或者 yield put(action)使用

container (/src/pages/home/index.jsx)

import React from 'react'
import { connect } from 'react-redux-creator'
import { companyAddRedux, companyListRedux } from './redux'

class Home extends React.Component {
  componentDidMount() {
    this.props.actionList()
  }

  render() {
    return <div>Hello</div>
  }
}

export default connect(
  state => ({
    companyList: state.companyList,
  }),
  {
    actionList: (params) => companyListRedux.start(params),
    actionAdd: (params) => companyAddRedux.start(params),
  },
)(Home)
1.0.0

3 years ago

0.3.16

3 years ago

0.3.15

3 years ago

0.3.14

3 years ago

0.3.13

4 years ago

0.3.12

4 years ago

0.3.11

4 years ago

0.3.10

4 years ago

0.3.9

5 years ago

0.3.8

5 years ago

0.3.7

5 years ago

0.3.6

5 years ago

0.3.5

5 years ago

0.3.4

5 years ago

0.3.3

5 years ago

0.3.2

5 years ago

0.2.2

5 years ago

0.3.1

5 years ago

0.2.1

5 years ago

0.1.20

5 years ago

0.1.19

5 years ago

0.1.18

5 years ago

0.1.17

5 years ago

0.1.16

5 years ago

0.1.15

5 years ago

0.1.14

5 years ago

0.1.13

5 years ago

0.1.12

5 years ago

0.1.11

5 years ago

0.1.10

5 years ago

0.1.9

5 years ago

0.1.8

5 years ago

0.1.7

5 years ago

0.1.6

5 years ago

0.1.5

5 years ago

0.1.4

5 years ago

0.1.3

5 years ago

0.1.2

5 years ago

0.1.1

5 years ago

0.1.0

5 years ago

0.0.9

5 years ago

0.0.8

5 years ago

0.0.7

5 years ago

0.0.6

5 years ago

0.0.5

5 years ago

0.0.4

5 years ago

0.0.3

5 years ago

0.0.2

5 years ago

0.0.1

5 years ago