Как запустить метод vue только один раз, а не каждый раз

я обрабатываю поворот даже на change:

<div @change="handleRotate"></div>
<script>
export default {
  data: {
    rotate = 0
  },
  methods: {
    handleRotate () {
      this.rotate = this.rotate + this.getRotateAngle(e.clientX, e.clientY)
    }
  }
}
</script>

сейчас, второй this.rotate работает на любом change. Как я могу сделать так, чтобы второй this.rotate применяется только в первый раз handleRotate работает?

3 ответов


решение его Vue путь:

можно использовать $один раз, который будет слушать события, но только один раз.

слушайте пользовательское событие, но только один раз. Прослушиватель будет удален, как только он запускается в первый раз.

вам просто нужно добавить .once to @change следующее:

<div @change.once="handleRotate"></div>
<script>
export default {
  //No Change here
}
</script>

Проверьте демо, если это в скрипка.


старый Ответ:

если вы не хотите иметь начальное значение для rotate, вы можете иметь еще одну переменную:hasRotated чтобы отслеживать, был ли изменен поворот или нет. Изначально установлено hasRotated в true, как только поворот был изменен set hasRotated в false, например:

<div @change="handleRotate"></div>
<script>
export default {
  data: {
    rotate: 123,
    hasRotated: false
  },
  methods: {
    handleRotate () {
      if(this.hasRotated){
        this.rotate = this.rotate + this.getRotateAngle(e.clientX, e.clientY)
        this.hasRotated = false
      }
    }
  }
}
</script>

одним из простых решений было бы добавить маркер примерно так:

<script>
export default {
  data: {
    rotate = 0
  },
  methods: {
    handleRotate () {
      if(!this.rotated){
          this.rotate = this.rotate + this.getRotateAngle(e.clientX, e.clientY);
          this.rotated = true;
      }
    }
  }
}
</script>

конечно, вам нужно будет инициировать это.поворачивается как false


Если rotate начать всегда с нуля вы можете сделать:

export default {
    data: {
        rotate = 0
    },
    methods: {
        handleRotate(e) {
            if (this.rotate !== 0) {
                return;
            }
            this.rotate = this.rotate + this.getRotateAngle(e.clientX, e.clientY);
        }
    }
};