如何将 redux-thunk action creator 变成 Promise?

乔治·韦尔德

我有以下异步动作创建者(使用 redux-thunk):

export const nextPupil = () => {
    return (dispatch, getState) => {
    const {activeSentence, sentencesList} = getState();
    //... some more code
    const nextActive = pupilList[nextIndex];

    dispatch({ type: "UPDATE_ACTIVE", payload: nextActive });
  }
};

但是,我需要此操作来返回承诺,因为我需要在我的一个组件中等待它完成,然后再执行其他操作(有关我的问题的更详细描述,请参阅问题)

我怎么能把这个动作变成一个承诺并仍然使用 redux-thunk?非常感谢。

编辑:

我知道我试图在我的组件中本地保存输入字段的状态,即不在 Redux 中。这是因为如果我将输入字段的值直接绑定到 redux 存储,它将不再可编辑。但是,我希望用户能够编辑输入字段,然后在提交时将编辑后的值保存在我的 redux 存储中。如果我直接绑定东西,用户将无法更改值/编辑。

亚历克斯·杨

我认为您误解了通过 redux 的数据流。我假设当您想将操作转换为承诺时,您会希望在 redux 状态更新后解决该承诺 - 从您的另一个问题来看,情况似乎就是这样。这通常不是 redux 的设计方式。

当你 dispatch 一个 action 时,store 会更新,然后你的组件中来自 store 的 props 会更新。您需要做的就是在您的组件中使用这些 props,并且每当 props 更新时,您的组件也会更新。

在您最初的问题中,您的代码是:

onSubmit(e) {
  e.preventDefault();
  this.props.nextSentence(); //this is async

  this.setState({ //this is not yet updating with the right values then
      inputField: this.props.activePupil.name
  });
}

您遇到的问题是它activePupil是您的 redux 存储的一部分,但您也试图将它存储在组件的状态中。这是一个坏主意,因为您的状态不再有单一的事实来源。

更好的方法是this.props.activePupil在需要的地方使用,例如

 render() {
     return (
        <span>{this.props.activePupil.name}</span>
     );
 }

现在,当您调度操作时,一旦 store 更新,您的组件也将更新。如果您需要,那么您可以loading向您的商店添加一个属性,以便您可以向用户指示正在发生的事情,并在执行任何异步工作之前从您的 thunk 中分派它,然后loadingUPDATE_ACTIVE分派恢复

