在 redux-form 中,如何将输入的值限制在一个范围内?

in redux-form, how to restrict the values of the input to a range?

我希望用户能够输入最大为 2000 的数字,超过 2000 的任何数字都将作为“2000”简单地反馈到输入中。

<input type="number"   className="no-spin"
                       min="0" max="2000"
                       value={???}
                       {...eval(`${meal}_salt_amt_1`)} />

顺便说一句,'max' 属性只会阻止用户使用向上箭头递增到 2000 以上。

并且 redux-form 的 'validate' 功能不限制可以输入的内容。

以下是我如何将值(在州内)限制为 2000...

export function updateStats(values) {
    for (var value in values){
        if (value.search('salt_amt') >= 0) {
            if ( values[value] > 2000) values[value] = 2000;
        }
    }
    return {
        type: UPDATE_STATS,
        stats: JSON.parse(JSON.stringify(values))
    };
}

...到目前为止一切顺利,因为在我的 DevTools redux 插件中,我可以看到这些值在 2000 时达到顶峰的状态。

但是我如何强制将该状态返回到我的 redux 表单输入字段中?

将状态映射到道具并使用道具无效。这样做可以让我输入超过 2000 的任何数字...

function mapStateToProps(state) {
    return {
        ...
        breakfast_salt_amt_1: state.stats.breakfast_salt_amt_1,
        ...
    }
}

<input type="number"   className="no-spin"
                       min="0" max="2000"
                       value={breakfast_salt_amt_1}
                       {...breakfast_salt_amt_1} />

并且仅使用状态也不起作用...

<input type="number"   className="no-spin"
                       min="0" max="2000"
                       value={state.stats.breakfast_salt_amt_1}
                       {...breakfast_salt_amt_1} />

// =>  Uncaught TypeError: Cannot read property 'stats' of null

我忘记了什么?

我认为这可以帮助你:

<input type="number"   className="no-spin"
                       min="0" max="2000"
                       value={this.props.breakfast_salt_amt_1}
                       {...breakfast_salt_amt_1} />

这就是 Normalizing 的用途。像这样(未经测试):

const under2k = value => {
  if(value < 0) {
    return 0
  } else if(value > 2000) {
    return 2000
  } else {
    return value
  }
}

<Field
  name="breakfastSaltAmt"
  component="input"
  type="number"
  normalize={under2k}/>
export const maxLenght = max => value => {

    let v;
    let result = value.length > max;

    if(result === false) {
        v = value;
    }
    return v;
};

<Field
      name="name"
      type="text"
      component={renderField}
      label="Nome Completo *"
      placeholder="Nome Completo"
      normalize={maxLenght(10)}
    />