Вызвать `componentDidUpdate` при отправке формы - PullRequest
0 голосов
/ 26 мая 2018

У меня есть компонент класса следующим образом:

class App extends Component {
    constructor(props){
        super(props);
        this.state = {
            abc: '',
            someQuery: ''
        }
        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleChange = this.handleChange.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();
    };
    handleChange(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.handleChange} />
                <input type="submit" value="Submit" />
            </form>

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

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

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

Удаление setState из handleChange() делает значение поля ввода больше не редактируемым (косой тип в поле ввода).

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

1 Ответ

0 голосов
/ 26 мая 2018

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

class App extends Component {
    constructor(props){
        super(props);
        this.state = {
            abc: '',
            someQuery: ''
        }
        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleChange = this.handleChange.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);
    };
    handleChange(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.handleChange} />
                <input type="submit" value="Submit" />
            </form>

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