export const nextPupil = () => {
    return (dispatch, getState) => {
      dispatch({ type: "PUPIL_UPDATING });
      const {activeSentence, sentencesList} = getState();
      //... some more code
      const nextActive = pupilList[nextIndex];

      dispatch({ type: "UPDATE_ACTIVE", payload: nextActive });
  }
};

编辑 1

下面对解决您的问题的正确方法进行了一些思考,但我认为我已经确定了一种合理的方法来实现它,同时保持数据完整性。它确实涉及在您的商店中保留表单输入,这不是每个人都喜欢的,但对我来说不是问题。

无论如何......我们需要另一个reducer来处理用户输入 - 它会非常简单并响应两个动作 - 你已经拥有的“UPDATE_ACTIVE”动作和一个“NAME_UPDATED”动作:

const updatedName = (state = '', action) => {
  switch (action.type) {
    case 'UPDATE_ACTIVE':
        return action.payload.name;
    case: 'NAME_UPDATED':
        return action.payload.updatedName;
    default:
        return state;
  }
};

然后我们需要一个简单的动作创建器:

const inputChanged = updatedName => ({
     type: 'NAME_UPDATED',
     payload: { updatedName }
});

现在在我们的组件中,我们将使用新创建的状态和动作创建器来管理我们的输入(connect照常只输入它们)——这里缺少很多代码,但应该足以理解。

class Whatever extends React.Component {
    constructor() {
        super();
        this.handleChange= this.handleChange.bind(this);
    }

    handleChange(event) {
        this.props.inputChanged(event.target.value);
    }

    render() {
        return (
            <input type="text" value={this.props.updatedName} onChange={this.handleChange} />
        );
    }
}

我希望这是有道理的!

编辑2:

如果您想将输入存储在组件状态而不是 redux 存储中,那么我认为这种方法应该可行。它使用componentWillReceiveProps 生命周期钩子- 设置组件状态,即activePupilprop 更改时的输入值每次 props 更新时都会调用它,但也可能在没有任何 props 更改时调用,因此我们需要一些逻辑来决定是否更新updatedPupilNameprop。为了实现这一点,我们将当前的状态与状态进行比较props.activePupil.namenextProps.activePupil.name并且仅在它们不同时才更新状态。如果您的学生有 ID 类型的属性,这可能更适合进行比较。

class Whatever extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            updatedPupilName: props.activePupil.name
        };
        this.handleChange= this.handleChange.bind(this);
    }

    componentWillReceiveProps(nextProps) {
        if (nextProps.activePupil.name !== this.props.activePupil.name) {
            this.setState({
                updatedPupilName: nextProps.activePupil.name
            });
        }
    }

    handleChange(event) {
        this.setState({
            updatedPupilName: event.target.value
        });
    }

    render() {
        return (
            <input type="text" value={this.state.updatedPupilName} onChange={this.handleChange} />
        );
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Redux Thunk Action Creator没有被调用

来自分类Dev

Redux Thunk Action Creator没有被调用

来自分类Dev

Redux Thunk 如何实现

来自分类Dev

Bool如何从targetTargeted变成Action?

来自分类Dev

Bool如何从targetTargeted变成Action?

来自分类Dev

cb &&'function'=== typeof cb && cb(data)在带有redux-thunk的Action(React-redux)中如何工作?

来自分类Dev

redux thunk调度后从商店返回promise

来自分类Dev

ReactJS + Redux + Reduc-thunk无法调度promise

来自分类Dev

将Promise.all与React-Redux-Thunk一起使用的更好/正确的方法是什么?

来自分类Dev

REACT NATIVE REDUX 如何在action creator接收到的reducer中设置数组

来自分类Dev

使用Bluebird将Cordova插件变成Promise

来自分类Dev

使用Bluebird将Cordova插件变成Promise

来自分类Dev

我应如何将“ redux-thunk”用于异步初始状态?(反应/还原)

来自分类Dev

Redux派遣在Action Creator中不起作用

来自分类Dev

来自TypeScript的Redux Action Creator功能参数误报?

来自分类Dev

Redux Action Creator 有什么更好的方法:.then 或 async/await 语法?

来自分类常见问题

redux-thunk和redux-promise有什么区别?

来自分类Dev

如何在Redux Toolkit的createSlice中使用Redux-Thunk?

来自分类Dev

Redux/Thunk 中的递归函数返回 Promise 对象,而不是常规对象

来自分类Dev

派发Redux-Thunk

来自分类Dev

将组件反应到钩子,如何迁移由redux-thunk触发的redux动作?

来自分类Dev

与Axios api一起使用时,Redux-Thunk和Redux-Promise有什么区别?

来自分类Dev

如何在redux-thunk中使用axios / AJAX

来自分类Dev

如何使用Redux Thunk处理fetch()响应中的错误?

来自分类Dev

如何使用axios使用redux-thunk进行调度

来自分类Dev

如何通过redux-thunk中的fetching操作访问状态?

来自分类Dev

如何在React上正确使用redux-thunk?

来自分类Dev

如何使用 Jest Mock 模块测试 Redux Thunk 异步操作

来自分类Dev

tu如何将此功能转换为thunk react promise功能(已更新)

Related 相关文章

  1. 1

    Redux Thunk Action Creator没有被调用

  2. 2

    Redux Thunk Action Creator没有被调用

  3. 3

    Redux Thunk 如何实现

  4. 4

    Bool如何从targetTargeted变成Action?

  5. 5

    Bool如何从targetTargeted变成Action?

  6. 6

    cb &&'function'=== typeof cb && cb(data)在带有redux-thunk的Action(React-redux)中如何工作?

  7. 7

    redux thunk调度后从商店返回promise

  8. 8

    ReactJS + Redux + Reduc-thunk无法调度promise

  9. 9

    将Promise.all与React-Redux-Thunk一起使用的更好/正确的方法是什么?

  10. 10

    REACT NATIVE REDUX 如何在action creator接收到的reducer中设置数组

  11. 11

    使用Bluebird将Cordova插件变成Promise

  12. 12

    使用Bluebird将Cordova插件变成Promise

  13. 13

    我应如何将“ redux-thunk”用于异步初始状态?(反应/还原)

  14. 14

    Redux派遣在Action Creator中不起作用

  15. 15

    来自TypeScript的Redux Action Creator功能参数误报?

  16. 16

    Redux Action Creator 有什么更好的方法:.then 或 async/await 语法?

  17. 17

    redux-thunk和redux-promise有什么区别?

  18. 18

    如何在Redux Toolkit的createSlice中使用Redux-Thunk?

  19. 19

    Redux/Thunk 中的递归函数返回 Promise 对象,而不是常规对象

  20. 20

    派发Redux-Thunk

  21. 21

    将组件反应到钩子,如何迁移由redux-thunk触发的redux动作?

  22. 22

    与Axios api一起使用时,Redux-Thunk和Redux-Promise有什么区别?

  23. 23

    如何在redux-thunk中使用axios / AJAX

  24. 24

    如何使用Redux Thunk处理fetch()响应中的错误?

  25. 25

    如何使用axios使用redux-thunk进行调度

  26. 26

    如何通过redux-thunk中的fetching操作访问状态?

  27. 27

    如何在React上正确使用redux-thunk?

  28. 28

    如何使用 Jest Mock 模块测试 Redux Thunk 异步操作

  29. 29

    tu如何将此功能转换为thunk react promise功能(已更新)

热门标签

归档