まず、ReactとReduxを初めて知りました。SnackbarにReact Reduxを表示する
私はイベントを発送するたびにSnackbar
を通知パネルとしてmaterial-ui
から表示することに問題があります。
私の例ではモックアップコードを参照してください。 API呼び出しが成功した場合、this.props.sending
のApp
のコンポーネントがfalse
に設定されているため、この通知はすべて表示されません。
ここで、SOMETHING_FULFILLED
ディスパッチをスキップすると、すべて正常に動作しているようです。 Notification
コンポーネントのstate.open
はonRequestClose
の機能のおかげでfalse
に設定されますが、App
コンポーネントのthis.props.sending
はまだtrue
に設定されています。したがって、App
コンポーネントが再描画するたびに通知を表示します。
これを正しく実装する方法はありますか?
私はaction
のように見えます。
const doSomething = (data) => {
return dispatch => {
dispatch({
type: 'SOMETHING_PENDING',
payload: { data }
})
apiCall.then((complete) => {
dispatch({
type: 'SOMETHING_FULFILLED',
payload: { data }
})
})
}
}
そして、私のreducer
はこのようです。
const initialState = {
sending: false
}
const SomeReducer = (state=initialState, action) => {
switch (action.type) {
case 'SOMETHING_PENDING': {
return {
...state,
sending: action.payload
}
}
case 'SOMETHING_FULFILLED': {
return {
...state,
sending: false
}
}
default: {
return state
}
}
}
export default SomeReducer
私のApp
コンポーネントは、ストアに接続されています。
import React, { Component } from 'react'
import { connect } from 'react-redux'
const storeData = (store) => {
const data = {
sending: store.Reducer.sending
}
return data
}
class App extends Component {
render() {
return (
<Notification sending={this.props.sending} />
)
}
}
export default connect(storeData)(App)
と私のNotification
コンポーネント。
import React, { Component } from 'react'
import Snackbar from 'material-ui/Snackbar'
class Notification extends Component {
constructor(props) {
super(props)
this.state = { open: false }
}
componentWillReceiveProps(nextProps) {
if (nextProps.sending) {
this.setState({ open: true })
} else {
this.setState({ open: false })
}
}
closeNotification =() => {
this.setState({ open: false })
}
render() {
return (
<Snackbar
open={this.state.open}
message={'test'}
autoHideDuration={4000}
onRequestClose={this.closeNotification}
/>
)
}
}
export default Notification
これはそれをやりました。シンプルで素敵です。ありがとう、ジェフ! – wannabefounder
素晴らしい、喜んで助けて! –
しかし、成功または失敗のリクエストでsnakbarを表示する必要がある場合、私は何をしますか? –