Есть ли какой-либо способ воспроизводить звук в течение определенного интервала времени, когда метод onClick запускается в react js

#javascript #reactjs

#javascript #reactjs

Вопрос:

 import quackSound from "./music/Duck-quack.mp3";


class MallardDuck extends Duck {
  constructor(props) {
    super();
    this.state = {
      canFly: false,
      canQuack: false,
      quackSound: new Audio(quackSound),
    };
  }

  quack = () => {
    const quack = new QuackSound();
    return quack.quack();
  };

  fly = () => {
    const fly = new FlyWings();
    return fly.fly();
  };

  render() {
    return (
      <div className="duck">
        <img
          className={`image ${this.state.canFly ? "canFly" : ""}`}
          src={mallardDuck}
          alt="mallardDuck"
          onAnimationEnd={() => {
            this.setState({ canFly: false });
          }}
        />
        <Button
          className="eventButton"
          onClick={(event) => {
            event.preventDefault();
            this.setState({ canFly: true });
          }}
        >
          Fly
        </Button>
        <Button
          className="eventButton"
          onClick={(event) => {
            event.preventDefault();
            this.setState({ canQuack: true });
            this.state.quackSound.play(); // Here !!!!!!
          }}
        >
          Quack
        </Button>
        {this.state.canQuack ? this.quack() : null}
        {this.state.canFly ? this.fly() : null}
      </div>
    );
  }
}

  

Мой аудиофайл mp3 длится 18 секунд. Я хочу играть как первые 3 или 4 секунды. Есть ли какой-либо способ сделать это в react js! Вышеупомянутый код воспроизводит все 18 секунд, я просто хочу воспроизвести первые несколько секунд. Могу ли я сделать это в react js? Кроме того, могу ли я выбрать, где начинается и заканчивается мой звук, например, если я хочу воспроизвести звук от 0,03 до 0,07 секунды звука quack!

Ответ №1:

Я бы сделал это так :

 import quackSound from "./music/Duck-quack.mp3";


class MallardDuck extends Duck {
  constructor(props) {
    super();
    this.state = {
      canFly: false,
      canQuack: false,
      round:0,
      quackSound: new Audio(quackSound),
    };
    this.intervalRef=null;
  }

  quack = () => {
    const quack = new QuackSound();
    return quack.quack();
  };

  fly = () => {
    const fly = new FlyWings();
    return fly.fly();
  };

  render() {
    return (
      <div className="duck">
        <img
          className={`image ${this.state.canFly ? "canFly" : ""}`}
          src={mallardDuck}
          alt="mallardDuck"
          onAnimationEnd={() => {
            this.setState({ canFly: false });
          }}
        />
        <Button
          className="eventButton"
          onClick={(event) => {
            event.preventDefault();
            this.setState({ canFly: true });
          }}
        >
          Fly
        </Button>
        <Button
          className="eventButton"
          onClick={(event) => {
            event.preventDefault();
            //you can tweek interval duration for your liking , for now its set to pay every .3 seconds (300 ms) 
           const myInterval=setInterval(()=>{
              if(this.state.round > 3) clearInterval(myInterval);
             this.setState({ canQuack: true });
             this.setState({ round:  this.state.round 1 });
             this.state.quackSound.play(); // Here !!!!!!},300)
          }}
        >
          Quack
        </Button>
        {this.state.canQuack ? this.quack() : null}
        {this.state.canFly ? this.fly() : null}
      </div>
    );
  }
}