Автоматическое обновление Axios с помощью React

Я медленно начинаю свое приключение с React и сижу над этой проблемой несколько дней, хотел изучить аксиомы. Итак, я создаю библиотеку фильмов на основе серверного пакета Json. Все работает очень хорошо, просто я не могу сделать автоматическое обновление после каждого действия, такого как добавление редактирования или удаление нового фильма. Я знаю, что мне нужно каким-то образом передать функцию getMovie в раздел editMovie, deleteMovie и addMovie, но я совершенно не знаю, как это сделать. Я помещаю getMovie в функцию и передаю его componentDidMount для запуска в самом начале, но я не знаю, как передать его в компонент формы, чтобы поместить его в функции редактирования / удаления / добавления. Я пытался сделать это через функцию экспорта, но не вышло. вероятно, мне нужно сделать это через реквизит, но он также не хочет работать на меня :( Я был бы очень благодарен за любую помощь, так как у меня нет идей.

Компонент формы

class Form extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            name: '',
            type: '',
            description: '',
            id: '',
            movies: [],
            errors: "",
        }
    }


    handleChangeEventOne = e => {
        this.setState({
            name: e.target.value
        })
    }
    handleChangeEventTwo = e => {
        this.setState({
            type: e.target.value
        })
    }
    handleChangeEventThree = e => {
        this.setState({
            description: e.target.value
        })
    }


    handleSubmit = e => {
        e.preventDefault()
        const url = `http://localhost:3000/movies/`;
        if (this.state.name != "" && this.state.type != "" && this.state.description != "") {
            axios
                .post(url, {
                    name: this.state.name,
                    type: this.state.type,
                    description: this.state.description,
                    id: this.state.id
                })
                .then(res => {
                    // console.info(res);
                    // console.info(res.data);
                    this.setState({
                        movies: [this.state.name, this.state.type, this.state.description, this.state.id]
                    })
                })
        }
        else {
            this.setState({
                errors:"Please, Fill all forms above"
            })
        }
    }

    handleRemove = e => {
        // const url = `http://localhost:3000/movies/`;
        const url = `http://localhost:3000/movies/${e.id}`;
        axios
            .delete(url)
            .then(res => {
                console.info(res.data);
            })
            .catch((err) => {
                console.info(err);
            })
    }

    editMovie = e => {
        if (this.state.name != "" && this.state.type != "" && this.state.description != "") {
            const url = `http://localhost:3000/movies/${e.id}`;
            axios
                .put(url, {
                    name: this.state.name,
                    type: this.state.type,
                    description: this.state.description,
                })
                .then(res => {
                    console.info(res.data);
                })
                .catch((err) => {
                    console.info(err);
                })
        }
        else {
            this.setState({
                errors:"Please, Fill all forms to edit movie"
            })
        }
    }



    render() {


        return (
            <div>
                <form onSubmit = {this.handleSubmit}>
                    <input type = "text" placeholder = "Movie" onChange = {this.handleChangeEventOne}/>
                    <input type = "text" placeholder = "Type of movie" onChange = {this.handleChangeEventTwo}/>
                    <textarea placeholder = "Description of the movie"
                              onChange = {this.handleChangeEventThree}></textarea>
                    <input id = "addMovie" type = "submit" value = "Add movie" ></input>
                    <p>{this.state.errors}</p>
                </form>
                <List removeClick = {this.handleRemove} editClick = {this.editMovie}/>
            </div>
        )
    }
}

Компонент списка

