美文网首页
react-redux 使用记录

react-redux 使用记录

作者: 弱冠而不立 | 来源:发表于2020-11-04 16:55 被阅读0次

    安装依赖

    npm i redux react-redux
    

    创建 action 文件

    action 对象

    action 本质是一个 JS 对象,是 store 数据的唯一来源,一般通过 store.dispatch() 将 action 传递到 store,action 对象示例:

    {
      type: "OPTION_STATE",
      data: actionData
    }
    

    官方约定 action 必须有一个字符串类型的 type 属性,来表示将要执行的动作。项目较大时,也可以分模块存放 action。官方建议要减少在action中传递数据,例如数组有一项数据,可以只传 idx 下标,然后再检索,比传整个 item 对象过去要好。

    action 创建函数

    以上面的 action 对象为例,

    function optionState() {
      return {
          type: "OPTION_STATE",
          data: actionData
      }
    }
    

    其实就是将 action对象在函数中返回
    一个 action.js 示例:

    export const addTask = (id, value) => {
        return {
            type: "ADD_TASK",
            id,
            value,
            finished: false
        }
    }
    
    export const deleteTask = (id) => {
        return {
            type: "DELETE_TASK",
            id
        }
    }
    
    export const clearList = () => {
        return {
            type: "CLEAR_LIST"
        }
    }
    
    export const changeFinished = (id, finished) => {
        return {
            type: "CHANGE_FINISHED",
            id,
            finished
        }
    }
    

    创建 reducer 文件示例

    reducer 文件返回一个函数,函数接收两个参数,第一个参数是 state 可以指定初始值,代表的是 store 里的某个 state,例如商城App,store里可以有购物车的state,可以有商品列表的state; 第二个参数是action,
    接收一个 action 对象,根据action对象的 type 属性来操作当前reducer文件的state(可以通过 combineReducers 合并多个 reducer)

    //  reducers/product 示例
    const product = (state={},action) => {
        switch(action.type) {
            case "GET_PRODUCT":
                return action.product
            default:
                return state
        }
    }
    
    export default product
    
    //  reducers/cart示例
    const defaultState = {}
    const cart = (state=defaultState, action) => {
        switch(action.type) {
            case "ADD_PRODUCT_TO_CART":
                return {
                }
            case "CLEAR_CART":
                return defaultState
            case "CHANGE_CARTITEMCOUNT":
                return {
                }
            case "DELETE_CARTITEM"
                return {
                }
            default:
                return state
        }
    }
    export default cart
    
    //  reducers/index.js 合并多个reducer
    import { combineReducers } from 'redux'
    import product from "./product"
    import cart from "./cart"
    const ShoppingApp = combineReducers({
        product,
        cart,
    })
    export default ShoppingApp
    

    创建 store

    // store.js 文件夹示例
    import reducer from "../reducers"
    import {createStore} from "redux"
    const store = createStore(reducer)
    export default store
    

    在react 主入口文件下通过 Provider 注册 store

    // react 主入口文件 index.js 示例
    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import { Provider } from "react-redux"
    import store from "./store"
    
    ReactDOM.render(
        <Provider store={store}>
            <App />
        </Provider> ,
        document.getElementById('root')
    );
    

    在子组件中将 state 和 dispatch 映射到 props

    通过 mapStateToProps 和 mapDispatchToProps 函数(其实函数名可以自己随便打,因为最后是通过 connect 函数和组件进行关联)将 state 和 dispatch 映射到 props。
    mapStateToProps 函数中返回一个对象,对象属性名就是自己要在props中用的名字,而对象值,就是state 里的值。
    mapDispatchToProps 函数中返回一个对象,对象里存放的是将在props中使用的方法,可以进行一系列逻辑处理,逻辑处理完后调用 dispatch 方法,dispatch 方法中传入的是action对象或创建action函数(实际上创建action函数返回的就是一个action对象)

    注:通过 combineReducers 合并state后,combineReducers 中各个 state 的名称,就是后面在组件中state调用赋值给 props的依据。

    // components/Cart 组件下
    import React from "react"
    import "./index.css"
    import { connect } from "react-redux"
    import { changeCartItemCount, clearCart, deleteCartItem, setPromotionValue } from "../../action"
    
    const Cart = ({ cart, countAll, costAll,handleCount, handleDelete, clearCart }) => {
        return ()
    }
    
    const mapStateToProps = (state) => {
        return {
            cart: state.cart.productList,
            countAll: state.cart.countAll,
            costAll: state.cart.costAll,
        }
    }
    
    const mapDispatchToProps = (dispatch) => {
        return {
            handleCount: (num, idx, count) => {
                if(count < 0 && num === 1) {
                    return
                } else {
                    dispatch(changeCartItemCount(idx, count))
                }
            },
            handleDelete: (idx) => {
                dispatch(deleteCartItem(idx))
            },
            clearCart: () => {
                dispatch(clearCart())
            }
        }
    }
    
    export default connect(mapStateToProps, mapDispatchToProps)(Cart)
    

    另外:mapStateToProps, mapDispatchToProps 都有第二个参数:ownProps 该参数的具体值是父组件传递给子组件的 props


    出错记录:

    1. If you want to use mapDispatchToProps without a mapStateToProps just use null for the first argument.
      export default connect(null, mapDispatchToProps)(Component)

    相关文章

      网友评论

          本文标题:react-redux 使用记录

          本文链接:https://www.haomeiwen.com/subject/qcqsvktx.html