在我们 以前的 在本文中,我们已经构建了UI的结构,但我们没有添加样式,也没有添加任何功能。你可以看到,如果你现在点击按钮,屏幕上什么都不会被输入。因此,在本文中,我们将尝试使我们的计算器应用程序功能齐全。一旦我们的应用程序开始运行,我们将添加CSS来设计我们的应用程序。 那么,让我们开始吧。我们将添加的第一个功能是按钮的点击事件。为了处理点击事件,我们将创建一个名为 手舔 并将此功能添加到我们的 计算器 组件类。但是,接下来要注意的是,“0-9”中的按钮和“+、-、*、/”等运算符将具有不同的角色,而“=”、“清除”和“删除”等其他按钮则具有不同的角色。所以,我们能做的就是在 手舔 函数我们将使用 转换案例 语句对单击不同的按钮执行不同的操作。 但在做这件事之前,让我们看看我们需要什么样的国家?我们需要为计算器应用程序创建两个状态,并根据用户输入更新这两个状态。我们需要的两个州是:
- 问题 :最初,此状态将用空字符串初始化。此状态将用于存储用户输入。
- 答复 :最初,此状态将用空字符串初始化。此状态将用于存储状态中存储的用户输入评估结果 问题 .
将下面的代码添加到文件中类计算器的顶部 计算器js .此代码将为我们创建所需的状态:
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 ); } |
从现在起,我们创建了状态来存储用户输入和答案。让我们完成我们的任务 手舔 功能根据不同的按钮点击更新这些状态。 将下面的函数添加到 计算器js 文件:
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 ; } } } |
现在,我们已经完成了添加所有功能,但如果我们在浏览器中单击计算器应用程序的按钮,什么都不会发生。这背后的原因是我们没有将 手舔 在按钮中的按钮组件中使用按钮的onClick属性。js文件。为此,我们将通过 手舔 作为按钮组件的道具,并将此功能分配给按钮组件中的按钮onClick事件。 我们将在计算器组件中的每一处添加以下行,从中调用按钮组件,将handleClick函数作为道具传递给按钮组件:
handleClick = {this.handleClick}
添加此项后,我们将转到按钮。js文件,并将以下属性添加到输入字段:
onClick = {props.handleClick}
现在一切都准备好了。点击我们的按钮,我们的州就会得到更新。但是等等,我们仍然无法在浏览器中看到我们的应用程序有任何变化。让我们回忆一下出了什么问题。问题是我们没有将状态传递给OutputScreen组件。所以我们的OutputScreen组件没有任何东西可以在屏幕上渲染。所以,让我们更新OutputScreen和OutputScreenRow组件,以接受道具并通过测试 问题 和 答复 从计算器组件到输出屏幕组件的状态作为道具。 完成此操作后,将道具从OutputScreen组件内部传递到OutputScreenRow组件,作为值显示在输入字段中。 下面是我们的期末考试 输出屏幕。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 ( <div className="screen"> <OutputScreenRow value = {props.question}/> <OutputScreenRow value = {props.answer}/> </div> ) } // 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 ( <div className="screen-row"> <input type="text" readOnly value = {props.value}/> </div> ) } // Export Output Screen Row. export default OutputScreenRow; |
您可以在下图中看到,我们的计算器应用程序运行良好,功能与我们在第一篇文章中看到的相同。在我们的下一篇文章中,我们将为这个应用程序添加样式,并尝试总结我们迄今为止为构建这个应用程序所做的工作。