Vue.js를 사용하여 드럼 롤러를 실현하다

16320 단어 Vue.js
안녕하십니까? 저는 구름공장의 사람입니다.평소에는 Rails를 쓰는 경우가 많은데 요즘은 프론트에 관심이 생겨서 Vue.js 같은 것도 적혀있어요.
이 글은 클라우드 컨설턴트 달력 2019의 8일째 글입니다.
어제는 @t0yohei선생님의 @bugfire입니다.스마트폰으로 여러 발의 탱크를 자유롭게 제어할 수 있는 카메라, 대단하다...멋있어...
그건 차치하고 자신의 담당 회중은 Vue입니다.나는 js에서의 북 역할에 대한 설치 샘플을 쓰고 싶다.

계기


작업 때문에js로 롤러 캐릭터를 구현하고 싶은 경우도 있지만 탱크를 많이 타세요. 공식적인 롤러 캐릭터의 설치(수치 변화의 애니메이션)는 Vue.js를 사용하면 직접 가져올 수 없기 때문에 혼자 설치하는 경우가 있다.겨우 혼자 설치했는데 세상에 샘플이 별로 없는 것 같아서 당시 설치 내용을 조금 수정해서 보도하고 싶어요.

롤러가 뭐예요?


GreenSock 원래 뜻은
A drum roll (or roll for short) is a technique the percussionist employs to produce, on a percussion instrument, a sustained sound, "over the value of the written note."
번역을 해보면'드럼 롤(또는 줄여서 롤)은 타악기 연주자로서'쓴 음표의 가치를 초과하는'지속적인 소리를 내기 위해 사용하는 기법이다
그래서 벌로 북을 치는 그 소리를 말하는 것 같다.
거기서 어떻게 바뀌었는지 웹 응용 프로그램의 롤러풍 계수 애니메이션 등에서 사용되었다(다른 스마트폰의 롤러식 선택 상자 등도 있다).
이 글에서 호칭을 간소화하기 위해 우리는 바람의 상향 계수 애니메이션을 바람이라고 부른다.
중요한 건 ↓ 같은 애니메이션이에요.
위키백과설
회전하면서 수치가 변하는 거예요.

실시


"네, 빨리 설치하세요"라는 소리가 들릴 것 같아서 일단 전체 설치를 싣겠습니다.
개인적인 관심 때문에 TypeScript를 사용하면서 씁니다.
Parent.vue
<template>
  <input v-model.number="inputCount" type="number">
  <NumberDrumRoll :count="inputCount" /> 
</template>

<script lang="ts">
import Vue from 'vue';
import NumberDrumRoll from './NumberDrumRoll.vue';

export default Vue.extend({
  components: {
    NumberDrumRoll,
  },

  data: function() {
    return {
      inputCount: 0;
    };
  },
});
</script>
NumberDrumRoll.vue
<template>
  <span>{{ rollingCount }}</span>
</template>

<script lang="ts">
import Vue from 'vue';

export default Vue.extend({
  props: {
    count: {
      type: Number,
      default: () => null,
    },
  },

  data: function () {
    return {
      rollingCount: this.count,
      intervalId: 0,
    };
  },

  watch: {
    // 親から送られてくる数値の変更を監視して、変更があればドラムロールを実行
    count(newVal: number, oldVal: number) {
      this.performDrumRolling(newVal, oldVal);
    },
  },

  methods: {
    // 0.5秒間で数値のドラムロールを実行するメソッド
    performDrumRolling(newVal: number, oldVal: number): void {
      // ドラムローリング中に再度値の変更があった場合を考えて、予め変更前の値でドラムローリングを終えたことにしておく
      this.terminateDrumRolling(oldVal);

      // 今回は0.5秒以内にドラムロールが完了するようにしているため、 その間にどれくらいずつ値を変化させていくかの数値。
      const countInterval = Math.abs(Math.floor((newVal - oldVal) / 50)) || 1;

      // setInterval メソッドを使用して、0.01秒間隔で数値の変更処理を実行する
      if (oldVal < newVal) {
        this.intervalId = window.setInterval((): void => {
          this.countUp(newVal, countInterval);
        }, 10);
      } else {
        this.intervalId = window.setInterval((): void => {
          this.countDown(newVal, countInterval);
        }, 10);
      },
    },
    // ドラムロール処理を最終値で完了して、タイマーを止める
    terminateDrumRolling(endVal: number): void {
      this.rollingCount = endVal;
      clearInterval(this.intervalId);
    },
    countUp(newVal: number, countInterval: number): void {
      if (newVal <= this.rollingCount) {
        this.terminateDrumRolling(newVal)
        return;
      }
      this.rollingCount = this.rollingCount + countInterval;
    },
    countDown(newVal: number, countInterval: number): void {
      if (newVal >= this.rollingCount) {
        this.terminateDrumRolling(newVal)
        return;
      }
      this.rollingCount = this.rollingCount - countInterval;
    },
  },
});
</script>
실제 설치와는 조금 다르지만 어떤 동작을 할지 볼 수 있도록 코드펜을 ↓ 위에 놓는다.
See the Pen by t0yohei ( VueNumberDrumRoll )
on @t0yohei .

살짝 설명해주세요.


필요한 것은 기본적으로 댓글에 적기 때문에 간단한 보충을 써야 한다.

이번에는 실제 사용 사례를 고려하여 상위 어셈블리에서 값을 전달하고 하위 어셈블리에서 롤러 역할을 수행하는 형식으로 구현됩니다.

비동기 통신에서 얻은 값을 바탕으로 롤러 역할을 수행할 때, 나는 부모 구성 요소 내의 <input v-model.number="inputCount" type="number"> 를 제거하고 inputCount 를 비동기 처리로 바꾸어 얻은 값이라고 생각한다p>

롤러를 설치할 때 반드시 고려해야 할 것은 何秒間で処理を完了させるのかその間にいくつずつ数値を変化させるか이며, 이번에는 0.5秒間で処理を完了させて,変化前後の数値の差分を50で割った数ずつ変化させる의 형식으로 설치했다.(왜 그랬는지 그 설정치가 예뻐 보여서!)

구체적으로 말하면 이 부분에서 이루어진 거예요.p>


NumberDrumRoll.vue

// 今回は0.5秒以内にドラムロールが完了するようにしているため、 その間にどれくらいずつ値を変化させていくかの数値。
const countInterval = Math.abs(Math.floor((newVal - oldVal) / 50)) || 1;

// setInterval メソッドを使用して、0.01秒間隔で数値の変更処理を実行する
if (oldVal < newVal) {
  this.intervalId = window.setInterval((): void => {
    this.countUp(newVal, countInterval);
  }, 10);
} else {
  this.intervalId = window.setInterval((): void => {
    this.countDown(newVal, countInterval);
  }, 10);
},


나는 이 변화의 수치를 만지작거림으로써 사람들에게 보이는 방법을 조정할 수 있다고 생각한다p>

끝날 때


회상하면서 쓰면 의외로 많은 시간이 걸렸다.Vue.js로 롤러 롤러를 설치할 때 가능하다면 참고하세요p>

좋은 웹페이지 즐겨찾기