2017-06-20 251 views
3

在元素重新呈現後,Vue中是否有事件被觸發?我有一個更新的對象,這會導致我的模板更新。更新後,我想觸發一個運行jQuery函數的事件。代碼如下所示:渲染後的Vue組件事件

template: ` 
    <div class="undo-margin"> 
     <div class="gradient"> 
      <img v-bind:src="blogPost.thumbnail"/> 
      <h1 class="align-bottom">{{blogPost.title}}</h1> 
     </div> 

     <div class="container bg-faded"> 
      <article v-html="blogPost.article"></article> 
     </div> 
    </div> 

`, 
props: ["blogid"], 
data: function() { 
    return blogPageData; 
}, 
mounted: function() { 
    const blogid = jQuery("#blogPage").attr("blogid"); 
    if (this.authdata.roles.indexOf("Administrator") !== -1) { 
     this.isAdmin = true; 
    } 

    this.getBlogPost(blogid); 
}, 
methods: { 
    getBlogPost: function (blogid) { 
     var element = this; 
     $.ajax({ 
      url: `/api/blog/${blogid}`, 
      type: "get", 
      headers: headers, 
      success: function (data) { 
       if (data === undefined) { 
        window.location.replace("/blog"); 
       } else { 
        element.isDetails = true; 
        element.blogPost = data; 
       } 
      }, 
      error: function (data) { 
       window.location.replace("/blog"); 
       errorData.error = data.responseText; 
      } 
     }); 
    } 
}, 
watch: { 
    blogPost: function() { 
     console.log(this.blogPost); 
     jQuery("pre").each((i, e) => { 
      hljs.highlightBlock(e); 
     }); 
    } 
} 

正如你看到的,我嘗試使用監視事件,但是當手表事件觸發,我的網頁還沒有更新。然而blogPost已被更改,但vue仍在渲染頁面。我知道我可以通過添加一個setTimeout來理論上解決這個問題,但我更喜歡更清潔的東西。

回答

5

updated可能是你在找什麼。 https://vuejs.org/v2/api/#updated

+2

謝謝,這是行不通的。我還發現你可以使用'this。$ nextTick(function(){...});'在更新DOM之後執行代碼。我會把它留在這裏以防有人發現它有用 – user2657943

2

updated()應該是你在找什麼:

數據更改後調用導致虛擬DOM重新渲染和修補。

這個鉤子被調用時,組件的DOM將被更新,所以你可以在這裏執行與DOM相關的操作。