vue 中el ,对象实例 和this的问题

https://cn.vuejs.org/v2/api/#el
这里边说el 在实例挂载之后,可以用 vm.$el 访问,所以我在mounted函数里打印了下

        var vm = new Vue({
            el: '#app',
            data: {
                user: {
                    name: '111',
                },
            },
            created() {},
            mounted() {
                console.log(this.$el);
                console.log(vm.$el);                
            }
        });

发现用this.$el可以访问到挂载节点 但是第二个语句报错。钩子里this不是指向vue 实例对象(vm) 写哪个都行吗?
图片描述

阅读 5.4k
3 个回答

报错是因为,你在 mounted 厘米访问 vm ,此时 vue 初始化并没有完成,所以并不会有 vm 实例。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <div>
        <label>姓名:</label>
        <input type="text" v-model="user.name" id="user" />
      </div>
    </div>
    <script>
      var vm = new Vue({
        el: '#app',
        data: {
          user: {
            name: '111',
          },
        },
        created() {
            let inputelement = document.getElementById('user');
          console.log(inputelement);
        },
        mounted() {
          setTimeout(() => {
            console.log(vm.$el)
          }, 0)
        },
      });
    </script>
  </body>
</html>

作用域啊,你在vm实例的内部,调用vm怎么会取到vm呢?

var vm = new Vue({
            el: '#app',
            data: {
                user: {
                    name: '111',
                },
            },
            created() {},
            mounted() {
                console.log(this.$el); //此处this指向就是vm对象本身
                console.log(vm.$el);   //此处根本没有vm对象             
            }
        });
        
console.log(vm.$el);  //此处可以取到vm对象

el: '#app'当存在这个选项时,实例会立即进入编译过程,在编译过程中,实例是无法被访问到的。但可以手动执行编译过程,也就是说在没有被编译的时候,我们是可以访问这个实例的。

 var vm = new Vue({
        data: {
            user: {
                name: '111',
            },
        },
        created() {},
        mounted() {
            console.log(this.$el); //此处this指向就是vm对象本身
            console.log(vm.$el);   //此处可以访问vm            
        }
    });
    //手动编译就可以在内部访问到实例vm了。
 vm.$mount(document.getElementById('app'))   

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题