所以我有很多解决方案的网站,每个人都是一些包,但我不需要任何包,它应该只使用Reactjs <div className="odometer-value">100</div>中的纯js

current not able to find one without package

推荐答案

有许多库默认为它提供了很酷的可视化表示,但正如您所说的,您正在寻找简单的实现,所以我在几分钟内就写了一些东西.

Assuming you are not looking for fancy animations and just a counter counting up/down on value change is fine,下面的代码应该适用于您.

import { useEffect, useState } from "react";
import "./SpeedoMeter.css";

export default function SpeedoMeter({ value }) {
  // Current shown value
  const [currentValue, setCurrentValue] = useState(0);
  // Target Value to reach
  const [targetValue, setTargetValue] = useState(0);
  // Number of step to reach
  const steps = 10;
  // Latency between each step, if this is 0 then the count up/down is very instant and wont work
  const lag = 1;

  // Updating target value
  useEffect(() => {
    setTargetValue(value);
  }, [value]);

  // Updating Current value to follow target value, a feedback loop if made so that useEffect depencency can be leveraged.
  // Note: This is not super accurate in timing/animations
  useEffect(() => {
    if (currentValue !== targetValue) {
      setTimeout(() => {
        setCurrentValue((prevCurr) => {
          let distance = Math.abs(targetValue - currentValue);
          let stepSize = Math.ceil(distance / steps);
          return currentValue < targetValue
            ? currentValue + stepSize
            : currentValue - stepSize;
        });
      }, lag);
    }
  }, [currentValue, targetValue]);

  return (
    <div className="speedo-wrap">
      {(currentValue + "").split("").map((val, idx) => (
        <div className="speedo-digit" style={{ marginTop: `-${val}em` }}>
          <div data-val="0">0</div>
          <div data-val="1">1</div>
          <div data-val="2">2</div>
          <div data-val="3">3</div>
          <div data-val="4">4</div>
          <div data-val="5">5</div>
          <div data-val="6">6</div>
          <div data-val="7">7</div>
          <div data-val="8">8</div>
          <div data-val="9">9</div>
        </div>
      ))}
    </div>
  );
}

CSS

.speedo-wrap {
  display: flex;
  justify-content: center;
  height: 1rem;
  font-size: 1rem;
  line-height: 1rem;
  overflow: hidden;
}

.speedo-digit {
  transition: 1s all;
}

USAGE

<SpeedoMeter value={10000} />

Adding CodeSandbox for same:https://codesandbox.io/s/basic-react-speedometer-gsv5yc?file=/src/SpeedoMeter.js

此外,立方贝塞尔可以很容易地控制动画,数字的视觉表示也可以改变,副作用最小,速度/步数可以控制.

Javascript相关问答推荐

为什么有些库公开了执行相同任务的方法,但每个方法都处于同步/同步上下文中?

每次子路由重定向都会调用父加载器函数

从PWA中的内部存储读取文件

被CSS优先级所迷惑

在Angular中将样式应用于innerHTML

我们如何从一个行动中分派行动

为什么按钮会随浮动属性一起移动?

JS—删除对象数组中对象的子对象

我正在建立一个基于文本的游戏在react ,我是从JS转换.我怎样才能使变量变呢?

编剧如何获得一个div内的所有链接,然后判断每个链接是否都会得到200?

如何在箭头函数中引入or子句?

从另一个数组中的对应行/键值对更新数组中的键值对对象

在VS代码上一次设置多个变量格式

为什么我的按钮没有从&q;1更改为&q;X&q;?

无法重定向到Next.js中的动态URL

在不扭曲纹理的情况下在顶点着色器中旋转UV

将Singleton实例设置为未定义后的Angular 变量引用持久性行为

如何在Reaction中清除输入字段

在Puppeteer中使用promise进行日志(log)记录时出现TargetCloseError

如何在加载页面时使锚定标记成为焦点