Вызов `componentDidUpdate` при отправке формы

У меня есть компонент класса:

class App extends Component {
    constructor(props){
        super(props);
        this.state = {
            abc: '',
            someQuery: ''
        }
        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleChangeEvent = this.handleChangeEvent.bind(this);
    }

    componentDidUpdate(){
        fetch(`/someLink/${this.state.abc}`)
        .then(response => {
            return response.json();
        }).then(data => {
            this.setState({
                someQuery: data.xxx
            });
        });
    }
    handleSubmit(e){
        const target = e.target;
        const value = target.value;

        this.setState({
            abc: value
        })
        e.preventDefault();
    };
    handleChangeEvent(e){
        const target = e.target;
        const value = target.value;

        this.setState({
            abc: value
        });
    };
    render(){
        return(
            <form onSubmit = {this.handleSubmit}>
                <input name='abc' value = {this.state.abc} onChange = {this.handleChangeEvent} />
                <input type = "submit" value = "Submit" />
            </form>

            <div>{this.state.abc} is currently accessing data from {this.state.someQuery}</div>
        )
    }
}

Как мне запускать componentDidUpdate() каждый раз, когда я обновляю значение поля ввода и нажимаю кнопку отправки?

Вышеупомянутое вызывает жизненный цикл, но из-за setState в handleChangeEvent() жизненный цикл вызывается в тот момент, когда я что-то набираю, и не дожидается нажатия кнопки отправки.

Удаление setState из handleChangeEvent() делает значение поля ввода недоступным для редактирования (невозможно ввести в поле ввода).

Мне нужно, чтобы значение поля ввода было добавлено к api link в жизненном цикле, но я не могу понять, как это сделать.

Используйте defaultValue вместо value во вводе.

devserkan 26.05.2018 01:20

Почему бы не добавить условие в componentDidMount, чтобы узнать, была ли форма отправлена ​​или нет?

Barazu 26.05.2018 01:22
Поведение ключевого слова "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) для оценки ваших знаний,...
2
2
1 781
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете добавить любой метод в класс компонента и вызвать его при отправке. componentDidUpdate - неподходящее место для таких вещей, особенно установка состояния - это преступление: D

class App extends Component {
    constructor(props){
        super(props);
        this.state = {
            abc: '',
            someQuery: ''
        }
        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleChangeEvent = this.handleChangeEvent.bind(this);
    }

    doSommething (value){
        fetch(`/someLink/${value}`)
        .then(response => {
            return response.json();
        }).then(data => {
            this.setState({
                someQuery: data.xxx
            });
        });
    }
    handleSubmit(e){
        const target = e.target;
        const value = target.value;

        this.setState({
            abc: value
        })
        e.preventDefault();
        doSommething(value);
    };
    handleChangeEvent(e){
        const target = e.target;
        const value = target.value;

        this.setState({
            abc: value
        });
    };
    render(){
        return(
            <form onSubmit = {this.handleSubmit}>
                <input name='abc' value = {this.state.abc} onChange = {this.handleChangeEvent} />
                <input type = "submit" value = "Submit" />
            </form>

            <div>{this.state.abc} is currently accessing data from {this.state.someQuery}</div>
        )
    }
}

Я где-то читал, что выборка api должна вызываться в жизненном цикле `componentDidUpdate ', поэтому я выбрал исходный подход, описанный выше. Спасибо за помощь Zohaib.

AndrewL64 26.05.2018 02:50

@AndrewL Нет, это componentDidMount, а не componentDidUpdate. и это для случаев, когда вы хотите получить данные из api, которые будут отображаться в ближайшее время, но не для таких вызовов api, которые будут часто извлекаться при каком-либо щелчке или каком-либо событии. Используйте простой способ, как в вашем коде onSubmit

Zohaib Ijaz 26.05.2018 02:54

Итак, для API, который не отображает данные мгновенно, я должен использовать componentDidMount?

AndrewL64 26.05.2018 02:58

@AndrewL Нет, извините за неправильный выбор слов. позволь мне объяснить. например если вы хотите показать список пользователей, и данные будут поступать из api, вам необходимо получить данные в componentDidMount, вызвав многократно используемый метод, который фактически будет извлекать данные из api. и вы можете вызвать этот многоразовый метод позже в каком-то событии, например, при удалении пользователя, который обновит данные списка пользователей

Zohaib Ijaz 26.05.2018 03:04

Ох, хорошо. Спасибо за объяснение Zohaib

AndrewL64 26.05.2018 03:05

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