feat(P4): precompute移植+app.js sources双向回填+回归1003/1003+验收体积/文件/data.json
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import React, { useState } from 'react';
|
||||
import './NumberRangeInput.css';
|
||||
|
||||
export default function NumberRangeInput({
|
||||
value = ['', ''], step = 1, min = -Infinity, max = Infinity,
|
||||
separator = '—', unit = '', placeholder = ['最小', '最大'], onChange, onError
|
||||
}) {
|
||||
const [errorMsg, setErrorMsg] = useState('');
|
||||
|
||||
function validate(arr) {
|
||||
const a = parseFloat(arr[0]), b = parseFloat(arr[1]);
|
||||
let err = '';
|
||||
if (arr[0] !== '' && (a < min || a > max)) err = `最小值需在 ${min}~${max}`;
|
||||
else if (arr[1] !== '' && (b < min || b > max)) err = `最大值需在 ${min}~${max}`;
|
||||
else if (arr[0] !== '' && arr[1] !== '' && a > b) err = '最小值不能大于最大值';
|
||||
setErrorMsg(err);
|
||||
onError && onError(err);
|
||||
}
|
||||
function onMin(e) {
|
||||
const arr = [e.target.value, value[1]];
|
||||
validate(arr);
|
||||
onChange && onChange(arr);
|
||||
}
|
||||
function onMax(e) {
|
||||
const arr = [value[0], e.target.value];
|
||||
validate(arr);
|
||||
onChange && onChange(arr);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={'aa-numrange' + (errorMsg ? ' is-error' : '')}>
|
||||
<input type="number" value={value[0]} step={step} min={min} max={max}
|
||||
placeholder={placeholder[0]} onChange={onMin} />
|
||||
<span className="aa-numrange-sep">{separator}</span>
|
||||
<input type="number" value={value[1]} step={step} min={min} max={max}
|
||||
placeholder={placeholder[1]} onChange={onMax} />
|
||||
{unit ? <span className="aa-numrange-unit">{unit}</span> : null}
|
||||
{errorMsg ? <span className="aa-numrange-msg">{errorMsg}</span> : null}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user