getElementById с onInput в React

#javascript #css #reactjs #babeljs

#javascript #css #reactjs #babeljs

Вопрос:

Я довольно новичок в React и пытаюсь понять, как добавить небольшую функцию, которая поможет мне создать компонент слайдера. В настоящее время я использую getElementById и onInput . Я нашел похожие вопросы, но все они ссылаются onClick на события, которые я не пытаюсь делать. Надеюсь, я здесь не так уж далек! Любая помощь приветствуется. Вот соответствующие части моего кода:

HTML:

 <div id="root"></div>
  

CSS:

 #myinput {
  background: linear-gradient(to right, #82CFD0 0%, #82CFD0 50%, #fff 50%, #fff 100%);
  border: solid 1px #82CFD0;
  border-radius: 8px;
  height: 7px;
  width: 356px;
  outline: none;
  transition: background 450ms ease-in;
  -webkit-appearance: none;
}
  

JS(Babel):

 class VolumeSlider extends React.Component {
  constructor() {
    super();
    this.state = {
      value: 120.5
    };
  }

  onUpdate(e) {
    this.setState({
      value: e.target.value
    });
  }

document.getElementById("myinput").oninput = function() {
  this.style.background = 'linear-gradient(to right, #82CFD0 0%, #82CFD0 '   this.state.value   '%, #fff '   this.state.value   '%, white 100%)'
};

  render() {
    return (
      <div className="mb1">
        <input
          className="c-input--range"
          list="tickmarks"
          max={1200}
          onChange={(e) => this.onUpdate(e)}
          step={0.1}
          type="range"
          value={this.state.value}
        />
        <div>
           <label className="c-label">{this.state.value}c</label>
        </div>
      </div>
    );
  }
}

ReactDOM.render(
  <div>
    <VolumeSlider />
  </div>,
  document.getElementById("root")
);
  

Спасибо!

Комментарии:

1. Я не совсем понимаю, что вы пытаетесь сделать, можете ли вы предоставить более подробную информацию?

2. Не уверен, о чем вы спрашиваете, ваш код не использует ни getElementById, ни onInput

3. Привет! Я пытаюсь отредактировать диапазон ввода, чтобы цвет отображался слева, но не справа. Вот мой codepen, чтобы дать вам лучшую идею. Извините, я только что понял, что мой исходный вопрос не включал весь мой код, просто отредактировал его, чтобы исправить это. codepen.io/kcandle/pen/qBNLMQE

Ответ №1:

По какой-либо причине вы не используете ту же логику, что и раньше onUpdate ?

 onInput(e){
  e.target.style.background = 'linear-gradient(to right, #82CFD0 0%,  #82CFD0 '   this.state.value   '%, #fff '   this.state.value   '%, white 100%)';
}
  

 class VolumeSlider extends React.Component {
  constructor() {
    super();
    this.state = {
      value: 120.5
    };
  }

  onUpdate(e) {
    this.setState({
      value: e.target.value
    });
  }
 
  onInput(e){
    const gradStart = (this.state.value/e.target.max/2)*100;
    const gradEnd = (this.state.value/e.target.max)*100;
    e.target.style.background = 'linear-gradient(to right, #82CFD0 0%,  #82CFD0 '   gradStart   '%, #fff '   gradEnd   '%, white 50%)';
  }
  
  render() {
    return (
      
      <div className="mb1">
        <input
          className="c-input--range"
          id="myinput"
          list="tickmarks"
          max={1200}
          onChange={(e) => this.onUpdate(e)}
          onInput={(e) => this.onInput(e)}
          step={0.1}
          type="range"
          value={this.state.value}
        />
        <div>
           <label className="c-label">{this.state.value}c</label>
        </div>
      </div>
    );
  }
}

ReactDOM.render(
  <div>
    <VolumeSlider />
  </div>,
  document.getElementById("root")
);  
 #myinput {
  background: linear-gradient(to right, #82CFD0 0%, #82CFD0 50%, #eee 50%, #eee 100%);
  border-radius: 8px;
  height: 7px;
  width: 356px;
  outline: none;
  transition: background 450ms ease-in;
  -webkit-appearance: none;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/15.4.2/react-dom.min.js"></script>
<div id="root"></div>  

Комментарии:

1. Привет, я пробовал это, но по какой-то причине это не работает.

2. Я обновил свой ответ шаблоном, похоже ли это на то, что вы пытаетесь сделать?

3. Спасибо за обновление! Я пытался сделать это, не теряя правую часть диапазона ввода или градиента слева направо перед большим пальцем. В принципе, я пытался заставить панель заполняться нормально, по какой-то причине это немного сложнее, чем я думал, ха-ха.

4. Еще раз привет, поэтому я обновил это, чтобы выглядеть немного более похожим на то, к чему я стремлюсь. Но по какой-то причине ползунок стал очень изменчивым и не обновляется при нажатии. Есть идеи? codepen.io/kcandle/pen/qBNLMQE