【问题标题】:React-bootstrap ToggleButtonGroup uses old value when callingReact-bootstrap ToggleButtonGroup 在调用时使用旧值
【发布时间】:2019-04-25 12:00:49
【问题描述】:

我有一个使用来自react-bootstrap 的 ToggleButtonGroup 的表单。我需要根据切换中选择的值更改表单中的一些文本值。问题是当在按钮上调用onChange 时 - 我得到了之前选择的切换值,而不是新的值。

constructor(props) {
    super(props);  
    this.tradeInput = React.createRef();
}

handleChange() {
    console.log(this.tradeInput.current.props.value); // old value printed here
}

<ToggleButtonGroup type="radio" name="trade" defaultValue="BUY" ref={this.tradeInput} onChange={e => this.handleChange(e)}>
    <ToggleButton value="BUY">BUY</ToggleButton>
    <ToggleButton value="SELL">SELL</ToggleButton>
</ToggleButtonGroup>

有人可以建议如何解决这个问题吗?

编辑:当我尝试读取参考中的值时,发生了非常奇怪的事情:

console.log(this.tradeInput.current)current.props.value 中显示正确的更新值,但如果我尝试使用完全相同的输入打印console.log(this.tradeInput.current.props.value),它会给我不同的结果(旧值)。

EDIT2:完整更新的代码

class ResourceTradePanel extends React.Component {
    constructor(props) {
        super(props);

        this.state = { 
            validated: false,
            caps: 0,
            junk: 0,
            food: 0,
            trade: "BUY"
        };

        this.handleJunkChange.bind(this);
        this.handleFoodChange.bind(this);
        this.handleTradeChange.bind(this);
        this.updateCaps.bind(this);
        this.handleSubmit.bind(this);
    }

    handleSubmit(event) {
      ...
    }

    handleJunkChange(event) {
        this.setState({ 
            junk: event.target.value
        });
        this.updateCaps();
    }

    handleFoodChange(event) {
        this.setState({ 
            food: event.target.value
        });
        this.updateCaps();
    }

    handleTradeChange(event) {
        this.setState({ 
            trade: event.target
        });
        this.updateCaps();
    }

    updateCaps() {
        var capsInfo = 0;
        const junk = parseInt(this.state.junk);
        const food = parseInt(this.state.food);
        if (this.state.trade === "BUY") {
            capsInfo = (junk + food) * 2;
        } else if (this.state.trade === "SELL") {
            capsInfo = junk + food;
        };

        this.setState({ 
            caps: capsInfo
        });
    }

    render() {
        return <Card>
            <Card.Body>
                ...
                <Form 
                    id="resourceForm"
                    noValidate
                    validated={this.state.validated}
                    onSubmit={e => this.handleSubmit(e)}
                >
                            <InputGroup className="mb-3">
                                <FormControl
                                    name="junk"
                                    type="number"
                                    min={0}
                                    max={10}
                                    value={this.state.junk}
                                    onChange={e => this.handleJunkChange(e)}
                                />
                                <Form.Control.Feedback type="invalid">
                                    <Translate id="labels.resourceLimitExceeded" />
                                </Form.Control.Feedback>
                            </InputGroup>
                            <InputGroup className="mb-3">
                                <FormControl
                                    name="food"
                                    ref={this.foodInput}
                                    type="number"
                                    min={0}
                                    max={10}
                                    value={this.state.food}
                                    onChange={e => this.handleFoodChange(e)}
                                />
                                <Form.Control.Feedback type="invalid">
                                    <Translate id="labels.resourceLimitExceeded" />
                                </Form.Control.Feedback>
                            </InputGroup>
                            <InputGroup>
                                <FormControl
                                    type="number"
                                    disabled
                                    value={this.state.caps}
                                />
                            </InputGroup>
                            <ToggleButtonGroup type="radio" name="trade" defaultValue={this.state.trade} onChange={e => this.handleTradeChange(e)}>
                                <ToggleButton variant="outline-dark" value="BUY"><Translate id="labels.buy" /></ToggleButton>
                                <ToggleButton variant="outline-dark" value="SELL"><Translate id="labels.sell" /></ToggleButton>
                            </ToggleButtonGroup>
                </Form>
            </Card.Body>
        </Card>
    }
};

【问题讨论】:

  • 你能尝试从e.target.value获得价值吗?
  • 理论上,我可以,但我更喜欢使用 refs,因为我会跟踪其他输入的变化,所以我需要这个函数是通用的。
  • this.tradeInput.current.props.value 更改为this.tradeInput.current.value
  • @KOTIOS 这给了我undefined
  • 看来你没有正确绑定 onChange Handler 尝试像this.handleChange.bind(this) on onChange 一样绑定它

标签: javascript reactjs forms react-bootstrap


【解决方案1】:

我终于找到了问题...试试这个

    handleTradeChange(event) {
     // trigger you updateCaps() after updated the current state.
        this.setState({ 
            trade: event.target
        },()=> this.updateCaps(););

    }

试试这个,你可以在任何地方使用 this.state.tradeValue 访问你的切换按钮当前值

constructor(props) {
    super(props); 
    this.state = {
      tradeValue : "BUY" 
    } 
    this.tradeInput = React.createRef();
}

handleChange(value) {
    this.setState({ tradeValue : value})
}

<ToggleButtonGroup type="radio" name="trade" value={this.state.tradeValue}  onChange={this.handleChange}>
    <ToggleButton value="BUY">BUY</ToggleButton>
    <ToggleButton value="SELL">SELL</ToggleButton>
</ToggleButtonGroup>

【讨论】:

  • 这仅在我对切换按钮的更改做出反应时才有效。如果某些其他表单输入发生更改并且我需要获取切换的当前值,则它不起作用。
  • 将您的值存储在状态中,您可以在任何地方访问它......为什么要变得更复杂......
  • 我明白了。最后一个问题。我的状态似乎是事件价值背后的一个价值。好像 event.target.value 和 state.whatever 没有同步,状态总是落后一个值。
  • 用您尝试过的内容更新您的代码。这样会更好。
  • 我发布了整个代码,除了完全不相关的部分。
猜你喜欢
  • 2018-01-16
  • 2021-03-11
  • 2021-07-04
  • 2020-05-11
  • 2017-11-19
  • 2014-03-24
  • 2021-10-24
  • 2023-01-12
  • 2017-04-08
相关资源
最近更新 更多