Vue 实例

创建 Vue 实例

在 Vue 项目中,每个 Vue 应用都是通过 Vue 构造器创建新的 Vue 实例开始的。

Vue 实例的创建方法:

let vm = new Vue({
    // ...Vue实例配置/属性/参数
})

Vue 实例的基本配置项:

名称描述
el指定唯一根标签
data定义数据
methods定义方法
components定义子组件
computed定义计算属性
filters定义过滤器
watch监听数据变化

el 唯一根标签

el 表示唯一根标签。

  • 通过 el 属性可以将 Vue 实例与 #app 盒子绑定在一起。
  • Vue 实例可以操作 el 属性绑定的 #app 盒子。
  • 可以将 Vue 实例中的数据展示在 el 属性绑定的 #app 盒子内部。

示例:el

入口页面(index.html):

<div id="app">
    <h3>{{message}}</h3>
</div>
​
<!-- 在#app外部,无法读取到Vue实例内部的数据 -->
<h3>{{message}}</h3>
​
<script>
    let vm = new Vue({
        // 将#app盒子托管给Vue实例
        el: "#app",
        data: {
            message: "Hello,Vue.js!"
        }
    })
</script>

示例效果:


data 数据

data 属性表示 Vue 实例的数据对象。

  • 在 #app 盒子中通过插值表达式 {{属性名xxx}} 的方式显示数据。
  • 在 JavaScript 中可以通过 vm.$data.xxx 的方式访问数据。
  • Vue 实例代理了 data 对象,可以通过 vm.xxx 的方式访问数据。

示例:data

入口页面(index.html):

<div id="app">
    <!-- 使用插值表达式访问数据 -->
    <h3>{{message}}</h3>
</div>

<script>
    let vm = new Vue({
        el: "#app",
        data: {
            message: "Hello,Vue.js!"
        }
    })

    // 使用Vue实例访问数据
    console.log(vm.$data.message)
    console.log(vm.message)
</script>

示例效果:


methods 方法

methods 属性用于定义方法,通过 Vue 实例可以直接访问这些方法。

  • 定义在 methods 属性中的方法可以作为页面中的事件处理方法使用,如按钮点击事件等。
  • 在定义的方法中,this 指向 Vue 实例本身。

示例:methods

入口页面(index.html):

<div id="app">
    <h3>{{message}}</h3>
    <!-- @click为按钮绑定点击事件 -->
    <button @click="change">点我</button>
</div>

<script>
    let vm = new Vue({
    el: "#app",
        data: {
            message: "Hello,Vue.js!"
        },
        methods: {
            change() {
                // this = vm
                this.message = "Hello,World!"
            }
        }
    })
</script>

示例效果:


computed 计算属性

computed 计算属性是一种更通用的方式来观察和响应 Vue 实例上的数据变动,当有一些数据需要随着其他数据变动而变动时,可以使用 computed 计算属性。

  • 计算属性结果会被缓存起来。
  • 计算属性依赖的属性发生变化时,会重新计算计算属性的值。
  • 在 #app 盒子中直接通过插值表达式 {{属性名xxx}} 的方式显示计算属性的数据。
  • 计算属性适合于简单的数据转换和同步计算。

示例:computed

入口页面(index.html):

<div id="app">
    <p>单价:{{price}}</p>
    <p>数量:{{num}}</p>
    <p>总价:{{totalPrice}}</p>
    <button @click="num++">+</button>
    <button @click="num--">-</button>
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            price: 20,
            num: 0
        },
        computed : {
            totalPrice () {
                // 返回计算结果给totalPrice
                return this.price * this.num
            }
        }
    });
</script>

示例效果:


watch 状态监听

Vue 提供了 watch 状态监听功能,可以监听当前 Vue 实例中的数据变化,调用当前数据所绑定的事件处理方法。

  • 状态监听是执行代码响应数据变化的,不返回值。
  • 状态监听不进行缓存,每当监听的数据变化时总是会执行。
  • 状态监听适合执行数据变化时的异步操作或较为复杂的数据处理。

示例:watch

入口页面(index.html):

