显示DOM元素点击按钮时调用API,这可能看起来像: class App extends Component {
state = { data: {} }
makeAPICall() {
fetch(url).then(data => this.setState({ data }))
}
render() {
<Child
data={this.state.data}
makeAPICall={this.makeAPICall}
/>
}
}
let Child = ({ data, makeAPICall }) => (
<button onClick={makeAPICall}>Call API!</button>
)
的App
组件负责存储全局状态和处理事件,但我们必须通过组件树传递状态和App的处理程序,很可能通过组件永远不会使用这些道具。
通过添加Redux,您的应用程序现在拥有更好的处理API调用或打开相机等副作用的地方。中间件!
让这(糟糕的)插图帮助你:
因此,现在你App
组件可以像所有其他的正常表象组件,只需根据商店的道具和处理显示数据任何用户输入/调度动作,如果需要的话。让我们使用thunk
中间件
// actions.js
export let makeAPICall =() => {
return dispatch => {
fetch(url).then(data => dispatch({
type: 'API_SUCCESS',
payload: data,
})).catch(error => dispatch({ type: 'API_FAIL', payload: error }))
}
}
// Child.js
import { connect } from 'react-redux'
import { makeAPICall } from './actions'
let Child = ({ dispatch }) => (
<button onClick={() => dispatch(makeAPICall())}>Call API!</button>
)
export default connect()(Child)
大约阵营应用这种方式是非常强大的思维更新上面的例子。关注的分离是非常完善的。组件显示内容并处理事件。中间件负责处理任何副作用(如果需要的话),而且商店只是一个会导致React在其数据发生变化时重新呈现的对象。
UPDATE:“模态问题”
阵营应用可能有像情态动词和工具提示一些全局的东西。不要去想“开放模式”事件。想一想“现在的模态内容是什么?”。
一个模式的设置可能看起来沿着这些线路:
// modalReducer.js
function reducer (state = null, action) {
if (action.type === 'UPDATE_MODAL') {
return action.payload
}
// return default state
return state
}
// App.js
let App = connect(state => ({ modal: state.modal }))(
props =>
<div>
<OtherStuff />
<Modal component={props.modal} />
</div>
)
// Modal.js
let Modal = props =>
<div
style={{
position: 'fixed',
width: '100vw', height: '100vh',
opacity: props.component ? 1 : 0,
}}
>
{props.component}
</div>
// Child.js
let Child = connect()(props =>
<button onClick={e =>
dispatch({
type: 'UPDATE_MODAL'
payload: <YourAwesomeModal />
})
}>
Open your awesome modal!
</button>
)
这仅仅是一个例子,但将工作的伟大!当state.modal
是null
你的Modal具有0不透明度并且不会显示。当您调度UPDATE_MODAL
并传入组件时,模式将显示您分派的任何内容,并将不透明度更改为1,以便您可以看到它。稍后,您可以派遣{ type: 'UPDATE_MODAL', payload: null }
关闭模式。
希望这会给你一些想法!
当然read this answer by Dan。他的方法是类似的,但存储模式“元数据”与组件本身相比,它更适合像时间旅行等Redux fanciness
这确实有帮助,但并没有解决我的问题。我有一个模式对话框,它是根应用程序组件的一部分,子次级子组件有一个按钮,单击该对话框时需要显示该对话框。我如何在没有事件概念的情况下实现这一点,并且不需要将事件处理程序一直传递下去? – demian85
啊我最喜欢的一个问题!添加这个。 – azium
中间件是您需要倾听操作并以某种方式做出响应的工具。也就是说,Dan Abramov写了一篇关于[使用Redux管理模态对话框]的答案(http://stackoverflow.com/a/35641680/62937),并且我写了一篇博客文章,建立在他的技术基础上,以处理[从通用对话框](http://blog.isquaredsoftware.com/2016/11/posts-on-packtpub-generic-redux-modals-and-building-better-bundles/)。 – markerikson