React-bootstrap ToggleButtonGroup использует старое значение при вызове

У меня есть форма, использующая ToggleButtonGroup из react-bootstrap. Мне нужно изменить некоторые текстовые значения в форме на основе значения, выбранного в переключателе. Проблема в том, что при вызове onChange на кнопку - я получил ранее выбранное значение переключателя, а не новое.

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

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

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

Может ли кто-нибудь предложить, как это исправить?

Обновлено: Очень странная вещь происходит, когда я пытаюсь прочитать значение в моей ссылке:

console.info(this.tradeInput.current) показывает правильное обновленное значение в current.props.value, но если я попытаюсь напечатать console.info(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?

KOTIOS 25.04.2019 14:03

Теоретически могу, но я предпочитаю использовать рефы, так как есть и другие входы, для которых я отслеживаю изменения, поэтому мне нужно, чтобы эта функция была универсальной.

Smajl 25.04.2019 14:08

Изменить this.tradeInput.current.props.value на this.tradeInput.current.value

KOTIOS 25.04.2019 14:11

@KOTIOS это дает мне undefined

Smajl 25.04.2019 14:13

похоже, вы неправильно привязали обработчик onChange, попробуйте привязать его, как this.handleChangeEvent.bind(this) onChange

KOTIOS 25.04.2019 14:29

@KOTIOS Спасибо за предложение. Я пытался добавить привязку, но это не помогает.

Smajl 25.04.2019 14:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
1 126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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();
}

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

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

Это работает только тогда, когда я реагирую на изменение кнопки переключения. Это не работает, если какой-либо другой ввод формы изменяется, и мне нужно получить текущее значение моего переключателя.

Smajl 25.04.2019 14:29

сохраните свое значение в состоянии, и вы можете получить к нему доступ в любом месте... зачем усложнять....

sathish kumar 25.04.2019 14:34

Я понимаю. Есть одна последняя проблема. Мое состояние кажется на одно значение ниже значения события. Похоже, что event.target.value и state.whatever не синхронизированы, и состояние всегда отстает на одно значение.

Smajl 25.04.2019 14:47

обновите свой код тем, что вы пробовали. так будет лучше.

sathish kumar 25.04.2019 14:51

Я разместил весь код, за исключением совершенно не относящихся к делу частей.

Smajl 25.04.2019 14:57

вам не нужен e.target.. параметр handlechange имеет только значение... поэтому используйте его напрямую. и добавьте значение в <ToggleButtonGroup value = {this.state.trade}/ >

sathish kumar 25.04.2019 15:03

Давайте продолжить обсуждение в чате.

sathish kumar 25.04.2019 15:04

Другие вопросы по теме