0

Rudx-thunk 在调度异步操作方面做得很好,它最终会修改异步操作中获取的状态。但是我怎么知道它最终修改获取的 redux 状态的那一刻呢?

就我而言,我想从服务器读取配置,因为有些组件需要这些配置,所以我必须在获取配置后渲染整个应用程序。但到目前为止,我无法通过使用 redux-thunk 或任何其他 redux 异步中间件来解决问题。

更新 #1 显示一些代码来更好地表达自己。

// reducer
(state, action) => Object.assign({}, state, {config: action.config});

// action creator
const fetchConfig = () => (dispatch) => {
    fetch('http://server.com/...')
    .then(config=>dispatch({type: 'LOAD_CONFIG', config}))
}

// connect reducer to state
createStore({config: configReducer})

// render
import { render } from 'react-dom';
render (<App><News /></App>)

// some component consume state.config
@connect(state=>{config: state.config})
const News = props=>(
    <div>
        {(props.config === '...')? <div>...</div> : <div>...</div>}
    </div>
)

以上看起来不错,但是由于该操作可能需要时间并且在组件首次渲染后更新状态,因此组件可能会显示意外结果。我真正想做的是(我只是写下渲染部分,其他应该一样):

// render
loadConfigFinished
.then(()=> render((<App><News /></App>)))

或者

// render
on('loadConfigFinished', ()=> render((<App><News /></App>)));

可能,我应该做第二种方式,只是害怕它不是redux-y。

无论如何,上面只是一个示例,显示有时我们确实需要在某些操作最终分派到 redux 状态时得到通知。

4

3 回答 3

2

查看您的代码,我认为您的问题很简单:我何时渲染依赖于来自服务器的数据的组件,同时等待该数据,而不传递undefined到我的组件中?

我将有一个连接到配置状态的容器组件,并有条件地呈现需要它的组件,或者加载模板:

const Container = props => {
  if (props.config) {
    return <ConfiguredComponent config={props.config} />
  } else {
    return <Loading />
  }
}
于 2016-03-16T23:00:26.417 回答
0

当你的 reducer 处理 readConfigSuccess 操作时,它们会更新 redux 状态。

应用程序会重新渲染所有状态更改的更新道具,因此此特定操作没有什么特别之处。

除了通常只有一小部分状态发生变化并且重新渲染看起来很像以前的渲染,在这里我希望相对大部分的状态会被这个特定操作的减速器改变,并且重新渲染将渲染一个应用程序发生了很大变化。

不过,这不是你担心的,它应该只是工作。

或者你的意思是别的什么,你想通过检索配置来做更多的异步工作吗?

于 2016-03-16T07:21:08.677 回答
0
export function readConfig() {
  return (dispatch) => {
    dispatch(readingConfig());

    someAsyncFunction((error, result) => {
      if (!error) {
        dispatch(readConfigSuccess(result));
      } else {
        dispatch(readConfigFail(error));
      }
    });
  }
}

当然,readConfigSuccess,readConfigFailreadingConfig是返回动作对象的动作创建者函数,例如:

export const READING_CONFIG = 'READING_CONFIG';
export function readingConfig() {
  return {
    type: READING_CONFIG,
  }
}
于 2016-03-16T07:02:54.417 回答