如何在Redux中更新状态后触发回调?

Bri*_*ang 59 javascript reactjs redux

在React中,状态不会立即更新,因此我们可以使用回调setState(state, callback).但是如何在Redux中做到这一点?

在调用之后this.props.dispatch(updateState(key, value)),我需要立即对更新后的状态做一些事情.

有什么方法可以用最新状态调用回调,就像我在React中做的那样?

Kok*_*lav 82

组件应该更新以接收新的道具.

有办法实现你的目标:

1. componentDidUpdate检查值是否已更改,然后执行某些操作..

 componentDidUpdate(prevProps){
     if(prevProps.value !== this.props.value){ alert(prevProps.value) }
  }
Run Code Online (Sandbox Code Playgroud)

2. redux-promise(中间件将分发承诺的已解决值)

export const updateState = (key, value)=>
Promise.resolve({
  type:'UPDATE_STATE',
  key, value
})
Run Code Online (Sandbox Code Playgroud)

然后在组件中

this.props.dispatch(updateState(key, value)).then(()=>{
   alert(this.props.value)
})
Run Code Online (Sandbox Code Playgroud)

2. redux-thunk

export const updateState = (key, value) => dispatch => {
  dispatch({
    type: 'UPDATE_STATE',
    key,
    value,
  });
  return Promise.resolve();
};
Run Code Online (Sandbox Code Playgroud)

然后在组件中

this.props.dispatch(updateState(key, value)).then(()=>{
   alert(this.props.value)
})
Run Code Online (Sandbox Code Playgroud)

  • 在你的`redux-thunk`例子中,你使用`dispatch`就好像它是同步的一样.是这样的吗? (5认同)
  • @DrazenBjelovuk我想知道,因为在redux-thunk示例中的updateState函数具有dispatch(someAction)并立即返回Promise.resolve()。承诺会立即解决,我想这会在redux存储更新和组件中的.then之间创建竞争条件。因为dispatch不会返回promise或接受回调,所以我认为这不是知道何时redux存储已更新的准确方法。我认为在这种情况下,正义的答案是正确的 (3认同)
  • @DannyHarding`dispatch`不同步。没有`Promise.resolve()`,`this.props.value`仍会返回旧值。仍然需要某种异步延迟(例如,在`setTimeout`中进行引用也可以)。 (2认同)
  • @DannyHarding是的,我同意这种方法可能不能肯定地保证火势,只是说明调度不是同步的。 (2认同)

Yai*_*wil 24

使用钩子 API:

useEffect 以道具作为输入。

import React, { useEffect} from 'react'
import { useSelector } from 'react-redux'

export default function ValueComponent() {
   const value = useSelector(store => store.pathTo.value)

   useEffect(() => {
     console.log('New value', value) 
     return () => {
        console.log('Prev value', value) 
     }

   }, [value])

   return <div> {value} </div>
}
Run Code Online (Sandbox Code Playgroud)

  • 不一定。如果您想在单击按钮时触发具有更新的商店数据的函数,但又不想每次特定数据发生更改时都触发该函数,该怎么办? (4认同)
  • 接受的答案是在 React Hooks 之前写的。在引入钩子之后,这应该是现在公认的答案。这是一种更加反应式的处理变化的方式。 (3认同)

jus*_*ris 9

关于React最重要的一点是单向数据流.在您的示例中,这意味着,调度操作和状态更改处理应该是分离的.

你不应该这样想:"我做了A,现在X变成Y我处理它",而是"我该怎么办的时候X变成Y"无任何关系A.存储状态可以从多个来源更新,除了您的组件,Time Travel还可以更改状态,它不会通过您的A发送点传递.

基本上这意味着你应该使用componentWillReceiveProps@Utro提出的建议


Pra*_*avi 5

您可以使用subscribe侦听器,它会在分派动作时被调用。在侦听器内,您将获得最新的商店数据。

http://redux.js.org/docs/api/Store.html#subscribelistener

  • `subscribe` 仅在分派操作时触发。如果您的 API 调用返回了任何数据,`subscribe` 不可能让您知道..我想!:D (2认同)