在 Vue.js2 中使用哪个生命周期钩子在页面加载时调用函数?

Posted

技术标签:

【中文标题】在 Vue.js2 中使用哪个生命周期钩子在页面加载时调用函数?【英文标题】:Which lifecycle hook to use in Vue.js2 to call function on page load? 【发布时间】:2017-08-14 18:56:49 【问题描述】:

我有一个可能填充任意行数(例如 3、3800 等)的表,因此在填充数据之前,我想应用一个覆盖(我已经有一个函数 applyOverlay() 用于那)。这是我的 html

<table id="table" class="datatable" style="width:100%">
    <thead>
        /* table header */
    </thead>
    <tbody>
        <tr v-for="(item, index) in items" item="item">
            <td v-text="item.Name"></td>
            /* more <td> */
        </tr>
    </tbody>
</table>

这是我的 javascript

var tblItems = [ /* items */ ];

var app = new Vue( 
    el: '#table',
    data: 
        items: tblItems
    
);

我尝试使用 jQuery 的 $(document).ready,但我看到页面已加载(尚未填充表格),并且直到几秒钟后才应用我的覆盖(并且表格已填充)。我希望在 html 加载完成后立即应用覆盖。我读到了他们的lifecycle,但我不确定我应该使用哪个钩子。我的 applyOverlay() 是原生 JavaScript,不依赖于 Vue。

编辑:我尝试过使用mountedbeforeMountcreatedbeforeCreate,但没有任何效果。我想知道它是否与jQuery有关。但是,我的 jQuery 在加载 Vue 之前会先加载。

【问题讨论】:

How to call a vue.js function on page load的可能重复 【参考方案1】:

我认为您正在寻找“已安装”:

var tblItems = [ /* items */ ];

var app = new Vue( 
    el: '#table',
    data: 
        items: tblItems
    ,
    mounted: function() 
        //init table here because table template is available
    
);

【讨论】:

mounted 对我不起作用,叠加层仍然应用得太晚。【参考方案2】:

您可以使用created、mounted 生命周期钩子或beforeMount 钩子,如下所示:

var app = new Vue( 
    el: '#table',
    data: 
        items: tblItems
    ,
    mounted () 
      // Your code needed to be executed on page load
    
);

【讨论】:

所以在这种情况下我不会使用created @Darren 你可以使用created...see this list for a nice summary of the hooks created 仍然无法正常工作,产生的结果与我的问题中描述的相同。【参考方案3】:

applyOverlay() 函数可以添加到 Vue 对象的 methods 属性中。然后使用像beforeMount 这样的生命周期钩子来调用该方法。对于可用钩子的更详尽解释,Saurabh 有一个很好的列表here。

var app = new Vue( 
    el: '#table',
    data: 
        items: tblItems
    ,
    methods: 
        applyOverlay: function() 
             //code for applying overlay
        
    
    beforeMount: function() 
        this.applyOverlay();
    
);

请参见下面的演示。该示例使用HTML class bindings 添加叠加层。

var tblItems = [ /* items */ ];

var app = new Vue(
  el: '#table',
  data: 
    items: tblItems,
    status: '',
    overlay: false
  ,
  beforeMount() 
    this.applyOverlay();
    setTimeout(this.setUnits, 1500);
  ,
  methods: 
    applyOverlay: function() 
      this.overlay = true;
      this.status = "overlay applied";
    ,
    setUnits: function() 
      this.overlay = false;
      this.items = [
        Name: "A",
        status: "done"
      , 
        Name: "B",
        status: "in transit"
      ];
      this.status = 'set items, overlay removed';
    
  
);
.datatable 
  text-align: center;


tfoot 
  font-size: small;


.overlay 
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 10;
  /*dim the background*/
  background-color: rgba(0, 0, 0, 0.5);
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.4/vue.min.js"></script>
<table id="table" class="datatable" style="width:100%">
  <thead>
    <tr>
      <th>Name</th>
      <th>Status</th>
    </tr>
  </thead>
  <tbody>
    <tr v-for="(item, index) in items" item="item">
      <td v-text="item.Name"></td>
      <td v-text="item.status"></td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <td colspan="2">Status:  status 
        <div v-bind:class="overlay: overlay"></div>
      </td>
    </tr>
  </tfoot>
</table>

【讨论】:

以上是关于在 Vue.js2 中使用哪个生命周期钩子在页面加载时调用函数?的主要内容,如果未能解决你的问题,请参考以下文章

Vue生命周期和钩子函数及使用keeplive缓存页面不重新加载

Vue实例的生命周期

vue3生命周期及生命周期函数(钩子函数)详解通俗易懂

Vue 实例中的生命周期钩子

vue2.0项目实战生命周期和钩子函数详解

vue生命周期钩子函数如何第二次打开不请求接口