显示Snackbar与React Redux

时间:2016-12-29 19:59:54

标签: reactjs redux react-redux material-ui

首先,我对React和Redux完全不熟悉。

每当我发送活动时,我都会在Snackbar作为通知面板显示material-ui时遇到麻烦。

请参阅我的示例的模型代码。由于this.props.sending组件中的App在API调用成功后立即设置为false,因此通知不会以这种方式显示。

现在,如果我跳过SOMETHING_FULFILLED调度,一切似乎都能正常工作。由于我的state.open功能,Notification组件的false设置为onRequestClose,但由于this.props.sending组件中的App仍然存在设置为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

1 个答案:

答案 0 :(得分:3)

如果我正确地读了你,听起来你的Snackbar工作正常,但它关闭的速度太快了。您希望它显示但4秒后自动关闭,即使API调用本身仅需要0.5秒。那是对的吗?如果是这样,我相信当state.open从true更改为false时,您可以简单地跳过重新渲染组件(但是当从false变为true时仍允许渲染):

shouldComponentUpdate(nextProps, nextState) {
  // Only re-render when snackbar is going from closed to open
  return !this.state.open && nextState.open;
}