跳至主要內容

2.Vue实例对象

Harry Xiong大约 5 分钟Web 前端VueMVVMVuexVue-routerVue 源码分析

Vue 实例对象

2.1 创建并绑定 Vue 对象

Vue 也是一个构造函数,通过 new Vue()可以创建一个 Vue 对象,通过 Vue 对象进行对 DOM 元素以及内部的子孙元素的操作

<div id="div">
    {{msg}}<!--显示123-->
</div>
<script>
new Vue({
    el:"#div",
    /*
    在Vue中通过el属性来绑定一个DOM元素,从而让该DOM元素以及内部都绑定Vue的相关操作,一般是通过ID进行查找,因为这样才能够精确绑定
    */
    data:{//data属性中包含着在el中使用的使用的变量或属性
        msg:123
    }
    //也可以使用函数形式的
    data(){
    return{
        msg:123
    };
    //methods属性包含着需要使用的方法
    methods:{
        show(){
            console.log(this.msg);
        }
    }
}
})
</script>

注:在实例内部使用定义的属性或方法时不能直接使用,必须通过 this 来指定需要用的属性

2.2 vue 实例中的参数与选项

el:"#id", //DOM 成员(1/3)

提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标。

template:"<tag></tag>", //DOM 成员(2/3)

一个字符串模板作为 Vue 实例的标识使用。模板将会 替换 挂载的元素。挂载元素的内容都将被忽略,除非模板的内容有分发 slot

render: (h)=>{h(App)}, //DOM 成员(3/3)

字符串模板的代替方案,允许你发挥 JavaScript 最大的编程能力。

// 原理 render: (h) => { return <APP></APP>

} // 可以代替components和template

data //数据成员(1/6)

data():{ return{ } },

Vue 实例的数据对象。Vue 将会递归将 data 的属性转换为 getter/setter,从而让 data 的属性能够响应数据变化

methods //数据成员(2/6)

methods:{ func(){ } }

methods 将被混入到 Vue 实例中,可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用

方法中的 this 自动绑定为 Vue 实例

watch //数据成员(3/6)

watch:{ key:value $route:function (newValue, oldValue) { //监控路由 } }

整个为一个对象,键是需要观察的表达式,值是对应回调函数

computed //数据成员(4/6)

computed:{ getTotalCount(){ const totalCount=0; return totalCount; } },

vue 的计算属性,将被混入到 Vue 实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例

props //数据成员(5/6)

props:['counts','ids'],

用于父子组件的 eventbus 传值,是数组或对象,props 的成员是子组件接收的来自父组件的数据

propsData //数据成员(6/6)

创建实例时传递 props。主要作用是方便测试。基本不使用。

filters //资源(1/3)

filters('filterName',(input,function(){ return newvalue }))

包含 Vue 实例可用过滤器的哈希表。

directives //资源(2/3)

包含 Vue 实例可用指令的哈希表。

components //资源(3/3)

(即该组件的子实例)这里是包含 Vue 实例可用组件的哈希表。

name //杂项(1/6)

允许组件模板递归地调用自身。注意,组件在全局用 Vue.component() 注册时,全局 ID 自动作为组件的 name。

parent //杂项(2/6)

指定已创建的实例之父实例,在两者之间建立父子关系。子实例可以用 this.$parent 访问父实例,子实例被推入父实例的 $children 数组中。

mixins //杂项(3/6)

mixins 选项接受一个混合对象的数组。Mixin 钩子按照传入顺序依次调用,并在调用组件自身的钩子之前被调用。

extends //杂项(4/6)

允许声明扩展另一个组件。这主要是为了便于扩展单文件组件。这和 mixins 类似,区别在于,组件自身的选项会比要扩展的源组件具有更高的优先级。

delimiters //杂项(5/6)

改变纯文本插入分隔符。

functional //杂项(6/6)

使组件无状态(没有 data )和无实例(没有 this 上下文)。他们用一个简单的 render 函数返回虚拟节点使他们更容易渲染。

2.3 常用指令实例

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>startVue</title>
  </head>
  <body>
    <div id="app">
      <!-- {{}}双大括号表达式,里面是js代码 -->
      <p>{{ msg }}</p>
      <!-- 相当于innerText -->
      <p v-text="str"></p>
      <!-- 相当于innerHTML -->
      <p v-html="str"></p>
      <!-- 强制绑定事件, 一般用于用于响应式地更新HTML attribute, 简写方式:
            从 2.6.0 开始,可以用方括号括起来的 JavaScript 表达式作为一个指令的参数
            <a v-bind:[attributeName]="url"> ... </a>
            这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用。
            例如,如果你的 Vue 实例有一个 data 属性 attributeName,其值为 "href"
            那么这个绑定将等价于 v-bind:href
        -->
      <a v-bind:href="url">Baidu</a>
      <!-- 绑定事件监听,监听 DOM 事件, 简写方式@ -->
      <button v-on:click="test">Submit</button>
      <!-- 双向绑定事件,动态实时更新里面的内容 -->
      <div>
        <input type="text" v-model="input" placeholder="Please input" />
        <p>{{ input }}</p>
      </div>
    </div>
  </body>
  <script text="javascript" src="./vue.js"></script>
  <script text="javascript">
    const app = new Vue({
      //要挂载的位置
      //在Vue中通过el属性来绑定一个DOM元素,从而让该DOM元素以及内部都绑定Vue的相关操作
      //一般是通过ID进行查找,因为这样才能够精确绑定
      el: "#app", // data属性中包含着在el中使用的使用的变量或属性
      data: {
        msg: "xhw",
        str: '<a href="#">XHW</a>',
        url: "https://www.baidu.com",
        input: "",
      }
      /**
       * 也可以写成(以组件形式里必须写成这个)
       * data() {
       *     return {
       *
       * }
       * },
       */, // methods属性包含着需要使用的方法
      methods: {
        test() {
          alert("!!!");
        },
      },
    });
  </script>
</html>

2.4 vm.$mount

如果 Vue 实例在实例化时没有收到 el 选项,则它处于“未挂载”状态,没有关联的 DOM 元素。可以使用 vm.$mount() 手动地挂载一个未挂载的实例

**注意:**这个方法返回实例自身,因而可以链式调用其它实例方法

var MyComponent = Vue.extend({ template: '
<div>Hello!</div>
' }) // 创建并挂载到 #app (会替换 #app) new MyComponent().$mount('#app') // 同上
new MyComponent({ el: '#app' }) // 或者,在文档之外渲染并且随后挂载 var
component = new MyComponent().$mount()
document.getElementById('app').appendChild(component.$el)