如何使用 React.js 创建一个简单的计算器 Web 应用程序
在本文中,我将解释如何使用 React 创建一个简单的计算器。可能存在一些 bug,但这仅用于学习和训练 React 的基本概念。
最近我学习了 Facebook 的 React 库的主要概念,React 的简洁性和清晰度让我感到惊讶。
让我们深入了解这个项目吧!
步骤 1:将 UI 分解为组件
首先,我们需要确定案例中的组件是什么。在这个例子中,我们可以看到按钮可以是一个单独的组件,那么我们需要把所有按钮组合在一起,得到键盘组件。接下来,我们看到顶部需要一个地方来显示表达式和结果,这就是显示组件。最后,我们需要把所有组件组合在一起,所以我们把最后一个组件命名为计算器,你可以随意命名,它也可以叫做应用程序组件。
成分
- 计算器——包含所有其他组件的主要部件
- 显示屏 — 包括顶部的显示区域
- 按钮 — 代表键盘上的每个按钮
- 键盘——我们将把所有按钮都放在这个组件中。
步骤 2:在 React 中构建静态版本
先从最简单的方案入手,暂时不考虑交互和状态管理。我们只需要编写组件及其基本的渲染函数,这样开发起来会更方便。
我决定从 Button 组件开始,因为它里面没有其他组件,所以在实现父组件之前我不需要处理组合问题,当我们编写 Keypad 组件时,你就会明白我的意思了。
import React, {Component} from 'react';
import "./Button.css";
class Button extends Component {
render(){
return(
<div
className="Button"
onClick={this.props.onClick}
data-size={this.props.size}
data-value={this.props.value}>
{this.props.label}
</div>
);
}
}
export default Button;
.Button {
background: #cad2c5;
display: flex;
border: 1px solid rgba(0,0,0,0.05);
box-sizing: border-box;
align-items: center;
justify-content: center;
width: 25%;
font-size: 24px;
color: rgba(0, 0, 0, 0.5);
height: 20%;
min-width: 25%;
}
.Button[data-size="2"] {
height: 40%;
}
.Button[data-value="null"] {
pointer-events: none;
}
.Button:hover {
background: #d7ddd3;
cursor: default;
}
然后我们编写显示组件。
import React, {Component} from 'react';
import "./Display.css";
class Display extends Component {
render(){
return(
<div className="Display">
{this.props.data}
</div>
);
}
}
export default Display;
.Display {
display: flex;
justify-content: flex-end;
align-items: center;
background: #2b293d;
height: 20%;
color: #80c9c9;
font-size: 24px;
}
下一个组件是键盘,它使用 {this.props.children} 来渲染将要写入其中的任何内容,这可以是任何其他组件。
import React, {Component} from 'react';
import "./Keypad.css";
class Keypad extends Component {
render(){
return(
<div className="Keypad">
{/* We are using composition instead of inheritance.
read more: https://reactjs.org/docs/composition-vs-inheritance.html */}
{this.props.children}
</div>
);
}
}
export default Keypad;
.Keypad {
display: flex;
flex-wrap: wrap;
flex-direction: column;
height: 80%;
}
最后,我们将编写一个基本版本的计算器组件,这里我们只实现了 render() 函数来构建应用程序的结构,然后我们将考虑状态以及它应该放在哪里。
import React, {Component} from 'react';
import Button from './Button';
import Keypad from './Keypad';
import './Calculator.css';
import Display from './Display';
class Calculator extends Component {
render(){
return(
<div className="Calculator">
<Display data={this.state.data}/>
<Keypad>
<Button label="C" value="clear" />
<Button label="7" value="7" />
<Button label="4" value="4" />
<Button label="1" value="1" />
<Button label="0" value="0" />
<Button label="/" value="/" />
<Button label="8" value="8" />
<Button label="5" value="5" />
<Button label="2" value="2" />
<Button label="." value="." />
<Button label="x" value="*" />
<Button label="9" value="9" />
<Button label="6" value="6" />
<Button label="3" value="3" />
<Button label="" value="null" />
<Button label="-" value="-" />
<Button label="+" size="2" value="+" />
<Button label="=" size="2" value="equal" />
</Keypad>
</div>
);
}
}
export default Calculator;
body {
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.Calculator {
width: 400px;
height: 300px;
position: relative;
margin: 25px;
}
您还可以看到我们是如何将键盘组件与按钮组件组合使用的。
步骤 3:确定并实施州
首先,我们要问自己,哪些组件会共享状态?在本例中,是按钮组件和显示组件,它们都位于计算器组件中,所以我们将在计算器组件中实现状态。
作为状态,我们只需要一个参数,那就是通过按下按钮在显示屏上显示的数据或表达式。
这是完整的计算器组件,它包含了状态以及操作状态所需的函数。
import React, {Component} from 'react';
import Button from './Button';
import './Calculator.css';
import Display from './Display';
import Keypad from './Keypad';
class Calculator extends Component {
constructor() {
super();
this.state = { data: ''}
}
calculate = () => {
try {
const result = eval(this.state.data);
this.setState({data: result});
} catch (e) {
this.setState({data: 'error'})
}
}
handleClick = e => {
const value = e.target.getAttribute('data-value');
switch(value) {
case 'clear':
this.setState({ data: ''});
break;
case 'equal':
this.calculate();
break;
default:
this.setState({ data: this.state.data + value});
}
}
render(){
return(
<div className="Calculator">
<Display data={this.state.data}/>
<Keypad>
<Button onClick={this.handleClick} label="C" value="clear" />
<Button onClick={this.handleClick} label="7" value="7" />
<Button onClick={this.handleClick} label="4" value="4" />
<Button onClick={this.handleClick} label="1" value="1" />
<Button onClick={this.handleClick} label="0" value="0" />
<Button onClick={this.handleClick} label="/" value="/" />
<Button onClick={this.handleClick} label="8" value="8" />
<Button onClick={this.handleClick} label="5" value="5" />
<Button onClick={this.handleClick} label="2" value="2" />
<Button onClick={this.handleClick} label="." value="." />
<Button onClick={this.handleClick} label="x" value="*" />
<Button onClick={this.handleClick} label="9" value="9" />
<Button onClick={this.handleClick} label="6" value="6" />
<Button onClick={this.handleClick} label="3" value="3" />
<Button onClick={this.handleClick} label="" value="null" />
<Button onClick={this.handleClick} label="-" value="-" />
<Button onClick={this.handleClick} label="+" size="2" value="+" />
<Button onClick={this.handleClick} label="=" size="2" value="equal" />
</Keypad>
</div>
);
}
}
export default Calculator;
这是一个非常简单的 React 应用示例,但我们用到了大部分主要概念,例如组件的组合、从父组件向子组件传递参数、维护和修改状态等等……
我希望我已经解释清楚了这个过程,你也可以在GitHub上查看完整的源代码。
如果您有任何建议或疑问,请在评论区留言。
感谢阅读!
文章来源:https://dev.to/gjorgiev/how-to-create-a-simple-calculator-web-app-using-react-js-4gc3

