vue是一个渐进式的javascript,可以将vue作为你应用的一部分嵌入其中,带来更丰富的交互体验,也可以使用更多的vue核心库去进行开发。
vue是一个轻量级的mvvm框架,通过数据驱动和组件化进行前端开发,通过简单的api就能实现响应式的数据绑定和组合的视图组件。
1.首先要导入vue 的js
<script src="vue-2.4.0.js"></script> <body> <div id="app"> <h2>Hello {{name}}</h2> </div> </body> <script> let app= new Vue({ el: '#app', date:{ name: 'Vue' } }) </script> |
1.创建一个vue对象,浏览器内存中就有一个vue
2.创建vue的时候,传入一个参数,这个参数是一个对象options
3.参数中有el属性,该属性决定了这个vue对象挂载到哪一个元素上。
4.参数中有date属性,该属性定义存储大部分的数据,这些数据可以自己直接定义,也可以从网络中获取。
2.vue列表循环显示
<body> <div id="app"> <ul> <li v-for="item in books">{{item}}</li> </ul> </div> </body> <script> let app = new Vue({ el: '#app', data: { books: ['vue', 'Vue从入门到精通', 'java从入门到放弃', '数据库从入门到删库'] } }) </script> |
3.计算器案例
<body> <div id="app"> <h3>当前计数:{{count}}</h3> <button @click="addCount">加</button> <button @click="delCount">减</button> </div> </body> <script> let app = new Vue({ el: '#app', data: { count: 0 }, methods: { addCount() { this.count++ }, delCount() { this.count-- } } }) </script> |
@click 这是vue中监听点击事件的方式,而@click需要指定发生点击时所执行的方法,该方法是在methods中定义的。
什么是mvvm
mvvm:能够帮助我们减少不必要的dom操作,提高渲染效率,数据绑定单向,双向,通过框架提供的一些指令,我们只需要关注数据业务逻辑,不需要关注dom是如何渲染的,在vue中,一个最核心的思想就是不让用户去操作dom元素。
model: 对应数据层的域模型,它主要做数据的管理,通过ajax/fetxh/axios等api完成客户端和服务端的model同步,在层间关系里,它主要用于抽象出viewmodel中的model。
view:view是作为视图模板,用于定义结构,布局。它自己不处理数据,只是将viewmodel中的数据展现出来。
viewmodel:viewmodel起着链接view和model的作用,同时用于处理view中的逻辑。viewmodel从model中取数据,渲染到view中。
基础语法
v-once
有些情况下,我们可能不希望页面随意的改变,这个时候我们可以使用v-once指令。该指令后面不需要跟任何的表达式,该指令表示元素和组件之间只会渲染一次,不会随着数据的改变而改变。
v-html
输出html格式。
v-text :作用和插值运算符比较类似,都是用于将数据显示在页面中,通常情况下,v-text接受一个string类型,v-text会替换标签内的内容。
v-pre:是用于跳过这个元素和它子元素的编译过程,标签内怎么写,页面就怎么展示。
过滤器:语法:{{数据 | 过滤器名称}},filters属性与data和methods平级,用于定义过滤器。过滤器本质上是一个方法,接收一个参数。在页面中,使用插值运算符
<body> <div id="app"> <h2>{{count | filterEven}}</h2> <h2>{{count2 | filterEven}}</h2> </div> </body> <script> let app = new Vue({ el: '#app', data: { count: 10, count2: 11 }, filters: { filterEven(num) { if (num % 2 === 0) { return num } else { return '非法数字' } } } }) </script> |
属性绑定
动态来绑定,比如A标签的href,img标签的src等,我们可以使用v-bind指令。
v-bind指令用于绑定一个值或多个值
<body> <div id="app"> <a v-bind:href="baiduLink">百度</a> <!-- v-bind有简写方式 --> <a :href="baiduLink">百度</a> </div> </body> <script> let app = new Vue({ el: '#app', data: { baiduLink: 'http://www.baidu.com' } }) </script> v-bind绑定class <body> <div id="app"> |
<!-- 方式1:直接通过{}绑定一个类 -->
<h2 :class="{'active':isActive}">Hello Vue</h2>
<!-- 方式2:这种方式可以通过判断,传入多个值 -->
<h2 :class="{'active':isActive, 'size': big}">Hello Vue</h2>
<!-- 方式3:和普通类同时存在,并不冲突 -->
<h2 class="h2-border" :class="{'active':isActive, 'size': big}">Hello Vue</h2>
<!-- 方式4:如果过于复杂,可以放到一个data中 -->
<h2 class="h2-border" :class="classes">Hello Vue</h2>
</div>
</body>
<script>
let app = new Vue({
el: '#app',
data: {
isActive: true,
big: true,
classes: ['active', 'size']
}
})
</script>
v-bind绑定style
<body>
<div id="app">
<!-- 方式1:直接绑定对象 -->
<h2 :style="{color: 'red', fontSize: '15px'}">Hello Vue</h2>
</div>
</body>
<script>
let app = new Vue({
el: '#app',
data: {
}
})
</script>
v-model
表单在实际开发中非常常见,一般是用于数据的提交,需要使用大量的表单,vue中使用v-model来实现表单元素和数据的双向绑定。
<body>
<div id="app">
<input type="text" name="name" v-model="name">
<h2>{{name}}</h2>
</div>
</body>
<script>
let app = new Vue({
el: '#app',
data: {
name: '张三'
}
})
</script>
当我们输入表单中的数据时,data中也会随之改变,data被改变后,插值运算符中的显示内容也会随之改变。
v-model绑定select
当我们选中option的时候,会将它对应的value赋值给mySelect。当我们mySelect的值改变时,option会自动选中对应的value的那一项
<body>
<div id="app">
<select v-model="mySelect">
<option value="java">Java从入门到精通</option>
<option value="python">python从入门到精通</option>
<option value="php">php从入门到精通</option>
<option value="mysql">mysql从删库到跑路</option>
</select>
</div>
</body>
<script>
let app = new Vue({
el: '#app',
data: {
mySelect: 'php'
}
})
</script>
监听器
如果我们需要监听某个值的变化,当这个值变化是,进行一些操作,可以使用监听器。监听器的属性名称是watch和data平级,监听器中的数据是方法,接收两个参数,分别为改变后的值和改变前的值。
<body>
<div id="app">
<input type="text" v-model="firstName">
<input type="text" v-model="lastName">
<h2>{{fullName}}</h2>
</div>
</body>
<script>
let app = new Vue({
el: '#app',
data: {
firstName: '张',
lastName: '狗子',
fullName: ''
},
watch: {
firstName: function(newVal, oldVal) {
// 在vue中,操作data、method必须使用this
this.fullName = this.firstName + this.lastName
},
lastName(newVal, oldVal) {
this.fullName = this.firstName + this.lastName
}
}
})
</script>
计算属性
我们知道在模板中可以通过插值语法实现一些data中的数据。但是某些情况,我们可能需要对数据进行一些转换后再实现,或者需要将多个数据结合起来进行实现。
| <body>
<div id="app">
<input type="text" v-model="firstName">
<input type="text" v-model="lastName">
<h2>{{fullName}}</h2>
</div>
</body>
<script>
let app = new Vue({
el: '#app',
data: {
firstName: '张',
lastName: '狗子'
},
computed: {
fullName() {
// 写法是个方法,但是使用的时候是作为属性使用的,和data一致。
return this.firstName + this.lastName
}
}
})
</script>
计算属性是一个属性,而不是方法,虽然写法是方法,但是我们使用的时候是直接视为一个属性去操作的,使用方式和data一致。 计算属性中使用到的data中的数据只要发生了变化,计算属性就会重新计算,如果两次获取计算属性的时候,里面使用到属性没有发生变化,计算属性会直接使用之前缓存的值。 计算属性的getter金额setter 每一个计算属性都包含get方法和set方法,在上面的例子中,我们只是使用get去读取计算属性的值,在某些情况下,我们可能会需要人工改变计算属性的数据,这个时候我们就需要使用setter方法。 计算属性如果需要定义set和get方法这时候计算属性就使用对象进行编写。
<body>
<div id="app">
<input type="text" v-model="firstName">
<input type="text" v-model="lastName">
<input type="text" v-model="fullName">
</div> </body>
<script>
let app = new Vue({
el: '#app',
data: { firstName: '张', lastName: '狗子' },
computed: {
fullName: { get() { console.log('调用了get方法') return this.firstName+' '+this.lastName },
set(val) { console.log('调用了set方法') const names = val.split(' ') this.firstName = names[0] this.lastName = names[1] }
}
}
})
</script>
注意点 计算属性,在computed中,可以定义一些属性,这些属性叫做计算属性,他本质上就是一个方法,但是,我们使用的时候是当做属性来使用,计算属性使用的过程中,一定不要加(),他就是一个属性。和data里的属性用法一样。 只要属性中所用到的data中的属性发生了变化,就会立即去重新计算属性的值。、 计算属性的结果会被缓存起来,方便下次调用,如果计算属性中用到的data都没有变化,就不会重新求值。 在计算属性中,无论如何都需要return一个值,用来代表这个属性的值。 计算属性和监听器的区别: computed:用法视为一个属性,并且结果会被缓存。 methods:标识方法,表示一个具体的操作,主要用来写业务逻辑 watch:是一个对象,key是需要监听的表达式,value是对应的回调函数,主要用来监听某些数据的变化,从而执行某些具体的业务逻辑,可以看做是计算属性和methods的结合体。
事件监听 v-on 简写 @
<body>
<div id="app">
<h2>{{count}}</h2>
<input type="text" v-on:focus="alertMsg">
<button v-on:click="addCount">点我</button>
<!-- v-on的简写方式 -->
<button @click="addCount">点我</button>
</div>
</body>
<script>
let app = new Vue({
el: '#app', data: { count: 0 },
methods: { addCount() { this.count++ },
alertMsg() { alert('获取了焦点') } } })
</script>
v-on参数 当通过methods定义方法,以供@click调用时,需要注意参数问题 1.如果该方法不需要参数,那么方法后的括号不可以添加,因为存在某些框架,如果加了括号之后,可能在页面渲染完毕后立即加载一遍该方法。 2.如果需要传入某个参数,那么这个时候需要括号,并且需要在括号中传入参数。
条件判断 v-if,v-else-if,v-else。
v-if可以根据表达式中的值渲染或者销毁元素和组件。
<body>
<div id="app">
<div v-if="score >= 90">优秀</div>
<div v-else-if="score >= 75">良好</div>
<div v-else-if="score >= 60">及格</div>
<div v-else>不及格</div>
<button @click="delScore">减分</button>
</div>
</body>
<script>
let app = new Vue({
el: '#app', data: { score: 100 },
methods: { delScore() { this.score -= 10 } } })
</script>
v-show 用法与v-if类似,也是用于条件判断的。
<body>
<div id="app">
<div v-show="score >= 90">优秀</div>
<div v-show="score >= 75 && score < 90">良好</div>
<div v-show="score >= 60 && score < 75">及格</div>
<div v-show="score < 60">不及格</div>
<button @click="delScore">减分</button>
</div>
</body>
<script>
let app = new Vue({
el: '#app', data: { score: 100 },
methods: { delScore() { this.score -= 10 } } })
</script>
二者的区别: v-if是完全不创建dom元素,而v-show则是创建dom元素,仅仅是使用display:none隐藏了该元素。 当需要频繁的显示,隐藏一些内容时,使用v-show。当我们仅有一次切换,某些v-if场景根本不会显示出来的时候,用v-if。
v-for遍历数组 格式:item in items ,后面的items代表着呢需要遍历的数组,item则表示每一项名称。
<body>
<div id="app">
<ul>
<li v-for="item in dataList">{{item}}</li>
</ul>
</div>
</body>
<script>
let app = new Vue({
el: '#app',
data: { dataList: [ 'Java从入门到精通', 'php从入门到精通', 'mysql从删库到跑路', 'Vue从单身到脱单' ]
} })
</script>
如果我们需要在遍历的过程中,获取该元素所在数值中的索引值,应该怎么操作?
<li v-for="(item, index) in dataList">{{index + ':' + item}}</li>
v-for遍历对象
<ul>
<li v-for="(value, key, index) in myInfo">{{index}}:{{key}}:{{value}}</li>
</ul>
myInfo: { id: 3, name: '张三', age: 23, hobby: '唱跳rap篮球' }
v-for遍历数组对象
<li v-for="item in userList">{{item.id}}--{{item.name}}--{{item.age}}</li> userList: [ {id: 3, name: '张三', age: 23}, {id: 4, name: '李四', age: 24}, {id: 5, name: '王五', age: 25}, {id: 6, name: '赵六', age: 26} ]