<div id="app">
    <!-- v-model用于双向绑定 -->
    <input v-model="name">
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            name: 'Vue实例创建成功!'
        },
        watch : {
            name (newName, oldName) {
                console.log("新的值是:" + newName)
                console.log("旧的值是:" + oldName)
            }
        }
    })
</script>

示例效果:


filters 过滤器

过滤器是一种特殊的功能,用于在绑定数据到视图之前对 Vue 实例中的数据进行格式化。

  • 过滤器可以被用于两个地方:插值表达式中和 v-bind 表达式中。
  • 过滤器应该被添加在 JavaScript 表达式的尾部,由管道符号 | 指示。

示例:filters

入口页面(index.html):

<div id="app">
    <!-- 在插值表达式中使用过滤器 属性名 |(管道符) 过滤方法 -->
    <h3>{{message}}</h3>
    <h3>{{message | toUpperCase}}</h3>
</div>

<script>
    let vm = new Vue({
       el: '#app',
       data: {
           message: 'HelloWorld!'
       },
        filters: {
           // value:旧的值
           toUpperCase(value) {
               // 将字母转换成大写
               // 返回新的值
               return value.toUpperCase();
           }
        }
    })
</script>

示例效果:


Vue 数据绑定

内置指令概述

Vue 提供了内置指令,通过内置指令可以用简洁的代码实现复杂的功能。

Vue 基本内置指令:

名称描述
v-model双向数据绑定
v-on / @xxx监听事件
v-bind / :xxx单向数据绑定
v-text插入文本内容
v-html插入包含 HTML 的内容
v-for列表渲染
v-if条件渲染
v-show显示隐藏

v-model

v-model 指令用于实现双向数据绑定,常用于表单元素上。

双向数据绑定:页面中的数据改变时 data 中的数据会改变,data 中的数据改变时页面中的数据也会改变,双向数据绑定是数据驱动视图的结果。

v-model 的基本用法:

<input v-model="xxx">

示例:v-model

入口页面(index.html):

<div id="app">
    请输入内容:<input v-model="name">
    <br>
    输入的内容:{{name}}
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            name: ''
        }
    })
</script>

示例效果:


v-bind

v-bind 指令用于实现单向数据绑定,常用于绑定 HTML 元素属性。

单向数据绑定:页面中的数据改变时 data 中的数据不会改变,data 中的数据改变时页面中数据会改变。

v-bind 的基本用法:

<div v-bind:元素属性="xxx"></div>
<div :元素属性="xxx"></div>

示例:v-bind

入口页面(index.html):

<div id="app">
    <!-- v-bind:value可以缩写成:value -->
    请输入内容:<input v-bind:value="name">
    <br>
    输入的内容:{{name}}
</div>

<script>
    let vm = new Vue({
    el: '#app',
        data: {
            name: 'duozai'
        }
    })
</script>

示例效果:


Vue 提供了 v-bind 样式绑定功能,可以通过绑定内联样式和绑定样式类这两种方式来实现。


示例:使用 v-bind 绑定样式

入口页面(index.html):

<div id="app">
    <div style="background-color: red; width: 500px; height: 500px;">
        <div style="background-color: blue; width: 200px; height: 200px;"></div>
    </div>
    <br>
    <div v-bind:style="myStyle">
        <div v-bind:style="{backgroundColor: color, width: width, height: height}">
        </div>
    </div>
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            myStyle: {
                backgroundColor: 'red',
                width: '500px',
                height: '500px'
            },
            color: 'blue',
            width: '200px',
            height:  '200px'
        }
    })
</script>

示例效果:


v-bind 绑定样式时,还可以结合其他事件,实现动态切换样式的功能。


示例:v-bind 切换样式

入口页面(index.html):

<style>
    .box {
        background-color: red;
        width: 500px;
        height: 500px;
    }
    .box2 {
        background-color: green;
        width: 500px;
        height: 500px;
    }
    .inner {
        background-color: blue;
        width: 200px;
        height: 200px;
    }
</style>

