我的意思是,他们更像是事件而不是状态!
我不会这么说。我认为加载指示器是UI的一个很好的例子,可以很容易地将其描述为状态函数:在这种情况下,是布尔变量。虽然这个答案是正确的,但我想提供一些代码。
在里面 async
Redux repo示例中,reducer 更新了一个名为isFetching
:
case REQUEST_POSTS:
return Object.assign({}, state, {
isFetching: true,
didInvalidate: false
})
case RECEIVE_POSTS:
return Object.assign({}, state, {
isFetching: false,
didInvalidate: false,
items: action.posts,
lastUpdated: action.receivedAt
组件使用 connect()
从阵营终极版订阅商店的状态和收益isFetching
作为的一部分mapStateToProps()
返回值,以便它在连接组件的道具可供选择:
function mapStateToProps(state) {
const { selectedReddit, postsByReddit } = state
const {
isFetching,
lastUpdated,
items: posts
} = postsByReddit[selectedReddit] || {
isFetching: true,
items: []
}
return {
selectedReddit,
posts,
isFetching,
lastUpdated
}
}
最后,组件使用isFetching
在render()
函数中 prop来呈现“ Loading ...”标签(可以想象是微调器):
{isEmpty
? (isFetching ? <h2>Loading...</h2> : <h2>Empty.</h2>)
: <div style={{ opacity: isFetching ? 0.5 : 1 }}>
<Posts posts={posts} />
</div>
}
更糟糕的是,当我必须在Redux / React应用程序中使用本机确认对话框或警报对话框时,该怎么办?应该将它们放在哪里,采取什么行动或减少压力?
任何副作用(并且显示对话框肯定是副作用)都不属于reducers。认为减速器是被动的“国家建设者”。他们并没有真正“做”事情。
如果希望显示警报,请在分派动作之前从组件执行此操作,或者从动作创建者执行此操作。在分发动作时,为响应该动作而执行副作用已经为时已晚。
对于每个规则,都有一个例外。有时,您的副作用逻辑如此复杂,以至于您实际上希望将它们与特定的动作类型或特定的reduce耦合。在这种情况下,请检查Redux Saga和Redux Loop等高级项目。仅当您对香草Redux感到满意并真正希望解决分散的副作用时才这样做。