我的音量滑块起作用,但按钮只停留在一个地方。为什么?

My volume slider functions but the button just stays in one place. Why?

我在 return 之上使用此功能。 div(下)在 return 中。我得到的结果是一个起作用的音量滑块。但是,从视觉上看,滑块按钮永远不会移动。我该如何解决这个问题,让按钮显示音量在哪里?

const Component = () => {
  const setVolume = (e) => {
    audioRef.current.volume = e.target.value / 100;
  };

  return (
    <div className="volumeControl">
      <button onClick={() => audioMute()}> Mute </button>{" "}
      <input
        min={0}
        max={100}
        value={50}
        step={1}
        onChange={setVolume}
        type="range"
      />
    </div>
  );
};

ReactDOM.render(<Component />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>

按钮永远不会移动,因为它的值固定为 50。 您可以使用 defaultValue 属性代替 value。 值与 controlled component 一起使用,应绑定到本地状态。

由于值是可变的,请尝试使用 useState 挂钩将其存储在本地状态中

let [range, setRange] = useState(50)
const setVolume = (e) => {
   setRange(e.target.value / 100)
}

return(
<div className="volumeControl">
    <button onClick={() => audioMute()}>Mute</button>
    <input 
        min={0} 
        max={100} 
        value={range} 
        step={1}
         onChange={setVolume} 
        type="range"
    />
</div>
)

我认为您缺少输入元素的 ref 属性

import { useRef } from 'react';
....
let audioRef = useRef()

   <input 
        min={0} 
        max={100} 
        value={50} 
        step={1}
         onChange={setVolume} 
        type="range"
        ref ={audioRef}
    />

你为什么不用useState()?我认为这对您的情况更好,因为您只需要音量值。您也可以在那里设置初始音量。 useState(50)。 试试这个代码:

const Component = () => {
  const [volume, setVolume] = React.useState(50);
  const handleVolumeChange = (e) => {
    console.log(e.target.value);
    setVolume(e.target.value);
  };

  return (
    <div className="volumeControl">
      <button onClick={() => audioMute()}> Mute </button>{" "}
      <input
        min={0}
        max={100}
        value={volume}
        step={1}
        onChange={handleVolumeChange}
        type="range"
      />
    </div>
  );
};

ReactDOM.render(<Component />, document.getElementById("root"));
<script src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
<div id="root"></div>