是否可以在一个反应组件中有两种状态
Is it possible to have two states in one react component
我正在尝试构建一个简单的单位转换器来练习 React.js。我希望能够更改一个单位的值,例如:Kg,并让另一个单位,例如:lb 在屏幕上自动更改。请看这个网站给你一个想法:http://www.convertunits.com/from/lb/to/kg
我有以下代码,它呈现但单位不更新。我想知道的是:
- 一个组件有
two states
是否准确? 1 个 Kg
另一个 lb
- 或者他们需要
sibling components
?如果是这样,他们将如何更新彼此的 states
?
- 如果可以在同一个组件中同时拥有两个单元的状态,我做错了什么?
谢谢!
(我有一个简单的快速应用程序来呈现页面)
import React from 'react';
export default class Converter extends React.Component {
render() {
return (
<div className="convert">
<Range />
</div>
);
}
}
class Range extends React.Component {
constructor(props) {
super(props);
this.state = { kg: null, lb: null };
}
kgClick() {
this.setState({ lb: state.kg * 2.2046 });
}
lbClick() {
this.setState({ kg: state.lb / 2.2046 });
}
render() {
return (
<div>
<label> Kg: </label>
<input type="number" name="Kg" onChange={this.kgClick} value={this.state.kg} />
<label> Lb: </label>
<input type="number" name="Lb" onChange={this.lbClick} value={this.state.lb} />
</div>
);
}
}
后端逻辑:
var express = require('express');
var app = express();
app.set('port', (9000));
app.set('view engine', 'jsx');
app.set('views', __dirname + '/views');
app.engine('jsx', require('express-react-views').createEngine({ transformViews: false }));
require('babel/register')({
ignore: false
});
app.use('/', function(req, res) {
res.render('index', "");
});
app.listen(app.get('port'), function() {});
是的,在 React 组件中拥有多个状态 属性 是完全有效的(而且通常是必要的)。
您的主要问题是您从未将点击事件实例传递给处理函数。因此,该函数无法知道数字输入的值。此外,您需要更新函数中两个测量的状态。这是因为您将数字输入的值设置为等于该值的状态。当您更改输入中的数字时,除非您还更新状态,否则它实际上不会在该输入的渲染中更改。最后,正如 mattclemens 指出的那样,您应该确保正确绑定 this
。要么将它绑定到组件实例上(就像我在下面做的那样),要么在你的处理函数中使用 ES6 箭头符号。
考虑到所有这些,如果看起来像这样,您的 class 就可以工作了:
class Range extends React.Component {
constructor(props) {
super(props);
this.state = { kg: 0, lb: 0 };
}
kgClick(e) {
var newLb = e.target.value * 2.2046;
this.setState({ kg: e.target.value, lb: newLb });
}
lbClick(e) {
var newKg = e.target.value / 2.2046;
this.setState({ lb: e.target.value, kg: newKg });
}
render() {
return (
<div>
<label> Kg: </label>
<input type="number" name="Kg" onChange={this.kgClick.bind(this)} value={this.state.kg} />
<label> Lb: </label>
<input type="number" name="Lb" onChange={this.lbClick.bind(this)} value={this.state.lb} />
</div>
);
}
}
我正在尝试构建一个简单的单位转换器来练习 React.js。我希望能够更改一个单位的值,例如:Kg,并让另一个单位,例如:lb 在屏幕上自动更改。请看这个网站给你一个想法:http://www.convertunits.com/from/lb/to/kg
我有以下代码,它呈现但单位不更新。我想知道的是:
- 一个组件有
two states
是否准确? 1 个Kg
另一个lb
- 或者他们需要
sibling components
?如果是这样,他们将如何更新彼此的states
? - 如果可以在同一个组件中同时拥有两个单元的状态,我做错了什么?
谢谢! (我有一个简单的快速应用程序来呈现页面)
import React from 'react';
export default class Converter extends React.Component {
render() {
return (
<div className="convert">
<Range />
</div>
);
}
}
class Range extends React.Component {
constructor(props) {
super(props);
this.state = { kg: null, lb: null };
}
kgClick() {
this.setState({ lb: state.kg * 2.2046 });
}
lbClick() {
this.setState({ kg: state.lb / 2.2046 });
}
render() {
return (
<div>
<label> Kg: </label>
<input type="number" name="Kg" onChange={this.kgClick} value={this.state.kg} />
<label> Lb: </label>
<input type="number" name="Lb" onChange={this.lbClick} value={this.state.lb} />
</div>
);
}
}
后端逻辑:
var express = require('express');
var app = express();
app.set('port', (9000));
app.set('view engine', 'jsx');
app.set('views', __dirname + '/views');
app.engine('jsx', require('express-react-views').createEngine({ transformViews: false }));
require('babel/register')({
ignore: false
});
app.use('/', function(req, res) {
res.render('index', "");
});
app.listen(app.get('port'), function() {});
是的,在 React 组件中拥有多个状态 属性 是完全有效的(而且通常是必要的)。
您的主要问题是您从未将点击事件实例传递给处理函数。因此,该函数无法知道数字输入的值。此外,您需要更新函数中两个测量的状态。这是因为您将数字输入的值设置为等于该值的状态。当您更改输入中的数字时,除非您还更新状态,否则它实际上不会在该输入的渲染中更改。最后,正如 mattclemens 指出的那样,您应该确保正确绑定 this
。要么将它绑定到组件实例上(就像我在下面做的那样),要么在你的处理函数中使用 ES6 箭头符号。
考虑到所有这些,如果看起来像这样,您的 class 就可以工作了:
class Range extends React.Component {
constructor(props) {
super(props);
this.state = { kg: 0, lb: 0 };
}
kgClick(e) {
var newLb = e.target.value * 2.2046;
this.setState({ kg: e.target.value, lb: newLb });
}
lbClick(e) {
var newKg = e.target.value / 2.2046;
this.setState({ lb: e.target.value, kg: newKg });
}
render() {
return (
<div>
<label> Kg: </label>
<input type="number" name="Kg" onChange={this.kgClick.bind(this)} value={this.state.kg} />
<label> Lb: </label>
<input type="number" name="Lb" onChange={this.lbClick.bind(this)} value={this.state.lb} />
</div>
);
}
}