顯示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