为什么vue执行 mounted() 生命周期时,页面的插值表达式还没给替换掉?

根据vuejs官方的生命周期图

clipboard.png

问题:

为何我执行mounted()函数时,发现页面的{{xxx}}表达式还没给替换成真正的数据呢?测试代码如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <h1>{{message}}</h1>
        </div>
    </body>
    
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                message: '我是一个消息'
            },
            mounted() {
                alert("mounted");
            }
        });
    </script>
</html>

测试结果:

clipboard.png

求大神解答

阅读 2.5k
3 个回答

你这时用js访问dom,内容应该已经变了,只是同步代码还没执行完,浏览器不会更新渲染
https://jsfiddle.net/5kvy3wpr/

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <h1>{{message}}</h1>
        </div>
    </body>
    
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                message: '我是一个消息'
            },
            mounted() {
                alert(document.querySelector('#app').innerHTML);
            }
        });
    </script>
</html>

alert会造成线程阻塞

mounted 是指 实例和DOM绑定了,但是上dom渲染要等到下一个nextTick;
mounted() {

this.$nextTick(()=>{
  alert("mounted");
})

}

推荐问题