在Vue中的函数之后让$ emit()同步执行

时间:2018-10-31 19:45:19

标签: vue.js vuejs2 electron

我正在尝试将布尔变量设置为false以在Vue 2中打开对话框之前关闭菜单。

public saveScreens() {
    this.showThreeDotMenu = false
    this.$emit('save-screens')
}

我想同步执行这两行,但是无论如何我都找不到在分配完成之前发生$ emit的情况。

我尝试将赋值语句外推到它自己的函数设置中,使其异步,然后在saveScreens()中命中该函数,然后.then(()=> this。$ emit('save-screens'))然而,这仍然不起作用。

无论我尝试了什么,都会打开电子消息框,然后在关闭后将布尔值设置为false,然后关闭菜单。

有什么方法可以等到我使用v-if的条件HTML完成隐藏后再执行一个函数?

使用电子1.8.8和Vue 2.x +

1 个答案:

答案 0 :(得分:1)

我想出的唯一简单的解决方案是使用public class TestAA3 { public static void main(String[] args) { int day = getDay("04/09/2034"); System.out.print(day); } public static String getSubstring( String s, int i, int j) { // declaring the String that will eventually be modified and returned by the method String Substring = " "; // error message if (j<i) { throw new IllegalArgumentException("The second integer must be greater than the first"); } else { // defining the limits of the new string for ( int position = i;position<=j; position++) { // new value of the String Substring += " " + s.charAt(position); } return Substring; } } // calling getSubstring and defining the position inside the string of the int that will be returned public static int getDay(String s) { if (s.charAt(0)==0){ String dayString = getSubstring(s,1,1); return Integer.valueOf(dayString); } else { String dayString = getSubstring(s,0,1); return Integer.valueOf(dayString); } } } 来延迟对话框的显示(如注释中所述,setTimeout不能解决问题)。我制作了一个演示片段,您可以在其中更改超时间隔。在我的浏览器上,大约10毫秒左右有效。我建议使用50之类的东西在任何地方都相当安全。

对于要隐藏并再次显示的内容,我会使用nextTick而不是v-show

v-if
new Vue({
  el: '#app',
  data: {
    showMenu: true,
    delay: 10
  },
  methods: {
    showDialog() {
      this.showMenu = false;
      setTimeout(() => {
        alert('this is a dialog');
        this.showMenu = true;
      }, this.delay);
    }
  },
  components: {
    threeDotMenu: {
      template: '#three-dot-menu-template',
      props: ['show'],
      methods: {
        openDialog() {
          this.$emit('save-screens');
        }
      }
    }
  }
});
.menu {
  background-color: #fee;
  padding: 2em;
}