Vue.js单文件组件中,属性this.$el未定义。

15

我正在尝试使用laravel mix和vue js创建全局组件,但是访问属性this.$el时它未定义。这是我的组件文件:

Datepicker.vue

<template>
<input 
    type="text" 
    :name="name" 
    :class="myclass" 
    :placeholder="placeholder"
    :value="value" />
</template>  

<script>
export default {
  props: ['myclass','name','placeholder','value'],
  data () {
    return {

    }
  },
  created () {
    console.log("this.$el", this.$el); //undefined
    console.log("this", this); //$el is defined
    var vm = this;
    var options = {
        "locale": "es",        
        "onChange": function(selectedDates, dateStr, instance) {
            vm.$emit('input', dateStr);
        }
      };

    $(this.$el)
      // init
      .flatpickr(options);      
  },
  destroyed(){
    console.log("destroyed");
  }
}
</script>

控制台

但是,当组件作为X-Template创建时,它可以正常工作:

client.js

Vue.component('date-picker', {
  props: ['myclass','name','placeholder','value'],
  template: '#datepicker-template',
  mounted: function () {
    var vm = this;
    var options = {
        "locale": "es",        
        "onChange": function(selectedDates, dateStr, instance) {
            vm.$emit('input', dateStr);
        }
      };  

    $(this.$el)
      // init
      .flatpickr(options);      
  },
  destroyed: function () {
    console.log("destroyed");
  }
});

创建.blade.php

<script type="text/x-template" id="datepicker-template">
    <input 
    type="text" 
    :name="name" 
    :class="myclass" 
    :placeholder="placeholder" />
</script>
1个回答

18

$el 直到 mounted 钩子函数才会存在。

mounted() {
  var vm = this;
  var options = {
      "locale": "es",        
      "onChange": function(selectedDates, dateStr, instance) {
          vm.$emit('input', dateStr);
      }
    };

  $(this.$el)
    // init
    .flatpickr(options);      
},

在文档中查看生命周期图表


但是当使用X-Template创建组件时,$el存在直到挂载时它才起作用。 - ivanjj22
1
@ivanjj22 不,你在 X-Template 的例子中使用的是 mounted - Bert
还要检查您的ref属性(通过组件中的$ref属性访问),如果您尝试以这种方式引用元素($el)。 - pstoev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接