vue.js快速入门
1.学习目标
- 会创建Vue实例,知道Vue的常见属性
- 会使用Vue的生命周期的钩子函数
- 能够使用vue常见指令
- 能够使用vue计算属性和watch监控
- 能够编写Vue组件
- 能够使用axios发送异步请求获取数据
2.什么是Vue.js
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架
。与其它大型框架不同的是,Vue 被设计为可
以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,
当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
2.1 Vue作者了解一下
2.2 了解几个概念
2.2.1 渐进式框架:
可以选择性的使用该框架的一个或一些组件,这些组件的使用也不需要将框架全部组件都应用;而且
用了这些组件也不要求你的系统全部都使用该框架。
2.2.2 MVVM:
- M:即Model,模型,包括数据和一些基本操作
- V:即View,视图,页面渲染结果
- VM:即View-Model,模型与视图间的双向操作(无需开发人员干涉)
在MVVM之前,开发人员从后端获取需要的数据模型,然后要通过DOM操作Model渲染到View中。而后当用户操作视图,我们还需要通过DOM获取View中的数据,然后同步到Model中。而MVVM中的VM要做的事情就是把DOM操作完全封装起来,开发人员不用再关心Model和View之间是如何互相影响的:
-
只要Model发生了改变,View上自然就会表现出来。
-
当用户修改了View,Model中的数据也会跟着改变。
把开发人员从繁琐的DOM操作中解放出来,把关注点放在如何操作Model上。
2.2.3 SPA:
单页Web应用(single page web application,SPA): SPA 是一种特殊的 Web 应用,是加载单个 HTML 页面并在用户与应用程序交互时动态更新该页面的。它将所有的活动局限于一个 Web 页面中,仅在该 Web 页面初始化时加载相应的 HTML 、 JavaScript 、 CSS 。一旦页面加载完成, SPA 不会因为用户的操作而进行页面的重新加载或跳转,而是利用 JavaScript 动态的变换 HTML(采用的是 div 切换显示和隐藏),从而实现UI与用户的交互。在 SPA 应用中,应用加载之后就不会再有整页刷新。相反,展示逻辑预先加载,并有赖于内容Region(区域)中的视图切换来展示内容。
3.快速入门
3.1 Vue安装
参照官方的提供Vue安装,这里使用本地引用的方式
3.2 入门案例
<div id="app">
{{message}}
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
message: 'hello vue.js'
}
})
</script>
3.3 双向绑定
<div id="app">
<h1>
<label for="text"></label>
<input type="text" id="text" v-model="text">
</h1>
<h1>
{{text}}
</h1>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
text: '你好,南京艾瑞'
}
})
</script>
3.4 事件处理
<div id="app">
<h1>{{message}}</h1>
<button @click="reverse">反转字符串</button>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
message: 'hello world'
},
methods: {
reverse: function () {
this.message = this.message.split('').reverse().join('');
}
}
})
</script>
点击按钮进行测试
4.Vue实例
每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的
var vm = new Vue({
// 选项
})
4.1 模板和元素
通过el
选项将html
页面和vue
实例进行绑定
html模板
<div id="app">
</div>
Vue实例
<script>
var vm = new Vue({
el: '#app',
})
</script>
4.2 数据
当Vue实例被创建时,它会尝试获取在data中定义的所有属性,用于视图的渲染,并且监视data中的属性变化,当data发生改变,所有相关的视图都将重新渲染,这就是“响应式“系统。
html:
<div id="app">
<input type="text" v-model="message">
</div>
js:
<script>
var vm = new Vue({
el: '#app',
data: {
message: 'vue'
}
})
</script>
message
的变化会影响到 input
的值
input
中输入的值,也会导致vm
中的message
发生改变
4.3 方法
Vue实例中除了可以定义data属性,也可以定义方法,并且在Vue的作用范围内使用。
<div id="app">
<button v-on:click="_click">点我</button>
</div>
<script src="./vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
methods: {
_click: function () {
console.log('do something ...')
}
}
})
</script>
4.4 生命钩子
每个 Vue 实例在被创建时都要经过一系列的初始化过程 :创建实例,装载模板,渲染模板等。Vue为生命周期中的每个状态都设置了钩子函数(监听函数)。每当Vue实例处于不同的生命周期时,对应的函数就会被触发调用。
不要在选项 property 或回调上使用箭头函数,比如 created: () => console.log(this.a) 或 vm.$watch(‘a’, newValue => this.myMethod())。因为箭头函数并没有 this,this 会作为变量一直向上级词法作用域查找,直至找到为止,经常导致 Uncaught TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function 之类的错误。
4.4.1 生命周期
vm.$el :Vue 实例使用的根 DOM 元素
vm.$root :当前组件树的根 Vue 实例。如果当前实例没有父实例,此实例将会是其自己。
4.4.2 钩子函数
<div id="app">
<input type="text" v-model="message">
</div>
<script src="./vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
message: ''
},
beforeCreate() {
console.log('beforeCreated')
},
created() {
console.log('created')
},
beforeMount() {
console.log('beforeMount')
},
mounted() {
console.log('mounted')
},
beforeUpdate() {
console.log('beforeUpdate')
},
updated() {
console.log('updated')
},
beforeDestroy() {
console.log('beforeDestroy')
},
destroyed() {
console.log('destroyed')
}
})
</script>
5.模板语法
5.1 插值
花括号表达式
{{}}
5.2 指令
一些指令能够接收一个“参数”,在指令名称之后以冒号表示。
v-bind:
v-bind
可以绑定属性和自定义属性
<div id="app">
<a v-bind:href="url">跳转</a>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
url: 'https://www.baidu.com'
}
})
</script>
v-on:
v-on
可以绑定事件属性
<div id="app">
<span>{{number}}</span>
<button v-on:click="number++">incr</button>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
number: 1
}
})
</script>
v-bind
和v-on
可以简写,如v-bind:href
简写成:href
,而v-on:click
可以简写成@click
v-if和v-show
v-if
和v-show
的区别v-if
不会渲染标签,而v-show
使用的display:none;
<div id="app">
<button @click="isShow=!isShow">点我</button>
<p v-if="isShow">你看见了我</p>
<p v-show="isShow">你看见了我</p>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
isShow: true
}
})
</script>
当isShow=true
的时候
当
isShow=false
的时候
6.计算属性和侦听器
计算属性computed
:当多个数据变化影响同一个结果的时候使用计算属性
侦听器watch
:当一个数据发生变化影响多个结果的时候使用侦听器
计算属性和方法的区别:计算属性是基于它们的响应式依赖进行缓存的
下面这个例子中,商品的总价有单价和数量计算得到,这里就适合使用计算属性,如果使用侦听器则需要侦听多个属性才能正确的获取到商品的总价。
<div id="app">
<div>
<label for="price">单价:</label>
<input type="text" id="price" v-model="price">
</div>
<div>
<label for="count">数量:</label>
<input type="text" id="count" v-model="count">
</div>
<div>
<label for="totalPrice">总价:</label>
<input type="text" id="totalPrice" v-model="totalPrice">
</div>
<div>
<label for="total">总价:</label>
<input type="text" id="total" v-model="total">
</div>
</div>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
price: 10,
count: 1,
total: 10
},
// 计算属性
computed: {
// 当价格或者数量发生变化的时候,总价会重新进行计算
totalPrice() {
return this.price * this.count;
}
},
// 侦听器
watch: {
price(newVal, val) {
// 当价格发生变化时
this.total = newVal * this.count;
},
count(newVal, val) {
// 当数量发生变化时
this.total = this.price * newVal;
}
}
})
</script>
7.css&style的绑定
我们可以传给 v-bind:class
一个对象,以动态地切换 class
:
<div id="app">
<div class="div" :class="{active:isActive}"></div>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
isActive: true
}
})
</script>
样式便渲染为:
<div class="div active"></div>
v-bind:style
可以动态的绑定样式表:
<div id="app">
<p :style="{'font-size':size+'px'}">字体</p>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
size: 30
}
})
</script>
8. 列表渲染
v-for
,我们可以用 v-for
指令基于一个数组来渲染一个列表。v-for
指令需要使用 item in items
形式的特殊语法,其中 items
是源数据数组,而 item
则是被迭代的数组元素的别名。
为了给 Vue
一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key
属性。
<div id="app">
<ul>
<li v-for="(item,index) in list" :key="item.id">
index:{{index}},name:{{item.name}},age:{{item.age}}
</li>
</ul>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
list: [
{id: 1, name: 'jack1', age: 20},
{id: 2, name: 'jack2', age: 20},
{id: 3, name: 'jack3', age: 20},
]
}
})
</script>
运行结果
9.事件处理
可以用 v-on
指令监听 DOM
事件,并在触发时运行一些 JavaScript
代码。
<div id="app">
<button @click="_click">点我</button>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {},
methods: {
_click() {
console.log('lick')
}
}
})
</script>
10.表单输入
可以用 v-model
指令在表单 <input>、<textarea>
及 <select>
元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model
本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
10.1 文本
<div id="app">
<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
message: ''
}
})
</script>
10.2 文本域
<div id="app">
<textarea v-model="message" placeholder="add multiple lines"></textarea>
<p>Message is: {{ message }}</p>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
message: ''
}
})
</script>
10.3 单个复选框
<div id="app">
<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">{{ checked }}</label>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
checked: false
}
})
</script>
10.4 多选复选框
<div id="app">
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<label for="jack">Jack</label>
<input type="checkbox" id="john" value="John" v-model="checkedNames">
<label for="john">John</label>
<input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
<label for="mike">Mike</label>
<br>
<span>Checked names: {{ checkedNames }}</span>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
checkedNames: []
}
})
</script>
10.5 单选按钮
<div id="app">
<input type="radio" id="one" value="One" v-model="picked">
<label for="one">One</label>
<br>
<input type="radio" id="two" value="Two" v-model="picked">
<label for="two">Two</label>
<br>
<span>Picked: {{ picked }}</span>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
picked: ''
}
})
</script>
10.6 选择框
<div id="app">
<select v-model="selected">
<option disabled value="">请选择</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<span>Selected: {{ selected }}</span>
</div>
<script src="./vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
selected: ''
}
})
</script>
11.组件入门
组件是可复用的 Vue 实例,我们可以给组件自定义个名字。Vue将页面中所有的模块都可以设计成一个组件,进行重复利用。
11.1 基本使用
- 组件的
template
必须是单个根元素 - 组件中的
data
必须是函数
<!--html-->
<div id="app">
<!--引用组件-->
<number-counter></number-counter>
<hr>
<number-counter></number-counter>
</div>
<script src="./vue.js"></script>
<!--js-->
<script>
// 定义一个组件:number-counter 为组件的名称
Vue.component('number-counter', {
// template: 组件的模板,必须只能有一个跟元素
template: `
<div class="number-counter">
<p>点击的总次数:{{number}}</p>
<button @click="numberAdd">点击我</button>
</div>
`,
// 和vue的实例有所区别,这里的data需要是函数
data() {
return {
number: 0
}
},
// 方法:和vue实例中的methods一样
methods: {
numberAdd() {
this.number++
}
}
})
// 创建一个vue实例绑定 app
new Vue({
el: '#app'
})
</script>
运行结果
11.2 向组件进行参数传递
可以在组件中通过props
声明接收的参数,在使用组件的时候使用v-bind
进行传值。
props
声明的变量中,Array
和Object
类型的缺省值必须使用 default
函数。
<body>
<!--html-->
<div id="app">
<!--引用组件-->
<web-text :text="word"></web-text>
</div>
<script src="./vue.js"></script>
<!--js-->
<script>
Vue.component('web-text', {
template: `
<div class="text">
<p>{{text}}</p>
</div>
`,
props: {
text: {
type: String,
default: '文本内容',
required: false
},
// 数组和对象必须是函数
obj: {
type: Object,
default() {
return {}
}
},
arr: {
type: Array,
default() {
return [];
}
}
}
})
// 创建一个vue实例绑定 app
new Vue({
el: '#app',
data: {
word: 'hello vue'
}
})
</script>
11.3 自定义事件(子组件调用父组件的方法)
自定义事件是通过 this.$emit('myEvent')
,有子组件调用父组件的函数来实现。
代码说明:
- 在
web-text
组件上绑定一个my-event
事件,当事件触发后将调用_myEvent
函数; - 当子组件中的
word
值发生该改变的时候,通过this.$emit('my-event', this.word)
触发事件,并传递参数到父组件。
<!--html-->
<div id="app">
<!--引用组件-->
<web-text v-on:my-event="_myEvent"></web-text>
</div>
<script src="./vue.js"></script>
<!--js-->
<script>
Vue.component('web-text', {
template: `
<div>
<input type="text" v-model="word">
</div>
`,
data() {
return {
word: ''
}
},
watch: {
word: function () {
this.$emit('my-event', this.word)
}
}
})
// 创建一个vue实例绑定 app
new Vue({
el: '#app',
methods: {
_myEvent(word) {
console.log("接收到的参数:" + word)
}
}
})
</script>