react

https://segmentfault.com/a/1190000015684895

app.js
	App = () => { return xxx; } // 无状态组件或UI组件
	mapStateToProps(state){ return {属性名:属性值} } // 告诉UI组件的输入参数有哪些
	mapDispatchToProps(dispatch){ return {函数名:函数体} } // 告诉UI组件产生的事件如何派发、输出
	export default connect(mapStateToProps, mapDispatchToProps)(App); // 聪明组件
其中mapDispatchToProps支持返回函数或对象的形式:
const mapDispatchToProps = (
  dispatch,
  ownProps // 可选的第2个参数,代表容器组件的props对象
) => {
  return {
    onClick: () => {
      dispatch({
        type: 'SET_VISIBILITY_FILTER',
        filter: ownProps.filter
      }); // 这里的action一般调用actioncreater的函数得到,如果用到了redux-thunk中间件的话action还可以是一个函数
    }
  };
}
const mapDispatchToProps = {
  onClick: (filter) => {
    type: 'SET_VISIBILITY_FILTER',
    filter: filter
  };
}


actioncreater.js
	export function addTodo(text) {
	  return {
		type: 'ADD_TODO',
		value: text
	  }
	},
	export function getServerData(url) {
	  return (dispatch) => { // 还有可选的第2个参数 ownProps,即容器组件的props对象
		var data = axios.get(url).then(
			dispatch({具体的action});
		).error{
			xxx
		}
	  }
	}

actionTypes.js
                       export const XXX="XXX";
                       export const YYY="YYY";

reducer.js
	export default(state=初始状态, action) => {
		switch(action.type){
			case xxx:
				const newState={...state, {属性名: 新属性值}}
				return newState;
			default:
				return state;
		}
	}
Reducer 是 pure function,不要调用不纯的api,例如 Data.now() Math.random()
可拆开成多个小的reducer:
	function someReducer(state = {}, action) {
	  return {
		a: reducerA(state.a, action),
		b: reducerB(state.b, action)
	  };
	}
Redux 提供了一个工具函数 combineReducers 来简化这种 reducer 合并:
	import { combineReducers } from 'redux';
	const someReducer = combineReducers({
	  a: reducerA,
	  b: reducerB
	});

如果State 的属性名必须与子 Reducer 同名可以简写为:
      import { combineReducers } from 'redux';
      const chatReducer = combineReducers({
        reducerA,
        reducerB,
      })


index.js
import { Provider } from 'react-redux'
import { createStore } from 'redux'
import someReducer from './reducers'
import App from './components/App'

//连接action和reducer:在create时传入reducer,告诉store怎么应对各个action
let store = createStore(someReducer); // 可以在第2个形参处额外指定一个初始 State
render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
)
上面代码中,Provider在根组件外面包了一层,这样一来,App的所有子组件就默认都可以拿到state了。

 

原文地址:https://www.cnblogs.com/ccdat/p/10816091.html