在Vuex中完成操作后,从商店中调用组件函数

时间:2019-03-29 14:05:08

标签: javascript vue.js vuejs2 vuex

添加新元素后,我试图自动滚动到包含元素列表的div底部。

由于添加和删除元素是使用API​​通过Axios完成的,因此我必须等待服务器的响应才能更新Vuex中的状态。

这意味着,在我的状态下添加元素后,每次我调用“ scrollDown”函数时,该函数都会滚动到倒数第二个元素(由于未进行异步Axios调用已注册)。

我的问题是,如何等待Vuex中的操作完成,然后调用组件中的函数以滚动到div的底部?

我尝试使用观察程序,计算属性,发送道具,跟踪Vuex中实际状态的更改,但这些都不起作用...

// VUEX

const state = {
  visitors: [],
  url: 'API URL',
  errors: []
}
const mutations = {
  ADD_VISITOR(state, response) {
    const data = response.data;
    data.Photos = [];
    state.visitors.data.push(data);
  },
}
const actions = {
  addVisitor: ({ commit }, insertion) => {
    axios
      .post(state.url + 'api/visitor', {
        name: insertion.visitorName
      })
      .then(response => {
        commit('ADD_VISITOR', response);
      })
      .catch(error => state.errors.push(error.response.data.message));
    state.errors = [];
  },
}

// MY COMPONENT FROM WHERE THE ACTIONS ARE BEING DISPATCHED

<div ref="scroll" class="visitors-scroll">
  <ul v-if="visitors.data && visitors.data.length > 0" class="list-group visitors-panel">
    <!-- Displaying appVisitor component and sending data as a prop -->
    <app-visitor v-for="visitor in visitors.data" :key="visitor.id" :visitor="visitor"></app-visitor>
  </ul>
</div>

methods: {
  // Function that dispatches the "addVisitor" action to add a new visitor to the database
  newVisitor() {
    const insertion = {
      visitorName: this.name
    };
    if (insertion.visitorName.trim() == "") {
      this.errors.push("Enter a valid name!");
    } else {
      this.$store.dispatch("addVisitor", insertion);
      this.name = "";
    }
    this.errors = [];
    this.scrollDown(); // I WANT TO CALL THIS FUNCTION WHEN AXIOS CALL IS FINISHED AND MUTATION IN VUEX IS COMPLETED
  },
  scrollDown() {
    this.$refs.scroll.scrollTop = this.$refs.scroll.scrollHeight;
  }
},

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以尝试使用async/await语法。

这意味着当它等到this.$store.dispatch("addVisitor", insertion)被解决时,这意味着直到存在来自API的响应,才会执行下一行代码。

methods: {
  // Function that dispatches the "addVisitor" action to add a new visitor to the database
  async newVisitor() {
    const insertion = {
      visitorName: this.name
    };
    if (insertion.visitorName.trim() == "") {
      this.errors.push("Enter a valid name!");
    } else {
      await this.$store.dispatch("addVisitor", insertion);
      this.name = "";
    }
    this.errors = [];
    this.scrollDown();
  },
  scrollDown() {
    this.$refs.scroll.scrollTop = this.$refs.scroll.scrollHeight;
  }
}

编辑:在您的Vueux操作中,请确保添加一个return语句。

const actions = {
  addVisitor: ({ commit }, insertion) => {
    return axios
      .post(state.url + 'api/visitor', {
        name: insertion.visitorName
      })
      .then(response => {
        commit('ADD_VISITOR', response);
      })
      .catch(error => state.errors.push(error.response.data.message));
    state.errors = [];
  },
}

答案 1 :(得分:1)

在vuex中,分派的操作返回一个Promise。如果您的代码是空的Promise,因为没有要返回的内容。您需要返回/传递axios Promise,然后在组件中等待它。看下面的固定代码:

df.applymap(type)