【问题标题】:React Typescript - set two values into stateReact Typescript - 将两个值设置为状态
【发布时间】:2020-04-21 20:47:25
【问题描述】:

我有一个包含 3 个数字字段的表单。用户可以输入数量和单价。然后会将最后一个字段中的总价显示为禁用字段。

我当前的代码在Total Price 输入字段中正确设置了值,但是无法设置状态。

例如,如果用户输入Quantity 等于4UnitPrice25this.state.TotalPrice 应该是 100

handleChangeQuantity(event) {
    const { value } = event.target;
    this.setState({ Quantity: value }); 
}   

handleChangeUnitPrice(event) {
    const { value } = event.target;
    this.setState({ UnitPrice: value }); 
}

handleChangeTotalPrice(event) {
    const { TotalPrice } = event.target.value;
    this.setState({ 
        TotalPrice: this.state.Quantity * this.state.UnitPrice
    }); 
}   


<div>
    <label>
        Quantity
    </label>
    <input
        value={this.state.Quantity}
        onChange={this.handleChangeQuantity}
        type="number"
        className="phone validate"
        name="Quantity #1"
        maxLength={9}
        pattern='[0-9]{0,5}'
    />
</div>

<div>
    <label>
        Unit Price
    </label>
    <input
        value={this.state.UnitPrice}
        onChange={this.handleChangeUnitPrice}
        type="number"
        className="phone validate"
        name="Unit Price #1"
        maxLength={15}
        pattern='[0-9]{0,5}'
    />
</div>

<div>
    <label>
        Total Price
    </label>
    <input
        value={this.state.Quantity * this.state.UnitPrice}
        onChange={this.handleChangeExtendedPrice}
        type="number"
        className="phone validate"
        name="Estimated Extended Price #1"
        disabled
    />
</div>

【问题讨论】:

  • 勾选这个在数量和单价变化时触发handleChangeTotalPrice函数..codesandbox.io/s/react-typescript-starter-41ef3
  • @ManirajMurugan 它没有。当我更改数量或单价时,handleChangeTotalPrice 不会触发
  • 除非您调用该函数,否则它不会触发。不,您在哪里调用 handleChangeTotalPrice ,那么该函数将如何运行?分叉上面的代码沙箱并包含您的确切问题并详细解释需要..查看上面提供的沙箱控制台,同时更改数量和价格的值..状态中的TotalPrice值将被记录..
  • @ManirajMurugan 我在创建沙箱时遇到了麻烦。我的问题是使用handleChangeTotalPrice 有必要吗?我要做的就是当用户输入一个数量和单价来设置总价的状态。那么有没有更好的方法来保存呢?
  • 我已经发布了答案..很高兴为您提供帮助..

标签: javascript reactjs typescript react-native setstate


【解决方案1】:

在最后一个输入字段 totalPrice 中,您可以将值设置为,

value={this.state.TotalPrice}

所以你可以设置状态值,

handleChangeTotalPrice = () => {
    this.setState({
      TotalPrice: this.state.Quantity * this.state.UnitPrice,
    })
    console.log(this.state.TotalPrice)
  }

因此,只要数量和价格发生变化,您就可以调用handleChangeTotalPrice 函数..

TotalPrice 的状态值会相应更新。

你可以像下面这样改变你的代码,

import React from 'react'

export class App extends React.Component {
  state = {
    Quantity: 0,
    UnitPrice: 0,
    TotalPrice: 0,
  }

  handleChangeQuantity = async (event: any) => {
    const { value } = event.target
    await this.setState({ Quantity: value })
    this.handleChangeTotalPrice()
  }

  handleChangeUnitPrice = async (event: any) => {
    const { value } = event.target
    await this.setState({ UnitPrice: value })
    this.handleChangeTotalPrice()
  }

  handleChangeTotalPrice = () => {
    this.setState({
      TotalPrice: this.state.Quantity * this.state.UnitPrice,
    })
    console.log(this.state.TotalPrice)
  }

  render() {
    return (
      <div>
        <div>
          <label>Quantity</label>
          <input
            value={this.state.Quantity}
            onChange={this.handleChangeQuantity}
            type="number"
            className="phone validate"
            name="Quantity #1"
            maxLength={9}
            pattern="[0-9]{0,5}"
          />
        </div>

        <div>
          <label>Unit Price</label>
          <input
            value={this.state.UnitPrice}
            onChange={this.handleChangeUnitPrice}
            type="number"
            className="phone validate"
            name="Unit Price #1"
            maxLength={15}
            pattern="[0-9]{0,5}"
          />
        </div>

        <div>
          <label>Total Price</label>
          <input
            value={this.state.TotalPrice}
            type="number"
            className="phone validate"
            name="Estimated Extended Price #1"
            disabled
          />
        </div>
      </div>
    )
  }
}

Working Sandbox

【讨论】:

    【解决方案2】:

    对于初学者,我会将 jsx 放入渲染方法中:

    render() {
      const { Quantity, UnitPrice } = this.state;
      return (
      <>
        <div>
          <label>
            Quantity
          </label>
          <input
            value={Quantity}
            onChange={this.handleChangeQuantity}
            type="number"
            className="phone validate"
            name="Quantity #1"
            maxLength={9}
            pattern='[0-9]{0,5}'
          />
        </div>
    
        <div>
          <label>
            Unit Price
          </label>
          <input
            value={UnitPrice}
            onChange={this.handleChangeUnitPrice}
            type="number"
            className="phone validate"
            name="Unit Price #1"
            maxLength={15}
            pattern='[0-9]{0,5}'
          />
        </div>
    
        <div>
          <label>
            Total Price
          </label>
          <input
            value={Quantity * UnitPrice}
            onChange={this.handleChangeExtendedPrice}
            type="number"
            className="phone validate"
            name="Estimated Extended Price #1"
            disabled
          />
        </div>
      </>
      );
    }
    

    这应该有助于解决您的问题: React setState not updating state

    这里是代码的工作版本的代码笔链接。我拿出了classNames和其他东西。随意玩弄它。 https://codepen.io/maksimmamrikov/pen/jObVKbZ?editors=1010

    【讨论】:

    • 谢谢你!在我的情况下,handleChangeTotalPrice(event) 似乎永远不会被触发。我收到一条错误消息,提示 const { ExtendedPrice } 从未被读取。
    • 在你的输入中试试这个:onChange={(e) =&gt; this.handleChangeUnitPrice(e)}。应该触发它
    • 奇怪...我仍然无法触发该功能。在我的渲染中,当我执行{this.state.this.state.TotalPrice} 时,它会在我调整其他字段时更改价格。只是不会触发处理程序来设置状态。
    • 我在答案中添加了代码笔链接。当您调整数量或单价时,我工作 + 更新总价。如果这解决了您的问题,我们将不胜感激。谢谢!
    • 谢谢!你能仔细检查你发送的链接吗?看起来是一个空的代码笔。
    猜你喜欢
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2020-02-09
    • 2020-09-20
    相关资源
    最近更新 更多