1. 内置指令
1.1 v-show
v-show指令用于根据条件控制元素的显示和隐藏。使用v-show时,元素始终会被渲染,只是通过修改元素的display属性来控制显示或隐藏。
<div id="app"> <p v-show="isVisible">This paragraph is shown or hidden based on the value of isVisible.</p > <button @click="toggleVisible">Toggle Visibility</button> </div>
const app = new Vue({ el: '#app', data: { isVisible: true }, methods: { toggleVisible() { this.isVisible = !this.isVisible; } } });
在上述代码中,我们通过v-show指令根据isVisible的值来显示或隐藏<p>元素。使用@click指令来监听按钮的点击事件,从而调用toggleVisible方法来切换isVisible的值。
1.2 v-if / v-else-if / v-else
v-if指令用于根据条件渲染元素,而v-else-if和v-else指令可以在条件不满足时渲染不同的元素。
<div id="app"> <p v="status === 'success'">Operation successful!</p > <p v-else-if="status === 'error'">An error occurred.</p > <p v-else>Unknown status.</p > <button @click="setStatus('success')">Set Success</button> <button @click="setStatus('error')">Set Error</button> <button @click="setStatus('')">Clear Status</button> </div>
const app = new Vue({ el: '#app', data: { status: '' }, methods: { setStatus(newStatus) { this.status = new; } } });
在上述代码中,根据status的值使用v-if、v-else-if和v-else指令来渲染不同的段落内容。点击不同的按钮可以更改status的值,从而动态渲染不同的内容。
1.3 v-for
v-for指令用于循环渲染数组或对象的内容。
<div id="app"> <ul> <li v-for="item in items">{{ item }}</li> </ul> </div>
const app = new Vue({ el: '#app', data: { items: ['Item 1', 'Item 2', 'Item3'] } });
在上述代码中,我们使用v-for指令循环渲染数组items中的内容,并将每个元素分别染为一个<li>元素。
1.4 v-bind
v-bind指令用于动态绑定元素的属性或样式。
<div id="app"> < img v-bind:src="imageUrl" alt="Image"> <button v-bind:disabled="isDisabled">Submit</button> </div>
const app = new Vue({ el: '#app', data: { imageUrl: 'https://example.com/image', isDisabled: false } });
在上述代码中,我们使用v-bind指令将src属性和disabled属性绑定到Vue实例的数据中。通过更改imageUrl和isDisabled的值,我们可以动态更改<img>元素的src属性和<button>元素的disabled属性。
1.5 v-model
v-model指令用于实现表单元素的双向数据绑定。通过v-model指令,表单元素的值将实时更新到Vue实例的数据中,同时数据的变化也会反映到表单元素上。
<div id="app"> <input v-model="message" type="text"> <p>You typed: {{ message }}</p > </div>
const app = new Vue({ el: '#app', data: { message: '' } });
在上述代码中,我们使用v-model令将输入框的值绑定到Vue实例message属性上。当我们在输入框中输入时,message的值会实时更新,更新也反映到了模板中。
1.6 v-on
v-on指令用于绑定事件监听器。
<div id="app"> <button v-on:click="greet">Say Hello</button> </div>
const app = new Vue({ el: '#app', methods: { greet() { alert('Hello, Vue!'); } } });
在上述代码中,我们使用-on:click指令定了一个点击事件的监听器,当按钮被点击时,greet方法会被调用,弹出一个提示框显示"Hello, Vue!"。
Vue学习笔记
1.7 v-text
v-text指令用于将元素的textContent设置为绑定的表达式的值
<div id="app"> <p v-text="message"></p > </div>
var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } })
代码运行结果:页面上会显示Hello Vue!
代码分析:v-text指令会将元素的textContent设置为绑定的表达式的值,这里将message绑定到了<p>标签上,所以<p>标签的内容显示为Hello Vue!
1.8 v-html
v-html指令可以将元素的innerHTML设置为绑定的表达式的值
<div id="app"> <p v-html="message"></p > </div>
var app = new Vue({ el: '#app', data: { message: '<strong>Hello Vue!</strong>' } })
代码运行结果:页面上会显示Hello Vue!,并且Hello Vue!会被加粗显示
代码分析:v-html指令会将元素的innerHTML设置为绑定的表达式的值,这里将message绑定到了<p>标签上,所以<p>标签的内容显示为<strong>Hello Vue!</strong>
1.9 v-once
v-once指令可以将元素和组件的内容只渲染一次,之后不再更新
<div id=""> <p v-once>{{ message }}</p > div>
var app new Vue({ el:app', data: { message: 'Hello Vue!' } })
代码运行结果:页面上会显示Hello Vue!,之后即使message的值改变,<p>标签的内容也不会更新
代码分析:v-once指令可以将元素和组件的内容只渲染一次,之后不再更新,这样可以提高性能
1.10 v-pre
v-pre指令可以跳过元素和组件的编译过程,直接将其内部的内容作为原始HTML输出
<div id="app" v-pre> {{ message }} </div>
var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } })
代码运行:页面上会显示 message }},而不是Hello Vue!
代码分析:v-pre指令会跳过元素和组件的编译过程,直接将其内部的内容作为原始HTML输出,这样可以避免Vue对其中的表达式进行解析和编译
1.11 v-cloak
v-cloak指令可以用于解决初始化时页面出现闪烁的问题,它会保持在元素上直到相关实例完成编译
<div id="app" v-cloak> {{ message }} </div>
var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } })
代码运行结果:页面上会显示Hello Vue!,并且v-cloak会保持在元上直到相关实例完成编译
代码分析:v-cloak指令会保持在元素上直到相关实例完成编译,可以防止页面在初始化时出现显示未编译的标记的问题
1.12 v-slot
v-slot指令用于在使用Vue的插槽时定义具名插槽的内容
<template> <div id="app"> <component> <template v-slot:header> <h1>This is the header</h1> </template> <template v-slot:footer> <h2>This is the footer</h2> </template> component> </div> template>
代码行结果:component组件中会分别显示header插槽的内容<h1>This is the header</h1>和footer插槽的内容<h2>This is the footer</h2>
代码分析:v-slot指令可以在使用Vue的插槽时定义具名插槽的内容,<template v-slot:header>表示定义了一个名为header的插槽,在component组件中使用<slot name="header"></slot>来插入该插槽的内容。
Vue学习笔记
2. 自定义指令
自定义指令允许我们在DOM元素上添加自定义行为
2.1 自定义指令的注册
我们可以使用Vue.directive方法注册一个全局的自定义指令
// 注册一个全局的自定义指令 Vue.directive('my-directive', { bind: function(el, binding, vnode) { // 指令绑定时的调用 }, inserted: function(el, binding, vnode) { // 被绑定元素插入到父节点时的调用 }, update: function(el, binding, vnode, oldVnode) { // 组件更新时的调用 }, componentUpdated: function(el, binding, vnode, oldVnode) { // 组件更新完成后的调用 }, unbind: function(el, binding, vnode) { // 指令解绑时的调用 } })
代码分析:我们使用Vue.directive来注册一个全局的自定义指令,并传入一个对象来定义该指令的钩子函数。这些钩子函数在指令的生命周期不同阶段被触发,可以在这些钩子函数中编写自定义指令的逻辑。
2.2 钩子函数自定义指令可以包含不同的钩子函数,用来在指令的不同生命周期阶段执行不同的操作
bind:指令第一次绑定到元素时调用
inserted:绑定元素插入到父节点调用
update:组件更新时调用,但是可能在其子组件更新之前调用
componentUpdated:组件更新完成后调用
unbind:指令与元素解绑时调用
2.3 动态指令参数
我们可以使用指令参数来动态地定义自定义指令的行为
<div id="app"> <input v-my-directive:arg.modifier="value"> </div>
var app = new Vue({ el: '#app', data: { value: 'Hello Vue!' }, directives: { 'my-directive': { bind: function, binding, vnode) { // 获取指令参数 var arg = binding.arg var modifiers = binding.modifiers // 进行相应的处理 } } } })
代码分析:我们可以在指令使用时通过指令参数来传递信息。v-my-directive:arg.modifier中的arg和modifier就是指令参数,我们可以在自定义指令的钩子函数中通过binding.arg和binding.modifiers来获取指令的值。
2.4 函数简写
自定义指令只需要定义bind和``两个钩子函数,我们可以使用函数简写的方式来注册指
Vue.directive('my-directive', function(el, binding, vnode, oldnode) { // 指令绑定和更新时调用,其他钩子函数都省略了 })
代码分析:Vue允许我们直接传入一个函数作为钩子函数,这样可以简化自定义指令的注册过程。
2.5 对象字面量
我们还可以使用对象字面量的方式来注册定义自定义指令
Vue.directive('my-directive', { bind: function(el, binding, vnode) { // 指令绑定时的调用 }, update: function(el, binding,, oldVnode) { // 组件更新时的调用 } })
代码分析:使用对象字面量的方式来注册和定义自定义指令可以使代码更加清晰易读,每个钩子函数都有自己的对应逻辑。
1. 应用程序实例
在Vue中,我们使用一个Vue实例来创建和管理我们的应用程序。通过实例化Vue类,我们可以将Vue应用程序挂载到一个HTML元素上。
// 创建Vue实例 const app = new Vue({ el: '#app', // 挂载到id为app的元素上 data: { message: 'Hello, Vue!' } });
在上面的例子中,我们使用new Vue()创建了一个Vue实例,并将其挂载到id为app的元素上。data选项是一个对象,包含了我们应用程序的数据。
2. 插值
在Vue中,可以使用双大括号{{}}来进行插值操作,将数据绑定到模板中。
<div id="app"> <p>{{ message }}</p > </div>
const app = new({ el: '#', data: { message: 'Hello, Vue!' } });
上述代码中,我们将message数据绑定到了模板的<p>元素中,message的值将会被动态更新到视图中。
3. 指令
除了插值,Vue还提供了一些指令,用于实现更复杂的数据绑定和事件处理。
<div id="app"> <p v-if="show">This is visible if show is true.</p > <button @click="toggleShow">Toggle Show</button> </div>
const app = new Vue({ el: '#app', data: { show: true }, methods: { toggleShow() { this.show = !this.show; } } });
在上述代码中,我们使用了v-if指令来根据show的值来控制元素的显示和隐藏。@click是一个事件指令,用来监听元素的点击事件。