Axios вызывается, но не в моем обработчике событий

У меня странная ситуация, когда мой вызов AXIOS ajax выполняется, хотя вызов выполняется в обработчике событий. Поток следующий.

У меня есть ящик material-ui, в котором есть элемент списка, который меняет местами компонент на моей главной странице. У этого компонента есть кнопка отправки, которая вызывает Axios к REST API, но она вызывается в обработчике событий из ListItem не тогда, когда я нажимаю кнопку «Отправить».

Вот код:

handleSubmit() {
    // var apiBaseUrl = "http://localhost:4000/api/";
    const apiBaseUrl = "http://localhost:8000/";
    axios.defaults.withCredentials = true;
    const self = this;
    const payload = {
        "to": this.state.to + " " + this.state.toTime,
        "from": this.state.from + " " +this.state.fromTime
    };
    axios.defaults.xsrfCookieName = 'csrftoken';
    axios.defaults.xsrfHeaderName = 'X-CSRFToken';
    axios.post(apiBaseUrl + 'api/SaveSchedule/', payload, { headers: {'Accept': 'application/json'} } )
        .then ( (response)  => {
            if (response.status == 200) { }
            else if (response.status == 400) {
                console.info("");
            } else {
                console.info(" ");
                alert(" ");
            }
        })
        .catch(function (error) {
            if (error.response.status==400){
                alert("Check your credentials at arlo.netgear.com. Invalid email or password. ");
                console.info("Data:" + error.response.data);
                console.info("Status: " + error.response.status);
                console.info("Headers: " + error.response.headers);
                console.info("Error: "+ error);
            } else if (error.response) {
            } else if (error.request) {
                // The request was made but no response was received
                // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
                // http.ClientRequest in node.js
                console.info(error.request);
            }
        });
}

ОКАЗЫВАТЬ:

render() {
    const { from, to } = this.state;
    const modifiers = { start: from, end: to };
    return (
        <div className = "InputFromTo">
            ...
            <form noValidate autoComplete = "off">
            <TextField
                id = "starttime-placeholder"
                label = "Start Time:"
                placeholder = "Enter Start Time"
                margin = "normal"
                />
            <TextField
                id = "endtime-placeholder"
                label = "End Time"
                placeholder = "Enter End Time"
                margin = "normal"
                /><br/>
                <Button variant = "raised" color = "primary" onClick = {this.handleSubmit}>Save Schedule</Button>
            </form>
            ...
        </div>
    )
}

ИЗМЕНИТЬ Кроме того, в моем ящике есть ListItem. Здесь делается звонок.

  handleListSelect(event) {
    this.props.onDrawerSelect(event.target.value);
}

render() {
    return (
        <div>
            <ListItem button>
                <ListItemIcon>
                    <ScheduleIcon/>
                </ListItemIcon>
                <ListItemText primary = "Scheduler" onClick = {this.handleListSelect}/>
            </ListItem>

Мне интересно, заставляет ли тот факт, что я использую обработчик props, это отправить какое-то событие моим детям (фактический компонент, который имеет это событие)?

не могли бы вы уточнить, что вы имеете в виду, когда говорите: «даже если вызов выполняется в обработчике событий»?

twils0 13.06.2018 18:53

Конечно. Единственное место, где выполняется вызов axios, - это мое событие handleSubmit. По какой-то причине, когда компонент загружен, он вызывается асинхронно и вне обработчика событий. Этого не должно происходить. Не знаю почему.

Axwack 13.06.2018 20:11

К вашему сведению - вы можете установить axios.defaults.baseURL = apiBaseURL вместо того, чтобы вручную добавлять его в urlString. Вы создаете экземпляр axios где-то еще? Я чувствую, что мы не сможем решить эту проблему только с помощью этого кода. Как вы упомянули, он должен быть вызван откуда-то еще (вне обработчика событий).

twils0 13.06.2018 20:48

Я посмотрел, но никто не звонил. Только на этом.

Axwack 13.06.2018 20:55

Зачем это вообще вызывается при загрузке компонента?

Axwack 13.06.2018 20:55

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

twils0 13.06.2018 21:05

Позвольте нам продолжить обсуждение в чате.

Axwack 14.06.2018 15:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
7
1 043
1

Ответы 1

Это связано с тем, как вы вызываете this.props.onClick внутри вашего компонента <Button/>. Вероятно, то, что вы делаете внутри компонента <Button/>, похоже на этот onClick = {this.props.onClick()}. Делая это, вы вызываете функцию из-за ().

Вместо этого вы можете просто передавать ссылку на функцию handleSubmit, выполняя этот onClick = {this.props.onClick} внутри компонента <Button/>.

Если вы решите обернуть handleSubmit функцией стрелки, вы будете создавать новую функцию каждый раз при рендеринге компонента. onClick = {() => this.handleSubmit()}.

В этом последнем сценарии вам нужно будет использовать () для запуска функции. Сделайте это только один раз: либо с this.handleSubmit(), либо с this.props.onClick(), но не с обоими.

Надеюсь, это сработает для вас!

Я не собираюсь отрицать или что-то в этом роде, но я думаю, ты должен пересмотреть свой ответ, Стив. Вы хотите сказать, что включение onClick = {this.someFunction} в кнопку приведет к срабатыванию someFunction при монтировании этой кнопки? Если так, то это неверно.

twils0 13.06.2018 19:52

Я пытаюсь добавить событие жизненного цикла.

Axwack 13.06.2018 20:54

@ twils0 вы, наверное, правы. Я обновлю свой ответ на то, что считаю более точным. Спасибо!

Steve Lee Marreros Chuco 13.06.2018 21:40

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