用于唯一数字计数的 popmotion tween 过滤器

popmotion tween filter for unique number count

我正在尝试使用补间作为计数器,在一段时间内只有 returns 0-4。 我只希望它return个数相同一次。 我正在使用 https://popmotion.io/。这是我到目前为止所拥有的。

  import { tween, easing, transform } from 'popmotion';

  onHandleClick() {
   // const { clamp } = transform;
    const twn = tween({ from: 0, to: 4 }).pipe(Math.round);
    twn.start(this.addToList);
  }

  addToList(val) {
    console.log('val = ', val);
 }

以上输出如下:

val =  1
val =  1
val =  2
val =  2
val =  2
val =  3
val =  3
val =  3
val =  3
val =  3
val =  4
val =  4
val =  4
val =  4
val =  4
val =  4
val =  4

我所追求的是它只输出一个从 0 - 4 的唯一数字 示例:

val =  0
val =  1
val =  2
val =  3
val =  4

他们有一个过滤方法,它说。

filter((v: any) => boolean): Returns a new action that filters out values when the provided function returns false.

我不确定如何使用过滤器来仅 return 相同的号码一次?

Popmotion tween API returns filter, while, start 和 pipe,其中每一个实际上都是一个迭代器函数。所以传给start.update之前的值会一一传给那些迭代器函数。这意味着最初(在动画开始之前)您无法获得将传递给 start.update.

的所有值

除了拥有一个全局状态(即 popmotion.tween 以上的状态),别无选择,就像一个变量来存储 lastValue。然后在每个 start.update 中更新 lastValue 并过滤当前 updateValue 是否与 lastValue 相同。看代码吧,会更容易理解

var lastValue;

popmotion.tween({from:0,to:4})
            .pipe(Math.round)
            .filter(function(value){
                return lastValue != value;
             })
            .start(function(updateValue){
                lastValue = updateValue;
                console.log('val = ',updateValue)
             })

在上面的代码中,Tween 值通过管道进行舍入,然后通过与 lastValue(补间的全局状态)进行比较进行过滤。并且在每次更新时都会更改此全局状态(lastValue)。重要的是要注意在过滤之前应该对值(管道)进行舍入。

输出:

val =  0
val =  1
val =  2
val =  3
val =  4

嗯,你离解决方案很近了,使用过滤器来解决它。

如果您不知道过滤器的工作原理,基本上如果迭代器函数 return 对传递的值为真,则接受该值并将其存储在单独的数组中,如果为假 returned 传递的值被拒绝并且不被存储。因此,在过滤器的末尾,您将得到一个新数组,其中包含使过滤器迭代器函数 return 为真的所有值。您可以阅读有关过滤器的更多信息 here

希望对您有所帮助。