Vue component event after render

132,718

Solution 1

updated might be what you're looking for.

Vue2 https://v2.vuejs.org/v2/api/#updated

Edit: Now that Vue3 is the current version here are the links to the relevant lifecycle hooks.

Vue3 Composition API https://vuejs.org/api/composition-api-lifecycle.html#onupdated

Vue3 Options API https://vuejs.org/api/options-lifecycle.html#updated

Solution 2

updated() should be what you're looking for:

Called after a data change causes the virtual DOM to be re-rendered and patched.

The component’s DOM will have been updated when this hook is called, so you can perform DOM-dependent operations here.

Share:
132,718
user2657943
Author by

user2657943

Software Engineer

Updated on February 11, 2022

Comments

  • user2657943
    user2657943 about 2 years

    Is there an event in Vue that gets fired after an element re-renders? I have an object that updates, which causes my template to update. After it updates I want to trigger an event which runs a jQuery function. The code looks like this:

    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);
            });
        }
    }
    

    As you see, I tried using the watch event, however when the watch event triggers, my page is not updated yet. blogPost however has been changed, but vue is still rendering the page. I know I could theoretically fix this by adding a setTimeout, but I would prefer something cleaner.