【问题标题】:Is it possible to have two states in one react component一个反应组件中是否可以有两种状态
【发布时间】:2016-03-20 07:26:08
【问题描述】:

我正在尝试构建一个简单的单位转换器来练习 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() {});

【问题讨论】:

  • 快速查看您的代码,确保您的事件处理程序(lbCLickkgClick)得到正确的this。使用 ES6 类的 React 组件不再将 this 自动绑定到非 React 方法 This blog post 涵盖了您面临的一些潜在问题
  • 感谢您的精彩文章!

标签: javascript reactjs components state


【解决方案1】:

是的,在 React 组件中拥有多个 state 属性是完全有效的(并且通常是必要的)。

您的主要问题是您永远不会将点击事件实例传递给处理函数。因此,该函数无法知道数字输入的值。此外,您需要更新函数中两个测量的状态。这是因为您将数字输入的值设置为等于该值的状态。当您更改输入中的数字时,除非您也更新状态,否则它实际上不会在该输入的呈现中发生变化。最后,正如 mattclemens 指出的那样,您应该确保正确绑定 this。要么将它绑定到组件实例上(就像我在下面做的那样),要么在你的处理函数中使用 ES6 箭头符号。

考虑到所有这些,如果您的课程看起来像这样,您的课程将可以正常工作:

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>
    );
  }
}

【讨论】:

  • 感谢您的回复。我阅读了这篇文章并修改了我的代码,但它仍然不起作用。我已经尝试过constructor(props) { super(props); this.state = { kg: 0, lb: 0 }; this.kgClick = this.kgClick.bind(this); this.lbClick = this.lbClick.bind(this); } 和 ES6 箭头函数表示法,但两种方法都不起作用。
  • 我是个笨蛋。我刚刚意识到出了什么问题。我会更新我的答案给你看。
  • 好的,我更新了我的答案。我希望一切都说得通。如果您需要更多说明,请告诉我。我刚刚尝试了那个确切的课程,它对我有用。
  • 非常感谢您抽出宝贵时间提供帮助。真的很奇怪,我尝试了您粘贴的代码,但它不起作用。您是在后端使用 express 代码还是其他什么?
  • 好的,我将环境更改为从客户端渲染,它可以工作!谢谢你的帮助,你是个传奇。学到了很多。
猜你喜欢
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
相关资源
最近更新 更多