根据范围类型输入中的其他状态值设置最大值(React)

Posted

技术标签:

【中文标题】根据范围类型输入中的其他状态值设置最大值(React)【英文标题】:set max based on other state value in input of range type (React) 【发布时间】:2022-01-20 20:40:42 【问题描述】:

我有一个输入类型的范围,输入 1 和输入 2 有 2 个状态值。我想让左输入不可移动并且在它碰到右输入时不通过。我如何使用状态值来实现它? 我尝试过类似的方法,但没有成功

import React,  Component  from 'react'

class SearchForm extends Component 
    constructor(props) 
        super(props)

        this.state = 

            rateMinValue: 0,
            rateMaxValue: 300000,
            minGap: 0,
        
    

    rateMinHandler = (event) => 
        this.setState(
            
                rateMinValue: event.target.value
            
        )
    
    rateMaxHandler = (event) => 
        this.setState(
            
                rateMaxValue: event.target.value
            
        )
    

    slideOne = (event) => 
        if (this.state.rateMaxValue - this.state.rateMinValue <= this.state.minGap) 
            this.setState(
                rateMinValue: this.state.rateMaxValue
                    - this.state.minGap
            )
        
    
    slideTwo = (event) => 
        if (this.state.rateMaxValue - this.state.rateMinValue <= this.state.minGap) 
            this.setState(
                rateMaxValue: this.state.rateMinValue
                    + this.state.minGap
            )
        
    

    render() 
        return (
            <div>
                <div className='filter-rate-slider'>
                    <div className='rate-range-values'>
                        this.state.rateMinValue < this.state.rateMaxValue ? <span>this.state.rateMinValue-this.state.rateMaxValue</span> : <span>this.state.rateMaxValue-this.state.rateMinValue</span>


                    </div>
                    <div className='rate-range-container'>
                        <div className='slider-track'></div>
                        <input onInput=this.slideOne type='range' min='0' max='300000' step='10000' defaultValue='0' id='slider-1' onChange=this.rateMinHandler></input>
                        <input onInput=this.slideTwo type='range' min='0' max='300000' step='10000' defaultValue='300000' id='slider-2' onChange=this.rateMaxHandler></input>
                    </div>


                </div>

            </div>
        )
    


export default SearchForm


我不知道哪里出了问题,有人帮帮我。

【问题讨论】:

slideOneslideTwo 在哪里调用? 在每个输入标签&lt;input onInput=this.slideOne&gt; 您的 html 代码没有onInput 我在删除 onInput 事件 bcs 后复制了我的 html 标签,因为它太落后了 请更新您的问题,包括minimal, complete, and reproducible code example,说明您尝试过的内容,并提供有关未按预期工作的详细信息。 【参考方案1】:

我复制了您的代码,但无法重现 UI(因为我没有您的样式),但有一个建议的解决方案。

使用夹紧功能将滑块一rateMinValue 状态夹在0this.state.rateMaxValue 之间,并将滑块二rateMaxValue 状态夹在this.state.rateMinValue300000 之间。 仅使用onInputonChange,但不能同时使用。

const clamp = (min, max, val) => Math.max(min, Math.min(val, max));

class SearchForm extends React.Component 
  state = 
    rateMinValue: 0,
    rateMaxValue: 300000,
    minGap: 0
  ;

  slideOne = (event) => 
    this.setState((prevState) => (
      rateMinValue: clamp(
        0,
        prevState.rateMaxValue - prevState.minGap,
        event.target.value
      )
    ));
  ;

  slideTwo = (event) => 
    this.setState((prevState) => (
      rateMaxValue: clamp(
        prevState.rateMinValue + prevState.minGap,
        300000,
        event.target.value
      )
    ));
  ;

  render() 
    return (
      <div>
        <div className="filter-rate-slider">
          <div className="rate-range-values">
            this.state.rateMinValue-this.state.rateMaxValue
          </div>
          <div className="rate-range-container">
            <div className="slider-track"></div>
            <input
              onInput=this.slideOne
              type="range"
              min="0"
              max="300000"
              step="10000"
              value=this.state.rateMinValue
              id="slider-1"
            />
            <input
              onInput=this.slideTwo
              type="range"
              min="0"
              max="300000"
              step="10000"
              value=this.state.rateMaxValue
              id="slider-2"
            />
          </div>
        </div>
      </div>
    );
  


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

【讨论】:

以上是关于根据范围类型输入中的其他状态值设置最大值(React)的主要内容,如果未能解决你的问题,请参考以下文章

element日期选择器根据不同状态展示对应时间范围的搜索条件

MySQL 中的日期时间类型

数据库设计基础步骤

excel 如何设置表格纵坐标的显示值域范围

React 输入设置状态 onChange 设置多个状态属性

如何对输入类型范围进行分组并保持 100% 组合在一起的所有范围的最大值