[英]React calculator: limiting number of inputs
我正在尝试制作一个React计算器。 它主要完成,但我有一个问题,我不知道如何纠正:我似乎无法限制用户可以输入的运算符的数量(例如,我想限制“++++”到只是“+”并且还阻止两个运营商加入:+ - 必须成为 - )。 我每次用户进入操作员时都尝试重置状态,但没有骰子。 我在这里很丢失。 我想到了一个正则表达式,但它似乎是相当有问题的(尝试太多的上下文)。
class Calculator extends Component {
constructor(props) {
super(props);
this.state = { value: '' };
this.handleClick = this.handleClick.bind(this);
}
handleClick(evt) {
const id = evt.target.id;
const result = evt.target.value;
this.setState(prevState => ({
value: `${prevState.value}${result}`.replace(/^0+\B/, '')
}));
if (id === 'equals') {
this.setState({ value: math.eval(this.state.value) });
} else if (id === 'clear') {
this.setState({ value: 0 });
}
}
}
您可以使用操作和非常类型的字符保存列表。 然后在插入之前检查是否是一个操作以防止添加多个
例
const ops = ['/', '+', '-', '^']
this.setState({lastChar: result})
// Before setState with the full formula
if(this.state.lastChar === result && ops.includes(result)) else if (ops.includes(this.state.lastChat) && ops.includes(result)) return;
假设result
只是键入/单击的字符
问题
这个策略绝对不是完美的。 例如,键入1 + -2或1 * -3将不起作用。 但是从这里开始你可以调整它以满足你的需求
我正在打电话,抱歉格式不好
您可以使用正则表达式来解决此问题。 使用基于includes()
的方法的主要问题是它不会在输入字符串中强制执行正确的格式。 也许你可以使用像这样的正则表达式?
/^\d*([/\+-/*=]\d+)*$/gi
这样可以防止像+++
这样的多个操作数等问题:
class Calculator extends React.Component {
constructor(props) {
super(props);
this.state = { value: "" };
this.handleClick = this.handleClick.bind(this);
}
handleClick(evt) {
const result = evt.target.value;
// Update state
this.setState({
value: result
});
// Comine previous state with input value
//const combination = `${ this.state.value }${result}`;
console.log(result, 'combination', result)
// Use regular expression to check valid input. If invalid
// prevent further processing
if(!result.match(/^\d*([/\+-/*=]\d+)*$/gi)) {
console.error('Invalid input')
return
}
this.setState({ calculated: eval(result) });
}
render() {
return <h1>
<input value={this.state.value} onChange={(e) => this.handleClick(e)}/>
<p>{ this.state.calculated }</p>
</h1>
}
}
ReactDOM.render(<TodoApp />, document.querySelector("#app"))
这里有一个功能齐全的JSFiddle供您试用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.