Як викликати функцію vue.js при завантаженні сторінки


97

У мене є функція, яка допомагає фільтрувати дані. Я використовую, v-on:changeколи користувач змінює виділення, але мені також потрібно викликати функцію ще до того, як користувач вибере дані. Я зробив те саме з AngularJSпопереднім використанням, ng-initале я розумію, що такої директиви вvue.js

Це моя функція:

getUnits: function () {
        var input = {block: this.block, floor: this.floor, unit_type: this.unit_type, status: this.status};

        this.$http.post('/admin/units', input).then(function (response) {
            console.log(response.data);
            this.units = response.data;
        }, function (response) {
            console.log(response)
        });
    }

У bladeфайлі я використовую блейд-форми для виконання фільтрів:

<div class="large-2 columns">
        {!! Form::select('floor', $floors,null, ['class'=>'form-control', 'placeholder'=>'All Floors', 'v-model'=>'floor', 'v-on:change'=>'getUnits()' ]) !!}
    </div>
    <div class="large-3 columns">
        {!! Form::select('unit_type', $unit_types,null, ['class'=>'form-control', 'placeholder'=>'All Unit Types', 'v-model'=>'unit_type', 'v-on:change'=>'getUnits()' ]) !!}
    </div>

Це чудово працює, коли я вибираю конкретний елемент. Тоді, якщо я натисну на всі скажімо all floors, це працює. Мені потрібно, коли сторінка завантажується, вона викликає getUnitsметод, який буде виконувати $http.postз порожнім введенням. У бекенді я обробляв запит таким чином, що якщо введення порожнє, воно дасть всі дані.

Як я можу це зробити vuejs2?

Мій код: http://jsfiddle.net/q83bnLrx

Відповіді:


196

Ви можете викликати цю функцію в розділі beforeMount компонента Vue: наприклад:

 ....
 methods:{
     getUnits: function() {...}
 },
 beforeMount(){
    this.getUnits()
 },
 ......

Робоча скрипка: https://jsfiddle.net/q83bnLrx/1/

Існують різні гачки життєвого циклу, які надає Vue:

Я перерахував кілька таких:

  1. beforeCreate : Викликається синхронно після того, як екземпляр щойно був ініціалізований, перед спостереженням даних та налаштуванням подій / спостерігачів.
  2. created : Викликається синхронно після створення екземпляра. На цьому етапі екземпляр закінчив обробку параметрів, а це означає, що було налаштовано наступне: спостереження даних, обчислювані властивості, методи, зворотні виклики перегляду / події. Однак фаза монтажу ще не розпочата, і властивість $ el ще не буде доступною.
  3. beforeMount : Викликається безпосередньо перед початком монтажу: функція візуалізації збирається викликати вперше.
  4. mount : Викликається після того, як екземпляр був щойно змонтований, де el замінено на щойно створений vm.$el.
  5. beforeUpdate : Викликається при зміні даних перед тим, як віртуальний DOM буде повторно відтворений і виправлений.
  6. оновлено : Виклик після зміни даних призводить до того, що віртуальний DOM повторно відтворюється та виправляється.

Повний список можна переглянути тут .

Ви можете вибрати, який гачок вам найбільше підходить, і зачепити його, щоб викликати вас функцією, як зразок коду, наведений вище.


@PhillisPeters можете додати більше коду або створити скрипку з нього.
Саураб

@PhillisPeters Будь ласка, подивіться на оновлену скрипку , я замінив http post call на setTimeout для моделювання, тепер ви можете бачити дані, що заповнюються в таблиці.
Саураб

@GeorgeAbitbol Будь ласка, не соромтеся відповідно оновлювати відповідь.
Саураб

Моя проблема полягала в тому, що я не знав використовувати "this" у розділі mount (), і я отримував невизначені помилки функції. "Це" використано вище, і я зрозумів, що це було рішення мого питання, але воно не виділено у відповіді. Чи був випуск OP подібним до мого? Чи покращить цю відповідь додавання виклику для вирішення зобов’язуючих питань?
mgrollins

31

Вам потрібно зробити щось подібне (якщо ви хочете викликати метод при завантаженні сторінки):

new Vue({
    // ...
    methods:{
        getUnits: function() {...}
    },
    created: function(){
        this.getUnits()
    }
});

1
createdНатомість спробуйте .
The Alpha

1
@PhillisPeters Ви можете використовувати created або beforeMount.
Саураб


3

Пам'ятайте, що коли mountedподія запускається на компонент, ще не всі компоненти Vue замінюються, тому DOM може ще не остаточним.

Щоб дійсно імітувати onloadподію DOM , тобто запускати після того, як DOM буде готовий, але перед тим, як буде намальована сторінка, використовуйте vm. $ NextTick зсередини mounted:

mounted: function () {
  this.$nextTick(function () {
    // Will be executed when the DOM is ready
  })
}

0

Якщо ви отримуєте дані в масиві, ви можете зробити, як показано нижче. Це спрацювало для мене

    <template>
    {{ id }}
    </template>
    <script>

    import axios from "axios";

        export default {
            name: 'HelloWorld',
            data () {
                return {
                    id: "",

                }
            },
    mounted() {
                axios({ method: "GET", "url": "https://localhost:42/api/getdata" }).then(result => {
                    console.log(result.data[0].LoginId);
                    this.id = result.data[0].LoginId;
                }, error => {
                    console.error(error);
                });
            },
</script>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.