

创建react
npm i create-react-app -g
create-react-app react-redux-demo
添加react-redux
npm i redux --save
npm i react-redux --save
工程目录结构:

// demo-react-redux/src/redux/actions/countAction.js
export const Add = {
type:'add'
}
export const Sub = {
type:'sub'
}
// demo-react-redux/src/redux/reducers/counter.js
const initialState = {
count: 0,
}
export default function counterReducer(state = initialState, action) {
switch (action.type) {
case 'add': return Object.assign({}, state, {
count: state.count + 1
});
case 'sub': return Object.assign({}, state, {
count: state.count - 1
});
default: return state;
}
}
// demo-react-redux/src/redux/reducers/index.js
import { combineReducers } from 'redux' // 原生api
import counter from './counter' // 自定义reducer
const reducers = combineReducers({
counter
})
export default reducers
// demo-react-redux/src/containers/index1.count.js
import { connect } from 'react-redux'
import {Add,Sub} from "../redux/actions/countAction";
import counter from '../pages/counter' // 展示组件
const mapStateToProps = state => {
return {
count: state.counter.count,
}
}
const mapDispatchToProps = dispatch => {
return {
countAdd: (count) => {
dispatch(Add) // dispatch 触发 action
},
countSub: (count)=> {
dispatch(Sub)
}
}
}
/**
* connect作用
* 1. 组件counter通过mapStateToProps,使用props.count读取state的值
* 2. 组件counter通过mapDispatchToProps,使用props.countAdd()/props.countSub()修改state值
*/
const App = connect(
mapStateToProps,
mapDispatchToProps
)(counter)
export default App;
// demo-react-redux/src/pages/counter.jsx
export default function Counter(props){
return (
<div style={{textAlign: 'center'}}>
<p>count: {props.count}</p>
<p>
<button onClick={props.countAdd}>+</button>
<button onClick={props.countSub}>-</button>
</p>
</div>
)
}
// react-reudx
import { Provider } from 'react-redux'
import { createStore } from 'redux'
import reducers from './redux/reducers'
// demo:counter
import App from './containers/index1.count';
const store = createStore(reducers)
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>
, document.getElementById('root')
);
启动: npm run start

export default function Counter(){
// 获取state: 相当于 mapStateToProps
const count = useSelector(state => state.counter.count);
// 修改state: 相当于 mapDispatchToProps
const dispatch = useDispatch();
return (
<div style={{textAlign: 'center'}}>
<h1>CounterExpand: {count}</h1>
<p>
<button onClick={()=>{dispatch(Add)}}>+</button>
<button onClick={()=>{dispatch(Sub)}}>-</button>
</p>
</div>
)
}
数据类型更复杂的例子 {id, label, value}
// demo:message 对象包含id,lable,value等属性
// import App from './containers/index2.message';
// demo:message + useselect + usedispatch
import App from './pages/MessageExpand';
chrome插件工具
https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd
步骤:
// 之前
const store = createStore(reducers)
// 现在
const store = createStore(
reducers, /* preloadedState, */
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);


相当于简化版的 connect ,优点
// useSelector 例子
// 语法:const result : any = useSelector(selector : Function, equalityFn? : Function)
import { useSelector } from 'react-redux'
const counter = useSelector(state => state.counter)
// useDispatch 例子
import { useDispatch } from 'react-redux'
const dispatch = useDispatch();
<button onClick={() => dispatch({ type: 'increment-counter' })}>
Increment counter
</button>
深入了解 useSelector
useDispatch注意(待验证)
// 使用 useCallback
const incrementCounter = useCallback(
() => dispatch({ type: 'increment-counter' }),
[dispatch]
)
// 传给子组件
<MyIncrementButton onIncrement={incrementCounter} />
语法:
connect([mapStateToProps], [mapDispatchToProps],[mergeProps], [options])(cmp)功能:
mapStateToProps
mapDispatchToProps
个人理解:组件写state数据
是什么?
功能:
原理:
是什么?
使用
api
createStore(reducer, [initialState])
本质:object类型,type属性是必须,表示 Action名称,相当于指令
功能:View发出dispatch =》 自动触发对应reducer =》 State发生变化 =》 view重新变化
store.dispatch({
type: 'ADD_TODO',
payload: 'Learn Redux'
});
个人理解:接收action.type和旧的state,根据需求计算新的state
本质:纯函数,计算State的过程,只要是同样的输入,必定得到同样的输出
combineReducers
Store对象包含所有数据。
当前 State,可通过store.getState()拿到。
const state = store.getState();
