本文详细介绍 Vue.js 的核心常用指令,包括条件渲染的 v-if 与 v-show、列表渲染的 v-for、属性绑定的 v-bind 以及表单双向绑定的 v-model。通过具体代码示例解析各指令的语法、区别及应用场景,帮助开发者快速掌握 Vue 数据驱动视图的基础用法。
Vue.js 简介与数据驱动
Vue.js 是当前流行的 JavaScript MVVM(Model-View-ViewModel)库,基于数据驱动和组件化理念构建。相比 Angular.js,Vue.js 提供了更简洁、易理解的 API,便于开发者快速上手。
若习惯 jQuery 手动操作 DOM,学习 Vue.js 时需转变思维。Vue.js 采用数据驱动模式,无需手动操作 DOM,而是通过特殊 HTML 语法将 DOM 与数据绑定。绑定建立后,DOM 会随数据变更自动同步更新。
使用 Vue.js 时,可结合其他库(如 jQuery)共同开发。
1. 使用
使用 Vue 的过程即定义 MVVM 各组成部分的过程。
<!--这里定义View-->
<div id="app">{{ message }}</div>
<script src="js/vue.js"></script>
<script>
// 这里定义Model
var exampleData = {
message: 'Hello World!'
}
// 这里创建一个 Vue 实例或 "ViewModel"
// 连接 View 与 Model
new Vue({
el: '#app',
data: exampleData
})
</script>
Vue.js 常用指令概览
2. Vue.js 的常用指令
Vue.js 提供多种内置指令,下文将逐一介绍。
• v-if 指令 • v-show 指令 • v-else 指令 • v-for 指令 • v-bind 指令 • v-on 指令
Vue.js 具备良好扩展性,支持开发自定义指令,相关内容将在后续文章介绍。
v-if 指令详解
2.1 v-if 指令
v-if 后接可转换为布尔类型的表达式。
<div id="app">
<h1>Hello, Vue.js!</h1>
<h1 v-if="yes">Yes!</h1>
<h1 v-if="no">No!</h1>
<h1 v-if="age >= 25">Age: {{ age }}</h1>
<h1 v-if="name.indexOf('jack') >= 0">Name: {{ name }}</h1>
</div>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
yes: true,
no: false,
age: 28,
name: 'keepfool'
}
})
</script>
最终输出结果取决于表达式真假。
<div id="app">
<h1>Hello, Vue.js!</h1>
<h1>Yes!</h1>
<!---->
<h1>Age: 28</h1>
<!---->
</div>
v-show 指令与 v-if 的区别
2.2 v-show
<div id="app">
<h1>Hello, Vue.js!</h1>
<h1 v-show="yes">Yes!</h1>
<h1 v-show="no">No!</h1>
<h1 v-show="age >= 25">Age: {{ age }}</h1>
<h1 v-show="name.indexOf('jack') >= 0">Name: {{ name }}</h1>
</div>
</body>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
yes: true,
no: false,
age: 28,
name: 'keepfool'
}
})
</script>
此处代码仅将 v-if 替换为 v-show。
输出效果如下。
<div id="app">
<h1>Hello, Vue.js!</h1>
<h1>Yes!</h1>
<h1 style="display: none;">No!</h1>
<h1>Age: 28</h1>
<h1 style="display: none;">Name: keepfool</h1>
</div>
主要区别在于:v-if 直接不输出 HTML 代码,而 v-show 通过 display:none 隐藏元素。
v-else 指令使用规则
2.3 v-else 指令
<h1 v-if="age >= 25">Age: {{ age }}</h1>
<h1 v-else>Name: {{ name }}</h1>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
age: 28,
name: 'keepfool',
sex: 'Male'
}
})
</script>
v-else 的前一兄弟元素必须拥有 v-if 或 v-else-if。新版 Vue.js 新增 v-else-if 用法与 v-if 类似,但前一兄弟元素仍需有 v-if 或 v-else-if。旧版中 v-else 前可跟 v-show,但新版中 v-else 前不能是 v-show。
v-for 指令遍历用法
2.4 v-for 指令
<div v-for="p in people">
<h1>Age: {{ p.age }}</h1>
<h1>Name: {{ p.name }}</h1>
<h1>Sex: {{ p.sex }}</h1>
</div>
<script charset="utf-8" src="js/vue.js"></script>
<script type="text/javascript">
var myModel = {
people:[
{
age: 25,
name: 'keepfool',
sex: 'Male'
},
{
age: 26,
name: 'keepfool2',
sex: 'FeMale'
},
{
age: 27,
name: 'keepfool3',
sex: 'Male2'
}
]
};
var vm = new Vue({
el: '#app',
data: myModel
})
</script>
父元素使用 v-for,子元素可遍历绑定的 Array、Object、number 或 string。
v-for 还支持以下用法。
<div v-for="(item, index) in items"></div>
<div v-for="(val, key) in object"></div>
<div v-for="(val, key, index) in object"></div>
v-bind 指令属性绑定
2.5 v-bind 指令
v-bind 指令名称后可带参数,中间用冒号隔开,通常用于 HTML 元素的特性(attribute)。
<div id="app">
<ul class="pagination">
<li v-for="n in pageCount">
<a href="javascripit:void(0)" rel="external nofollow" v-bind:class="activeNumber === n ? 'active' : ''">{{ n }}</a>
</li>
</ul>
</div>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
activeNumber: 1,
pageCount: 10
}
})
</script>
其他示例如下。
<img v-bind:src="'/path/to/images/' + fileName">
<div v-bind="{ 'id': someProp, 'other-attr': otherProp }"></div>
v-on 指令事件处理
2.6 v-on 指令
<div id="app">
<p><input type="text" v-model="message"></p>
<p>
<!--click事件直接绑定一个方法-->
<button v-on:click="greet">Greet</button>
</p>
<p>
<!--click事件使用内联语句-->
<button v-on:click="say('Hi')">Hi</button>
</p>
</div>
<script src="js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
message: 'Hello, Vue.js!'
},
// 在 `methods` 对象中定义方法
methods: {
greet: function() {
// // 方法内 `this` 指向 vm
alert(this.message)
},
say: function(msg) {
alert(msg)
}
}
})
</script>
v-model 指令双向绑定
2.7 v-model 指令
v-model 在表单控件元素上创建双向数据绑定。
<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>
总结
以上介绍了 Vue.js 语法及常用指令,希望对大家有所帮助。