<div id="app">
    <div v-bind:class="box">
        <div v-bind:class="inner">
        </div>
    </div>
    <button @click="change">点我</button>
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            box: 'box',
            inner: 'inner'
        },
        methods: {
            change() {
                this.box = 'box2'
            }
        }
    })
</script>

示例效果:


v-text

v-text 指令用于在元素内部插入文本内容。

v-text 的基本用法:

<p v-text="xxx"></p>

示例:v-text

入口页面(index.html):

<div id="app">
    <p v-text="name"></p>
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            name: 'Vue实例创建成功!'
        }
    })
</script>

示例效果:


v-html

v-html 指令用于在元素内部插入 HTML 标签内容。

v-html 的基本用法:

<p v-html="xxx"></p>

示例:v-html

入口页面(index.html):

<div id="app">
    <div v-html="name"></div>
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            name: '<h1>Vue实例创建成功!</h1>'
        }
    })
</script>

示例效果:


v-on

v-on 指令是事件监听指令,直接与标签的事件类型(如 click、change 事件等)配合使用,可以在触发事件时运行一些 JavaScript 代码,或绑定事件处理方法。

v-on 的基本用法:

<button v-on:事件类型="xxx"></button>
<button @事件类型="xxx"></button>

示例:v-on

入口页面(index.html):

<div id="app">
    <p v-text="name"></p>
    <p v-text="count"></p>
    <!-- 绑定事件处理方法 -->
    <button @click="showInfo">点击</button>
    <!-- 在触发事件时执行JavaScript代码 -->
    <button @click="count+=Math.random()">点击2</button>
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            name: 'Vue实例创建成功!',
            count: 0
        },
        methods : {
            showInfo() {
                this.name = "点击啦!"
            }
        }
    })
</script>

示例效果:


v-on 指令还可以结合按键修饰符,监听按键。


示例:结合按键修饰符监听事件

入口页面(index.html):

<div id="app">
    <p v-text="name"></p>
    <input type="text" v-on:keyup.enter="showInfo">
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            name: 'Vue实例创建成功!'
        },
        methods : {
            showInfo() {
                this.name = "Enter回车键被按下啦!"
            }
        }
    })
</script>

示例效果:


v-for

v-for 指令用于实现页面列表渲染,常用来循环数组。

v-for 的基本用法:

<div v-for="(item, index) in list" :key="id"></div>

v-for 指令的基本参数:

名称描述
list要遍历的数据列表/数组
item遍历后的每一个元素的别名
index当前元素的索引值
key使用 v-for 时,需要为每项提供一个唯一的 key 属性
其主要用于 Vue 的 diff 算法,提高遍历效率
key 的值只能是字符串或数字类型,且必须具有唯一性
建议把数据项的主键 id 属性的值作为 key 的值

示例:v-for

入口页面(index.html):

<div id="app">
    <div v-for="(item, index) in userList" :key="item.id">
        {{index}} => {{item.name}}
    </div>
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            userList: [
                { id: 1, name: '张三' },
                { id: 2, name: '李四' },
                { id: 3, name: '王五' },
                { id: 4, name: '赵六' },
                { id: 5, name: '陈七' }
            ]
        }
    })
</script>

示例效果:


v-if

v-if 指令用于控制元素显示隐藏,其会对元素进行删除和重新创建,性能较低。

v-if 的基本用法:

<p v-if="条件"><p>
<p v-else></p>

示例:v-if

入口页面(index.html):

<div id="app">
    <p v-text="name" v-if="isShow"></p>
    <button @click="showInfo">点击</button>
</div>

<script>
    let vm = new Vue({
        el: '#app',
        data: {
            name: 'Vue实例创建成功!',
            isShow: true
        },
        methods : {
            showInfo() {
                this.isShow = !this.isShow
            }
        }
    })
</script>

示例效果:


v-show

v-show 指令用于控制元素显示隐藏,其本质是操作元素的 display 属性,不会对元素进行删除和重新创建,性能较高。

v-show 的基本用法:

<p v-show="条件"></p>

示例:v-show

入口页面(index.html):

<div id="app">
    <p v-text="name" v-show="isShow"></p>
    <button @click="showInfo">点击</button>
</div>

示例效果: