reactjs - 反应错误的数字运算结果
问题描述
我是 React 的新手,我正在使用一个简单的应用程序,我需要读取一些数字并使用它们进行操作。问题是我总是得到奇怪的结果。例如,调试我得到:
CALCULANDO 8 * 4 = 64
CALCULANDO 8 * 2 = 64
CALCULANDO 8 * 23 = 64
CALCULANDO 1 * 23 = 1
CALCULANDO 1 * 2 = 1
CALCULANDO 12 * 2 = 144
CALCULANDO 1 * 2 = 1
CALCULANDO 1 * 2 = 1
查看输出,我假设 te 值已被很好地读取,并且我检查了我是否等待 setState 完成,但我无法找出问题所在。完整的代码是:
import Distribution from './Distribution';
import React, {Component} from 'react';
import NumberField from '../Components/NumberField';
class Binomial extends Component {
constructor (props) {
super(props);
this.changeN = this.changeN.bind(this);
this.changeP = this.changeP.bind(this);
this.state={
name: "Binomial",
p: 0,
n: 0,
media: 0,
varianza: 0
}
}
calcularTodo(){
this.calcularMedia();
this.calcularVarianza();
}
calcularMedia(){
if(this.state.p === 0|| this.state.n === 0)
this.setState({media: 0})
else{
let result = Number(this.state.n) * Number(this.state.n);
console.log("CALCULANDO " + this.state.n + " * " + this.state.p + " = " + result)
this.setState({media: result})
}
}
calcularVarianza(){
this.setState({varianza: 2})
}
render(){
return(
<div>
<NumberField label={"p"} handleChange={this.changeP}/>
<NumberField label={"n"} handleChange={this.changeN}/>
<Distribution name={this.state.name} media={this.state.media} varianza={this.state.varianza}/>
</div>
)
}
changeP = async function (event){
await this.setState({p: Number(event.target.value)});
this.calcularTodo();
}
changeN = async function (event){
await this.setState({n: Number(event.target.value)});
this.calcularTodo();
}
}
export default Binomial;
其他模块是:
import React, {useState, Component} from 'react';
import {TextField} from "@material-ui/core";
class NumberField extends Component{
render(){
return (
<TextField
label="None"
id="margin-none"
label={this.props.label}
variant="outlined"
type={Number}
onChange={this.props.handleChange}
/>
)
}
}
export default NumberField;
和
import React, {Component} from 'react';
import {Table} from '../Components/Table'
import NumberField from '../Components/NumberField'
class Distribution extends Component{
constructor () {
super();
}
render(){
return(
<div>
<this.props.name/>
<Table _media={this.props.media} _varianza={this.props.varianza}/>
</div>
)
}
}
export default Distribution;
我很感激任何帮助。谢谢。
解决方案
再看一遍我认为石板状态不是问题,问题是您正在尝试计算依赖于其他人的值并立即更新它们,因为反应批次状态更新它将采用以前的值进行计算。您可以通过两种方式解决它,创建更新程序功能或使用componentDidUpdate
更新函数
class Binomial extends Component {
...
updateState(updates) {
this.setState(prevState => {
const newState = { ...prevState, ...updates };
return {
...newState,
media: this.calcularMedia(newState),
varianza: this.calcularVarianza(),
};
});
}
calcularMedia(state) {
if (state.p === 0 || state.n === 0) return 0;
let result = Number(state.n) * Number(state.n);
console.log('CALCULANDO ' + state.n + ' * ' + state.p + ' = ' + result);
return result;
}
calcularVarianza() {
return 2;
}
render() {
...
}
changeP = async function(event) {
await this.updateState({ p: Number(event.target.value) });
};
changeN = async function(event) {
await this.updateState({ n: Number(event.target.value) });
};
}
组件DidUpdate
class Binomial extends Component {
...
componentDidUpdate(_prevProps, prevState) {
if (prevState.p !== this.state.p || prevState.n !== this.state.n) {
this.calcularTodo();
}
}
calcularTodo() {
this.calcularMedia();
this.calcularVarianza();
}
calcularMedia() {
if (this.state.p === 0 || this.state.n === 0) this.setState({ media: 0 });
else {
let result = Number(this.state.n) * Number(this.state.n);
console.log('CALCULANDO ' + this.state.n + ' * ' + this.state.p + ' = ' + result);
this.setState({ media: result });
}
}
calcularVarianza() {
this.setState({ varianza: 2 });
}
render() {
...
}
changeP = async function(event) {
await this.setState({ p: Number(event.target.value) });
};
changeN = async function(event) {
await this.setState({ n: Number(event.target.value) });
};
}
推荐阅读
- php - 如何在单元测试中断言生成文件的内容
- python - python feedparser并在一个项目中获取多个类别(类别)
- android - 我的 Android Takeaway 应用程序不会在 Gmail 中填充主题和正文,但可以与 Outlook 配合使用
- python - 使用多处理时设置池映射操作的时间限制?
- postgresql - 在 Postgres 中设置 search_path 是否会阻塞?
- machine-learning - 如何在 pytorch 中从预训练模型创建子模型,而无需重写整个架构?
- database - 数据库应该避免删除资源吗?
- python - 从另一个 .py 导入变量而不运行模块
- javascript - 如何知道在多条件打字稿中哪个条件失败
- css - Angular 材质 Sass 通过全局 scss 文件上的 map-get 和深色主题动态获取样式