Передающие функции до родительского для обновления реквизитов?

#reactjs #vue.js

#reactjs #vue.js

Вопрос:

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

Прямо сейчас мой родитель выполняет «Главный» вызов API, чтобы получить весь Customer объект. Я передаю Customer в качестве реквизита дочернему компоненту. Дочерний компонент использует значение Customer.address для предварительного заполнения поля ввода. Если это поле обновляется, дочерний элемент выполняет вызов api для публикации новых данных, затем я передаю функцию обратно родительскому элементу для вызова функции «Master» и получения новой копии объекта Customer, чтобы обновились передаваемые им реквизиты. Имеет ли это смысл?

Parent.vue

 <template>

    <Child 
        :customer = "this.customer"
        @handleGetCustomerData = "getCustomerData"
        >

    </Child>

</template>


<script>

    export default {

        data() {
            customer = {}
        }
        mounted() {
            this.getCustomerData()
        },
        methods: {

            getCustomerData: function() {
                axios
                    .get('/api/customer')
                    .then(response => {
                        this.customer = response
                    };
            }
        }
    }

</script>
  

Дочерний.vue

 <template>

    <div>
      <input :value="customer.address" ref="address">
        <button
            v-on:click="updateAddress()">
            Update Address
        </button>

    </div>

</template>

<script>
    export default {

        props: {
            customer:  {type: Object}
        },

        methods: {

            updateAddress() {
                axios.post('/api/address', { 
                address: this.$refs.address.value
            })
            .then(response => {
                this.handleGetCustomerData()
            });

            handleGetCustomerData() {
                this.$emit('handleGetCustomerData')
            }

        }
    }

</script>
  

Ответ №1:

Это имеет смысл, конечно. Мы используем реквизит для связи parent -> child и события для связи child -> parent .

Вы делаете это правильно, но у вас могут возникнуть некоторые проблемы и сложная отладка вызывающего API внутри вашего дочернего компонента. Я бы просто $emit передал какой-нибудь «updateAddress» this.$refs.address.value как параметр и вызвал API внутри родительского компонента.

Делая это, вы можете централизовать вызовы API и обновления, всегда обновляя данные дочерних элементов через props.

Надеюсь, это поможет! Вот отличная статья об этом.

Комментарии:

1. Спасибо, Матеус! Моя единственная проблема с моим подходом заключается в том, что после выполнения вызовов API для обновления данных я передаю событие родительскому, чтобы вызвать «master» api для «get» и обновить реквизиты, чтобы они передавались с обновленными значениями. Был бы «менее дорогостоящий» способ сохранения вызова API GET для получения обновленных данных — просто изменить это значение, если обновление api завершится успешно? Например, я обновляю адрес и вместо того, чтобы вызывать GET сразу после обновления, чтобы передать реквизиты дочернему элементу для отражения, я просто устанавливаю значение адреса на то, на что я его обновил? Надеюсь, я правильно это объясняю

2. Да, это решение! Как только вы узнаете, что ваш post вернул успех и какое значение вы отправили, вы можете просто обновить локальные данные дочернего элемента вручную. Но это может вызвать некоторые ненужные проблемы, поскольку у вас будет «два источника» информации (API и ваши измененные вручную локальные данные). Конечно, бывают ситуации, когда эта стоимость того стоит (в зависимости от производительности сети и т.д.), Но Обычно я не вижу проблем с выполнением другого запроса, поскольку данные были обновлены.

Ответ №2:

Я не знаю Vue, но в React я бы не позволил дочернему элементу обрабатывать запросы API вообще. Логика должна быть в одном месте (в родительском), и тогда поток будет выглядеть примерно так:

  • (Родительский) Получаем объект и передаем в качестве реквизита
  • (Дочерний элемент) При обновлении поля дочерний элемент выполняет обратный вызов от родительского элемента
  • (Родительский) выполняет запрос api, а затем получает обновленный объект и обновляет реквизит