📜  反应JS |计算器应用程序(添加功能)

📅  最后修改于: 2022-05-13 01:56:51.617000             🧑  作者: Mango

反应JS |计算器应用程序(添加功能)

在我们之前的文章中,我们已经构建了 UI 的结构,但是我们没有添加样式,也没有添加任何功能。您可以看到,如果您现在单击按钮,则屏幕上不会输入任何内容。因此,在本文中,我们将尝试使我们的计算器应用程序功能齐全。一旦我们的应用程序开始运行,我们将添加 CSS 来为我们的应用程序设置样式。
那么,让我们开始吧。我们将添加的第一个功能是按钮的单击事件。为了处理点击事件,我们将创建一个名为handleClick的新函数,并将这个函数添加到我们的Calculator组件类中。但是,接下来要注意的是,“0-9”按钮和“+、-、*、/”等运算符将具有不同的作用,而“=”、“清除”和“删除”等其他按钮则具有不同的作用。角色。所以,我们可以做的是在handleClick函数内部,我们将使用switch..case语句来执行点击不同按钮的不同操作。
但在这样做之前,让我们看看我们需要哪些状态?我们需要为我们的计算器应用程序创建两个状态,我们将根据用户输入更新这两个状态。我们需要的两个状态是:

  • 问题:最初这个状态会用一个空字符串初始化。此状态将用于存储用户输入。
  • 答案:最初这个状态会用一个空字符串来初始化。此状态将用于存储用户输入的评估结果,该状态存储在问题中。

在文件calculator.js中的类Calculator 顶部添加以下代码。此代码将为我们创建所需的状态:

javascript
constructor() {
    super();
 
    // set our default state
    this.state = {
      question: '',
      answer: ''
    }
 
    // Bind our handleClick method (sets 'this' explicitly
    // to refer to this component) We did this because 'this'
    // would refer to the source of the click events
    this.handleClick = this.handleClick.bind(this);
  }


PHP
// our method to handle all click events from our buttons
handleClick(event){
 
  // get the value from the target element (button)
  const value = event.target.value;
 
  switch (value) {
    case '=': {
 
      // if it's an equal sign, use the eval module
      // to evaluate the question ,convert the answer
      // (in number) to String
      if (this.state.question!=='')
      {
          var ans='';
            try
              {
                  ans = eval(this.state.question);
              }
              catch(err)
              {
                  this.setState({answer: "Math Error"});
              }
              if (ans===undefined)
                  this.setState({answer: "Math Error"});
 
              // update answer in our state.
              else
                  this.setState({ answer: ans , question: ''});
              break;
          }
    }
    case 'Clear': {
 
      // if it's the Clears sign, just clean our
      // question and answer in the state
      this.setState({ question: '', answer: '' });
      break;
    }
 
    case 'Delete': {
      var str = this.state.question;
        str = str.substr(0,str.length-1);
        this.setState({question: str});
        break;
    }
 
  default: {
 
      // for every other command, update the answer in the state
      this.setState({ question: this.state.question += value})
      break;
    }
  }
}


javascript
// Import React (Mandatory Step).
import React from 'react';
 
// Import Output Screen Row.
import OutputScreenRow from './outputScreenRow.js';
 
// Functional Component.
// Use to hold two Screen Rows.
const OutputScreen = (props) => {
  return (
    
                  
  ) }   // Export Output Screen. export default OutputScreen;


javascript
// Import React (Mandatory Step).
import React from 'react';
 
// Functional Component.
// Used to show Question/Answer.
const OutputScreenRow = (props) => {
  return (
    
           
  ) }   // Export Output Screen Row. export default OutputScreenRow;


从现在开始,我们已经创建了我们的状态来存储用户输入和答案。让我们完成我们的handleClick函数,根据不同的按钮点击来更新这些状态。
将以下函数添加到calculator.js文件中的类Calculator 中:

PHP

// our method to handle all click events from our buttons
handleClick(event){
 
  // get the value from the target element (button)
  const value = event.target.value;
 
  switch (value) {
    case '=': {
 
      // if it's an equal sign, use the eval module
      // to evaluate the question ,convert the answer
      // (in number) to String
      if (this.state.question!=='')
      {
          var ans='';
            try
              {
                  ans = eval(this.state.question);
              }
              catch(err)
              {
                  this.setState({answer: "Math Error"});
              }
              if (ans===undefined)
                  this.setState({answer: "Math Error"});
 
              // update answer in our state.
              else
                  this.setState({ answer: ans , question: ''});
              break;
          }
    }
    case 'Clear': {
 
      // if it's the Clears sign, just clean our
      // question and answer in the state
      this.setState({ question: '', answer: '' });
      break;
    }
 
    case 'Delete': {
      var str = this.state.question;
        str = str.substr(0,str.length-1);
        this.setState({question: str});
        break;
    }
 
  default: {
 
      // for every other command, update the answer in the state
      this.setState({ question: this.state.question += value})
      break;
    }
  }
}

现在,我们完成了所有功能的添加,但是,如果我们在浏览器中单击计算器应用程序的按钮,什么也不会发生。这背后的原因是我们没有在 button.js 文件中的 Button 组件中将我们的handleClick函数与按钮的 onClick 属性链接起来。为此,我们将handleClick函数作为 props 传递给 Button 组件,并将此函数分配给 Button 组件中按钮的 onClick 事件。
我们将在我们的 Calculator 组件中的任何地方添加以下行,从这里我们调用我们的 Button 组件以将 handleClick函数作为道具传递给 Button 组件:

handleClick = {this.handleClick}

添加后,我们将转到 button.js 文件,并将以下属性添加到输入字段:

onClick = {props.handleClick}

现在一切都设置好了。点击我们的按钮,我们的状态会得到更新。但是等等,我们仍然无法在浏览器中看到我们的应用程序有任何变化。让我们回忆一下出了什么问题。问题是我们没有将状态传递给 OutputScreen 组件。所以我们的 OutputScreen 组件没有任何东西可以在屏幕上渲染。因此,让我们更新我们的 OutputScreen 和 OutputScreenRow 组件以接受 props 并将问题答案状态从 Calculator 组件传递到 OutputScreen 组件作为 props。
完成此操作后,将 OutputScreen 组件内部的 props 作为值传递给 OutputScreenRow 组件,以在输入字段中显示它们。
下面是我们最终的outputscreen.js文件:

javascript

// Import React (Mandatory Step).
import React from 'react';
 
// Import Output Screen Row.
import OutputScreenRow from './outputScreenRow.js';
 
// Functional Component.
// Use to hold two Screen Rows.
const OutputScreen = (props) => {
  return (
    
                  
  ) }   // Export Output Screen. export default OutputScreen;

下面是我们最终的outputscreenrow.js文件:

javascript

// Import React (Mandatory Step).
import React from 'react';
 
// Functional Component.
// Used to show Question/Answer.
const OutputScreenRow = (props) => {
  return (
    
           
  ) }   // Export Output Screen Row. export default OutputScreenRow;

您可以在下图中看到我们的计算器应用程序运行良好,并且具有与我们在第一篇文章中看到的相同的功能。在我们的下一篇文章中,我们将为此添加样式,并尝试总结到目前为止我们为构建这个应用程序所做的工作。

反应JS |计算器应用程序(样式)