代码之家  ›  专栏  ›  技术社区  ›  Alex Mckay

react/redux:store未在从单个onclick事件调用的操作之间更新

  •  0
  • Alex Mckay  · 技术社区  · 6 年前

    目标

    单击 next 按钮并向redux存储区发送两个操作:

    1. 首先,更新 skipAmount 价值。
    2. 然后使用更新的 滑雪板 要生成的值 apiQuery (用于向服务器发出请求的字符串)。

    问题

    这个 滑雪板 在操作1和2之间未更新值

    例子

    我已经创建了一个代码沙盒,可以清楚地演示我遇到的问题。请注意 滑雪板 价值是 100 (或单击事件)在 阿皮奎尔 . https://codesandbox.io/s/o2vvpwqo9

    代码

    索引.js

    import React from "react";
    import ReactDOM from "react-dom";
    import { Provider } from "react-redux";
    import { createStore } from "redux";
    
    import App from "./App";
    import reducer from "./reducer";
    
    const store = createStore(reducer);
    
    ReactDOM.render(
      <Provider store={store}>
        <App />
      </Provider>,
      document.getElementById("root")
    );
    

    App.JS

    import React from 'react';
    import { connect } from 'react-redux';
    
    const mapStateToProps = state => ({
      ...state,
    });
    
    const queryGenerator = props => `www.apiExample.com?skipAmount=${props.skipAmount}`;
    
    const ConnectedApp = props => (
      <div className="App">
        <button
          onClick={() => {
            props.dispatch({ type: 'SET_SKIP_AMOUNT_PLUS_100' });
            props.dispatch({ type: 'SET_API_QUERY', payload: queryGenerator(props) });
          }
          }
        >
          Next
        </button>
        <p>Skip amount on redux: {props.skipAmount}</p>
        <p>Query being generated: {props.apiQuery}</p>
      </div>
    );
    
    export default connect(mapStateToProps)(ConnectedApp);
    

    异径管JS

    const reducerDefaultState = {
      skipAmount: 0,
      apiQuery: 'www.apiExample.com',
    };
    
    export default (state = reducerDefaultState, action) => {
      switch (action.type) {
        case 'SET_SKIP_AMOUNT_PLUS_100':
          return {
            ...state,
            skipAmount: state.skipAmount + 100,
          };
        case 'SET_API_QUERY':
          return {
            ...state,
            apiQuery: action.payload,
    
          };
        default:
          return state;
      }
    };
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Jakob Göran Thomasson    6 年前

    App.JS queryGenerator(props) 你正在传递来自 onClick .

    道具不会改变 SET_SKIP_AMOUNT_PLUS_100 直到重新提交。

    onClick={() => {
            props.dispatch({ type: 'SET_SKIP_AMOUNT_PLUS_100' });
            props.dispatch({ type: 'SET_API_QUERY', payload: queryGenerator(props) });
          }
    

    'SET_SKIP_AMOUNT_PLUS_100' 您正在更改redux状态。(不是组件中的当前道具)

    而在 'SET_API_QUERY' 您正在使用组件道具(不是redux中的道具),因为道具尚未更新。