Vue.js запускает событие после того, как компонент был отображен?

У меня есть некоторые пользовательские компоненты в Vue.js. В одном из компонентов у меня есть список выбора, который я хочу отобразить как Chosen. Я использую это с помощью функции jQuery $("select").chosen().

<template v-for="upload in uploads">
    <new-upload-container :index="$index" :upload="upload" v-if="isNewUpload"></new-upload-container>
    <existing-upload-container :index="$index" :upload="upload" v-if="isExistingUpload"></existing-upload-container>
</template>

После добавления данных в связанный массив uploads в экземпляре Vue представление обновляется экземпляром компонента. К сожалению, когда я пытаюсь создать экземпляр Chosen в поле select, это не сработает.

Я не уверен, что это займет короткое время после добавления элемента в массив uploads, который DOM действительно обновляет.

<template id="existing-upload-container">

      <select name="beats[@{{ index }}][existing_beat]" class="existing-beats">
           <option selected="selected" value="">-- Select a linked beat --</option>
                  @foreach ($beats as $beat)
                   <option value="{{$beat->id}}">{{$beat->name}}</option>
                  @endforeach
       </select>

    </template>

Есть ли событие, которое запускается после полного отображения компонента?

Ответы

Ответ 1

Вы можете попробовать две вещи в своем компоненте, на основе которых вы работаете с вашим пакетом. В объекте Vue:

{
    ready:function(){
        // code here executes once the component is rendered
        // use this in the child component
    },
    watch: {
        uploads:function(){
            //code here executes whenever the uploads array changes 
            //and runs AFTER the dom is updated, could use this in
            //the parent component
        }
    }
}

Ответ 2

Правильным вариантом будет настраиваемая директива:

<select v-chosen name="beats[@{{ index }}][existing_beat]" class="existing-beats">

//insert/require() the following before the creation of your main Vue instance
Vue.directive("chosen",{
  bind: function(){
    $(this.el).chosen();
  }
})

edit: синтаксис директивы изменен в Vue 2. *:

Vue.directive("chosen",{
  bind: function(el){
    $(el).chosen();
  }
})

Ответ 3

Хорошим хорошим способом сделать это будет обернуть плагин Chosen в компоненте Vue, как описано подробно здесь.