【问题标题】:How to use setTimeout on vuex action?如何在 vuex 操作上使用 setTimeout?
【发布时间】:2020-04-11 07:58:54
【问题描述】:

我想清空警报状态,以便不显示警报,我真的不知道如何在 addMovieToFavourites 或 removeMovieToFavourites 执行后 x 秒触发 removeAlert 操作,代码如下,谢谢。

alert.js

const state = {
  alert: null
}
const mutations = {
  SET_ALERT(state, alert) {
    state.alert = alert
  },

  REMOVE_ALERT(state) {
    state.alert = null
  }
}
const actions = {
  setAlert({ commit }, alert) {
    commit('SET_ALERT', alert)
  },
  removeAlert({ commit }) {
    commit('REMOVE_ALERT')
  }
}

media.js 添加/删除触发警报消息

const actions = {
  addMovieToFavourites({ commit, dispatch }, movie) {
    commit('ADD_FAVOURITE', movie)
    const alert = {
      type: 'success',
      message: 'Added to favourites!'
    }
    dispatch('alert/setAlert', alert, { root: true })
  },
  removeMovieFromFavourites({ commit, dispatch }, movie) {
    commit('REMOVE_FAVOURITE', movie)
    const alert = {
      type: 'success',
      message: 'Removed from favourites!'
    }
    dispatch('alert/setAlert', alert, { root: true })
  },
}

alert.vue

<script>
import { mapActions, mapState } from 'vuex'
export default {
  name: 'Alert',
  data() {
    return {
      timeout: null
    }
  },
  mounted() {
    this.timeout = setTimeout(() => this.removeAlert(), 3000)
  },

  beforeDestroy() {
    clearTimeout(this.timeout)
  },
  computed: {
    alertTypeClass() {
      return `alert-${this.alert.type}`
    },

    ...mapState('alert', ['alert'])
  },

  methods: mapActions('alert', ['removeAlert'])
}
</script>

【问题讨论】:

    标签: vue.js vuejs2 vuex settimeout vuex-modules


    【解决方案1】:

    media 操作中添加和删除它:

    addMovieToFavourites({ commit, dispatch }, movie) {
      commit('ADD_FAVOURITE', movie)
      const alert = {
        type: 'success',
        message: 'Added to favourites!'
      }
    
      // Add alert
      dispatch('alert/setAlert', alert, { root: true })
    
      // Remove alert
      setTimeout(() => {
        dispatch('alert/removeAlert', { root: true })
      }, 3000)
    }
    

    如果所有警报都以这种方式工作,您可以通过在 setAlert 操作中排队来自动触发从每个警报中删除:

    const actions = {
      setAlert({ commit }, alert) {
        commit('SET_ALERT', alert);
        setTimeout(() => {
          commit('REMOVE_ALERT');
        }, 3000);
      },
      ...
    }
    

    那么您就不需要removeAlert 操作了。

    您可能还需要一些警报管理或clearTimeout 以在 3 秒内处理多个警报。正如它所写的那样,先前的警报被删除可能意味着以后的警报整整 3 秒都没有显示。

    【讨论】:

    • 它工作正常,谢谢。我做了一个包装器组件,所以每个警报都有单独的超时
    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2020-01-10
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多