class List extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            movies: [],
        }
    }

    componentDidMount() {
        this.getMovie()

    }
     getMovie = () => {
        const url = `http://localhost:3000/movies`;
        console.info(url);
        axios
            .get(url)
            .then(res => {
                console.info(res.data);
                const movies = res.data;
                this.setState({
                    movies: movies,
                })
            })
            .catch((err) => {
                console.info(err);
            })
        }
    // }




    editMovie = (event, e) => {
        event.preventDefault();
        console.info("it works with edit!");
        if (typeof this.props.editClick === "function") {
            this.props.editClick(e)
        } else {
            console.info("Doesn't work with edit");
        }
    }


    removeMovie = (event, e) => {
        event.preventDefault();
        console.info("it works with remove!");
        if (typeof this.props.removeClick === "function") {
            this.props.removeClick(e)
        } else {
            console.info("Doesn't work with remove");
        }
    }


    render() {

        return (
            <div className = "movieList">
                {this.state.movies.map(e =>
                    <ul>
                        <li data-id = {e.id} onClick = {event => this.editMovie(event, e)}>
                            Title: {e.name}
                        </li>
                        <li data-id = {e.id} onClick = {event => this.editMovie(event, e)}>
                            Type: {e.type}
                        </li>
                        <li data-id = {e.id} onClick = {event => this.editMovie(event, e)}>
                            Description: {e.description}
                        </li>
                        <button className = "removeMovie" type = "submit" onClick = {event => this.removeMovie(event, e)}>Delete</button>
                    </ul>)}
            </div>
        )
    }
}
Поведение ключевого слова "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
0
6 159
1

Ответы 1

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

Для них есть методы жизненного цикла, которые предоставляет React.

Вы должны переместить свой метод getMovie() в componentWillReceiveProps() или componentDidUpdate().

Если вы используете последнюю версию React, вы должны использовать getDerivedStateFromProps().

Эти три метода будут выполняться каждый раз, когда вы обновляете состояние. Однако эти методы полезны в разных случаях использования (которые вам нужно решить).

Надеюсь это поможет ;)

Привет, спасибо за ответ :) на самом деле он работает более или менее хорошо, я имею в виду, что я использовал componentDidUpdate (), поскольку это был только рабочий метод (о других двух, я узнаю о них в первый раз, узнаю позже), но он обновляется каждую секунду как я вижу в журнале консоли. Раньше я делал нечто подобное с setInterval, и эффект был таким же, но я предполагаю, что это ненужная трата ресурсов. Я новичок, все в порядке, он продолжает обновляться, даже если не выполняется никаких действий? Или он должен запускаться, когда я совершаю какое-то действие?

Zirek 31.07.2018 10:47

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

Aseem Upadhyay 31.07.2018 11:16

хм, я понимаю, но в компоненте формы я попытался установить такие условия, как componentDidUpdate() { if (this.handleRemove() || this.editMovie()) { this.getMovie() }, и взамен получаю ошибку. Невозможно прочитать свойство preventDefault из undefined.

Zirek 31.07.2018 11:38

как функции используются как условные? Разве вам не следует назначать переменную для каждого обработчика? как условие для isRemovedButtonClicked?

Aseem Upadhyay 31.07.2018 11:45

да, это кажется таким простым, и, вероятно, это так, но я думаю, у меня случится сердечный приступ, извини, друг за много глупых вопросов, но я действительно хочу, наконец, справиться с этим React ... В любом случае, если я хорошо помню, в стандартном js я мог бы сделать let removeMovie = (event,e) => {...}, но вот показывает ошибки, что это невозможно. Но это то, что вы имеете в виду? Чтобы назначить переменную более или менее таким образом, просто исправьте одну? Пробовал делать var isRemovedButtonClicked = removeMovie(events) =>{...} а потом ставил на componentDidUpdate() { if (isRemovedButtonClicked === true) { this.getMovie()}

Zirek 31.07.2018 12:26

присоединяйтесь к chat.stackoverflow.com/rooms/177075/… для дальнейшего обсуждения

Aseem Upadhyay 31.07.2018 12:29

У меня 15 репутации, и мне нужно 20, чтобы начать там болтать ... Могу я написать вам на slack / fb / email или еще что-нибудь?

Zirek 31.07.2018 12:34

вот, сейчас 20?

Aseem Upadhyay 31.07.2018 12:37

У меня 20 представителей, спасибо, я также могу видеть, что вы там пишете, но когда я вхожу в чат, я все еще вижу уведомление, что я не могу говорить, пока у меня не будет 20 представителей ... возможно, для продолжения требуется некоторое время

Zirek 31.07.2018 12:41

перейти по ссылке еще раз?

Aseem Upadhyay 31.07.2018 12:42

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

Zirek 31.07.2018 12:46

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