redux学习
流程
store分发(dispatch)> action(有type表示将要执行的动作)> reducer纯函数,接受先前的state和action,返回新的state(switch(action.type)case根据type类型执行不同操作,进而改变state)
action
cart-actions.js
export const ADD_TO_CART = 'ADD_TO_CART';
export const UPDATE_CART = 'UPDATE_CART';
export const DELETE_FROM_CART = 'DELETE_FROM_CART';
export function addToCart(product,quantity,unitCost){
return{
type:ADD_TO_CART,
payload:{
product,
quantity,
unitCost
}
}
}
export function updateCart(product,quantity,unitCost){
return{
type:UPDATE_CART,
payload:{
product,
quantity,
unitCost
}
}
}
export function deleteFromCart(product){
return{
type:DELETE_FROM_CART,
payload:{
product
}
}
}
reducer
- 不要修改state
- 在default的情况下返回旧的state
cart-reducer.js
import { ADD_TO_CART,UPDATE_CART,DELETE_FROM_CART } from '../actions/cart-actions'
const initialState = {
cart:[
{
product:'bread 700g',
quantity:2,
unitCost:90
},
{
product:'milk 500ml',
quantity:1,
unitCost:47
}
]
}
export default function(state=initialState,action){
switch(action.type){
case ADD_TO_CART:{
return{
...state,
cart:[...state.cart,action.payload]
}
}
case UPDATE_CART:{
return{
...state,
cart:state.cart.map(item =>
item.product === action.payload.product?action.payload:item
)
}
}
case DELETE_FROM_CART:{
return{
...state,
cart:state.cart.filter(item =>
item.product !== action.payload.product
)
}
}
default:
return state;
}
}
products-reducer.js
export default function(state=[],action){
return state
}
index.js
import { combineReducers } from 'redux';
import productsReducer from './products-reducer';
import cartReducer from './cart-reducer';
const allReducers = {
products:productsReducer,
shoppingCart:cartReducer
}
const rootReducer = combineReducers(allReducers);
export default rootReducer
store.js
store.js
import { createStore } from 'redux'
import rootReducer from './reducers'
let store = createStore(rootReducer)
export default store
index.js
import store from './store.js'
import { addToCart,updateCart,deleteFromCart } from './actions/cart-actions'
//const productsReducer = function(state=[],action){
// return state
//}
//
//const initialState = {
// cart:[
// {
// product:'bread 700g',
// quantity:2,
// unitCost:90
// },
// {
// product:'milk 500ml',
// quantity:1,
// unitCost:47
// }
// ]
//}
//
//const ADD_TO_CART = 'ADD_TO_CART';
////reducer
//const cartReducer = function(state=initialState,action){
// switch(action.type){
// case ADD_TO_CART:{
// return{
// ...state,
// cart:[...state.cart,action.payload]
// }
// }
// default:
// return state;
// }
//
//}
////action
//function addToCart(product,quantity,unitCost){
// return{
// type:ADD_TO_CART,
// payload:{
// product,
// quantity,
// unitCost
// }
// }
//}
//
//
//
//const allReducers = {
// products:productsReducer,
// shoppingCart:cartReducer
//}
//
//const rootReducer = combineReducers(allReducers);
//
//let store = createStore(rootReducer);
console.log("initial state:",store.getState());
let unsubscribe = store.subscribe(() =>
console.log(store.getState())
);
//ADD_TO_CART
store.dispatch(addToCart('Coffee 500mg',1,250));
store.dispatch(addToCart('Flour 1kg',2,110));
store.dispatch(addToCart('Juice 2L',1,250));
//UPDATE_CART
store.dispatch(updateCart('Juice 2L',3,270));
//DELETE_FROM_CART
store.dispatch(deleteFromCart('Flour 1kg'));
unsubscribe();
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。