ReactJS:如何在单击按钮时更改文本值

时间:2019-05-29 10:23:58

标签: reactjs text

我正在我的应用程序中创建一个表单,需要在其中添加数量字段。我从informed添加了一个<Text>组件来添加数量字段,并使用按钮来添加增量和减量功能。

但是在单击按钮时我无法设置文本组件的值。看来我只能为initialValue组件设置<Text>

import React, { Component } from 'react';
import { arrayOf, number, shape, string } from 'prop-types';

import classify from 'src/classify';
import defaultClasses from './quantity.css';
import { Text } from 'informed';

class Quantity extends Component {
    static propTypes = {
        classes: shape({
            root: string,
            increment_button: string,
            decrement_button: string,
            quantity_input: string
        }),
        items: arrayOf(
            shape({
                value: number
            })
        )
    };

    state = {
        quantity: 1,
        show: true,
        max: 9999,
        min: 1
    };

    incrementQty = () => {
        this.setState(prevState => {
            if(prevState.quantity < this.state.max) {
                return {
                    quantity: parseInt(prevState.quantity) + 1
                }
            } else {
                return null;
            }
        });
        /*this.setState({ quantity: parseInt(this.state.quantity) + 1 });*/
    };
    decrementQty = () => {
        this.setState(prevState => {
            if(prevState.quantity > this.state.min) {
                return {
                    quantity: parseInt(prevState.quantity) - 1
                }
            } else {
                return null;
            }
        });
        /*this.setState({ quantity: parseInt(this.state.quantity) - 1 });*/
    };
    setQuantity = quantity => this.setState({ quantity });
    handleChange = (event) => {
        this.setState({quantity: event.target.value});
    };

    render() {
        const { classes, ...restProps } = this.props;
        console.log(this.state.quantity);
        return (
            <div className={classes.root}>
            <span onClick={this.decrementQty} className={classes.decrement_button}>-</span>
            <Text
                initialValue = {`${this.state.min}`}
                className={classes.quantity_input}
                field="quantity"
                onChange={this.handleChange}
                value={this.state.quantity}
                label=""
            />
            <span onClick={this.incrementQty} className={classes.increment_button}>+</span>
            </div>
    );
    }
}

export default classify(defaultClasses)(Quantity);

我尝试使用value道具,但无法正常工作。如果我使用不受控制的html <input>字段,则按钮和数量增量递减有效,但我不想在表单中使用<input>元素。

2 个答案:

答案 0 :(得分:1)

也许您的代码应该是

 onChange={quantity => this.handleChange(quantity)}

和用于处理状态更新的代码

onChange = (e) => {
  this.setState({
    [e.target.name]: e.target.value
  });
}

答案 1 :(得分:1)

您是对的,得知Text没有道具value,我发现了一个技巧,只需单击一下按钮即可设置Text的值。

您可以在文本中使用React.createRef创建参考,然后通过该参考设置值。

class App extends React.Component {
  constructor(props) {
    super(props);
    this.ref = React.createRef();
  }
  state = {
    min: 10
  };
  changeQt = () => {
    this.ref.current.value = 20;
  };
  render() {
    return (
      <div className="App">
        <Text
          initialValue={`${this.state.min}`}
          field="quantity"
          onChange={this.handleChange}
          label=""
          ref={this.ref}
        />
        <button onClick={this.changeQt}>Click</button>
      </div>
    );
  }
}

Demo here.