一:Vue初体验
1 | // let(变量)/const(常量) |
1 | <!DOCTYPE html> |
1.创建options
1 | 1.el |
2.Vue.prototype
- 在main.js中,设置全局变量
1 | 这种情况下,你可以通过在原型上定义它们使其在每个 Vue 的实例中可用 |
二:插值语法:
1.==Mustache==:胡须/胡子
1 | 就是双大括号{{}} |
2.v-once
1 | message改变后v-once修饰的数据显示不会改变 |
3.v-html
1 | 将vue中返回的标签显示 |
4.v-text
1 | <h2 v-text="message">, 李银河!</h2> |
5.v-pre
1 | 原封不动地显示内容 |
6.v-cloak
1 | cloak:斗篷---->如果数据加载延迟,这个属性可以不让message显示到页面,对用户不友好 |
三:v-bind动态绑定
1.v-bind 绑定基本属性
1 | 对dom对象的某些属性进行动态绑定 |
2.v-bind绑定class
1 | <h2 :class="{key:value}"></h2> 即 <h2 :class="{类名:boolean}"></h2> |
1 | 用法一:直接通过{}绑定一个类 |
例子:
1 | <div id="app"> |
3.v-bind动态绑定style
1 | 绑定方式一:对象语法 |
1 | <div id="app"> |
四:==computed==计算属性
1 | 我们可能需要对数据进行一些转化后再显示,或者需要将多个数据结合起来进行显示 |
1.计算属性的复杂操作:
1 | <div id="app"> |
2.计算属性的setter和getter方法
1 | <div id="app"> |
3.对比computed和methods
1 | 计算属性会进行缓存,如果多次使用时,计算属性只会调用一次。,所以一般使用computed |
五:ES6补充
1 | // ES5中的var是没有块级作用域的(if/for) |
1 | 第一种:错误的作用域---->最后i一直为5 |
1 | 第二种函数闭包; |
1 | 第三种常用let: |
1:const
1 | <script> |
2.对象字面量增强写法
1 | <script> |
六:v-on监听事件
1.基本使用
1 |
|
2.v-on的参数问题
1.当通过methods中定义方法,以供@click调用时,需要注意参数问题:
2.情况一:如果该方法不需要额外参数,那么方法后的()可以==不添加==。
3.但是注意:如果方法本身中有一个参数,那么会默认将原生事件event参数传递进去
4.情况二:如果需要同时传入某个参数,同时需要event时,可以通过$event传入事件。
1 | <div id="app"> |
3.v-on的修饰符
1 | <div id="app"> |
七:条件判断
1.v-if
满足条件true才会显示,一般为bollean类型
1 | <div id="app"> |
2.v-if 和 v-else
1 | <div id="app"> |
3.v-if 和 v-else-if 和 v-else
1 | <div id="app"> |
4.用户登录切换
小问题:
如果我们在有输入内容的情况下,切换了类型,我们会发现文字依然显示之前的输入的内容。
但是按道理讲,我们应该切换到另外一个input元素中了。
在另一个input元素中,我们并没有输入内容。
为什么会出现这个问题呢?
问题解答:
这是因为Vue在进行DOM渲染时,出于性能考虑,会尽可能的复用已经存在的元素,而不是重新创建新的元素。
在上面的案例中,Vue内部会发现原来的input元素不再使用,直接作为else中的input来使用了。
解决方案:
如果我们不希望Vue出现类似重复利用的问题,可以给对应的input添加key
并且我们需要保证key的不同
1 | <div id="app"> |
5.v-show
v-show的用法和v-if非常相似,也用于决定一个元素是否渲染:
v-if和 v-show 对比
v-if和v-show都可以决定一个元素是否渲染,那么开发中我们如何选择呢?
v-if当条件为false时,压根不会有对应的元素在DOM中。
v-show当条件为false时,仅仅是将元素的display属性设置为none而已。
开发中如何选择呢?
当需要在显示与隐藏之间切片很频繁时,使用v-show
当只有一次切换时,通过使用v-if
1 | <div id="app"> |
八:循环遍历
1.v-for遍历数组
1 | <div id="app"> |
2.v-for遍历对象
1 | <div id="app"> |
3.v-for添加key
1.官方推荐我们在使用v-for时,给对应的元素或组件添加上一个:key属性。
2.key的作用主要是为了高效的更新虚拟DOM
3.我们希望可以在B和C之间加一个F,添加key会提高效率
1 | <div id="app"> |
4.数组的方法响应式
1.因为Vue是响应式的,所以当数据发生变化时,Vue会自动检测数据变化,视图会发生对应的更新。
2.Vue中包含了一组观察数组编译的方法,使用它们改变数组也会触发视图的更新。
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
1 | <div id="app"> |
5.作业展示
点中哪个就会变成红色,即改变样式:
1 |
|
6.书籍购物车
**知识点补充:**toFixed
把数字转换为字符串,结果的小数点后有指定位数的数字:
var num = 5.56789;
var n=num.toFixed(2);
n 输出结果:5.57
index.html:
1 |
|
main.js:
1 | const app = new Vue({ |
style.css:
1 | table { |
7.filter
1 | filter中的回调函数有一个要求,必须返回一个boolean值 |
8.map
1 | //map函数的调用 |
9.reduce
1 | //reduce作用对数组中所有的内容进行汇总 |
例子:
1 | 计算数组的和 |
更加简化的箭头函数:
1 | let total = nums.filter(n => n<100).map(n => n*2).reduce((pre,n) => pre+n) |
计算上个购物车例子的总价钱:
1 | return this.books.reduce(function (preValue,book){ |
九:v-model双向
.Vue中使用v-model指令来实现表单元素和数据的双向绑定。
案例分析:
当我们在输入框输入内容时
因为input中的v-model绑定了message,所以会实时将输入的内容传递给message,message发生改变。
当message发生改变时,因为上面我们使用Mustache语法,将message的值插入到DOM中,所以DOM
会发生响应的改变。
v-model原理
v-model其实是一个语法糖,它的背后本质上是包含两个操作:
v-bind绑定一个value属性
v-on指令给当前元素绑定input事件
也就是说下面的代码:等同于下面的代码:
<input type="text" v-model="message"> 等同于 <input type="text" v-bind:value="message" v-on:input="message = $event.target.value">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 1.v-model基本使用
```js
<div id="app">
<input type="text" v-model="message">
{{message}}
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
}
})
</script>
2.v-model和radio
- 这样双向绑定后可以把得到的数据通过浏览器发送过去,从而保存在数据库
1 | <div id="app"> |
3.v-model和checkbox
1 | <div id="app"> |
4.v-model和select
1 | <div id="app"> |
5.值绑定
- 但是真实开发中,这些input的值可能是从网络获取或定义在data中的。
- 所以我们可以通过v-bind:value动态的给value绑定值。
1 | <label v-for="item in originHobbies" :for="item"> |
6.修饰符
- lazy修饰符:
- 默认情况下,v-model默认是在input事件中同步输入框的数据的
- 也就是说,一旦有数据发生改变对应的data中的数据就会自动发生改变
- lazy修饰符可以让数据在失去焦点或者回车时才会更新:
- number修饰符:
- 默认情况下,在输入框中无论我们输入的是字母还是数字,都会被当做字符串类型进行处理。
- 但是如果我们希望处理的是数字类型,那么最好直接将内容当做数字处理。
- number修饰符可以让在输入框中输入的内容自动转成数字类型
- trim修饰符:
- 如果输入的内容首尾有很多空格,通常我们希望将其去除
- trim修饰符可以过滤内容左右两边的空格
1 | <div id="app"> |
十:组件化开发
- 步骤:
- 创建组件构造器
- 注册组件
- 使用组件。
1.组件化基本使用
- Vue.extend()
- 调用Vue.extend()创建的是一个组件构造器
- 通常在创建组件构造器时,传入template代表我们自定义组件的模板。
- 该模板就是在使用到组件的地方,要显示的HTML代码
- Vue.component()
- 调用Vue.component()是将刚才的组件构造器注册为一个组件,并且给它起一个组件的标签名称
- p所以需要传递两个参数:1、注册组件的标签名 2、组件构造器
- 组件必须挂载在某个Vue实例下,否则它不会生效
- 使用了三次
- 使用了三次
1 | <div id="app"> |
2.全局组件和局部组件
1 | 全局组件: |
3.父组件和子组件
1 | <div id="app"> |
4.组件的语法糖
- 在上面注册组件的方式,可能会有些繁琐
- Vue为了简化这个过程,提供了注册的语法糖。
- 主要是省去了调用Vue.extend()的步骤,而是可以直接使用一个对象来代替。
1 | div id="app"> |
5.组件模板分离
1 | <div id="app"> |
6.组件中的数据存放问题
- 组件对象也有一个data属性(也可以有methods等属性,下面我们有用到)
- 只是这个data属性必须是一个函数
- 而且这个函数返回一个对象,对象内部保存着数据
1 | <div id="app"> |
7.data为什么是函数
- 为什么data在组件中必须是一个函数呢?
- 首先,如果不是一个函数,Vue直接就会报错。
- 其次,原因是在于Vue让每个组件对象都返回一个新的对象,因为如果是同一个对象的,组件在多次使用后会相互影响。
1 | <!--组件实例对象--> |
8.父组件向子组件传递数据
- 在组件中,使用选项props来声明需要从父级接收到的数据。
- props的值有两种方式
- 方式一:字符串数组,数组中的字符串就是传递时的名称。
- 方式二:对象,对象可以设置传递时的类型,也可以设置默认值等。
1 | <div id="app"> |
9.父传子(props中的驼峰标识)
- 尽量不要用驼峰标识
- 用驼峰标识的时候需要在绑定的时候加上 “-小写”
1 |
|
10.子传父(自定义事件)
- 自定义事件的流程
- 在子组件中,通过$emit()来触发事件。
- 在父组件中,通过v-on来监听子组件事件。
1 | <!--父组件模板--> |
11.父访问子-children-refs
- 有时候我们需要父组件直接访问子组件,子组件直接访问父组件,或者是子组件访问跟组件。
- 父组件访问子组件:使用$children或$refs reference(引用),pthis.$children是一个数组类型,它包含所有子组件对象。
- 子组件访问父组件:使用$parent(常用)
1 | <div id="app"> |
12.子访父-parent
1 | <div id="app"> |
十一:组件化高级
1.slot插槽基本使用
1 | <!-- |
2.具名插槽
- 即替换具体的一个插槽标签内容,区分替换的哪个插槽
- 非常简单,只要给slot元素一个name属性即可
1 | <div id="app"> |
3.编译作用域
- 官方给出了一条准则:父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译
1 | <div id="app"> |
4.作用域插槽案例
- 需求:
- 父组件获得子组建的数据,但是不以子组件的模板展示,而是以父组件新的模板展示子组件的数据
1 | <div id="app"> |
5.导入和导出
- 某些情况下,一个模块中包含某个的功能,我们并不希望给这个功能命名,而且让导入者可以自己来命名
- 这个时候就可以使用export default
- export default在同一个模块中,不允许同时存在多个。
- import使用
- 首先,我们需要在HTML代码中引入两个js文件,并且类型需要设置为module
- 如果我们希望某个模块中所有的信息都导入,一个个导入显然有些麻烦:
- 通过*可以导入模块中所有的export变量
- 但是通常情况下我们需要给*起一个别名,方便后续的使用
导出:
1 | var name = '小明' |
导入:
1 | // 1.导入的{}中定义的变量 |
十二:箭头函数
1.箭头函数的基本使用
1 | <script> |
2.箭头函数参数和返回值
1 | <script> |
3.箭头函数中的this
1 | <script> |
十三:router路由
1.vue-router概念
- vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用
- 我们可以访问其官方网站对其进行学习: https://router.vuejs.org/zh/
- 路由用于设定访问路径, 将路径和组件映射起来.
- 在vue-router的单页面应用中, 页面的路径的改变就是组件的切换
2.vue-router步骤
- 第一步: 创建路由组件
- 第二步: 配置路由映射: 组件和路径映射关系
- 第三步: 使用路由: 通过
和
components文件夹:
about.vue
1 | <template> |
Home.vue
1 | <template> |
index.js
1 | // 配置路由相关的信息 |
显示App.vue
1 | <template> |
3.默认路由
- 我们在routes中又配置了一个映射
- path配置的是根路径: /
- redirect是重定向, 也就是我们将根路径重定向到/home的路径下, 这样就可以得到我们想要的结果了.
1 | { |
4.history模式
1 | const router = new VueRouter({ |
5.router-link补充
中, 我们只是使用了一个属性: to, 用于指定跳转的路径. <router-link to="/home" tag="button" replace active-class="active">首页</router-link>+ active-class: 当<router-link>对应的路由匹配成功时, 会自动给当前元素设置一个router-link-active的class, 设置active-class可以修改默认的名称 + ``` <!--<router-link to="/home" tag="button" replace active-class="active">首页</router-link>-->1
2
3
4
5
6
7
8
9
+ <router-link>还有一些**其他属性**:
+ tag: tag可以指定<router-link>之后渲染成什么组件, 比如上面的代码会被渲染成一个<li>元素, 而不是<a>
+ replace: replace不会留下history记录, 所以指定replace的情况下, 后退键返回不能返回到上一个页面中
+ ```
<!--<router-link to="/home" tag="button" replace>首页</router-link>-->1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
## 6.动态路由
+ 在某些情况下,一个页面的path路径可能是不确定的,比如我们进入用户界面时,希望是如下的路径:
+ /user/aaaa或/user/bbbb
+ 除了有前面的/user之外,后面还跟上了用户的ID
+ 这种path和Component的匹配关系,我们称之为动态路由(也是路由传递数据的一种方式)。



## 7.懒加载
+ 当打包构建应用时,Javascript 包会变得非常大,影响页面加载。
+ 如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了
+ 路由懒加载做了什么?
+ 路由懒加载的主要作用就是将路由对应的组件打包成一个个的js代码块.
+ 只有在这个路由被访问到的时候, 才加载对应的组件
+ **懒加载的方式**:
+ const Home = () => import('../components/Home.vue')
## 8.路由嵌套
```vue
{
path: '/home',
component: Home,
meta: {
title: '首页'
},
children: [
// {
// path: '',
// redirect: 'news'
// },
{
path: 'news',
component: HomeNews
},
{
path: 'message',
component: HomeMessage
}
]
}
9.参数传递
- 传递参数主要有两种类型: params和query
- params的类型:
- 配置路由格式: /router/:id
- 传递的方式: 在path后面跟上对应的值
- 传递后形成的路径: /router/123, /router/abc
- query的类型:
- 配置路由格式: /router, 也就是普通配置
- 传递的方式: 对象中使用query的key作为传递方式
- 传递后形成的路径: /router?id=123, /router?id=abc
- 获取参数:
1 | <h2>{{$route.query.name}}</h2> |
10.导航守卫
- 什么是导航守卫?
- vue-router提供的导航守卫主要用来监听监听路由的进入和离开的.
- vue-router提供了beforeEach和afterEach的钩子函数, 它们会在路由即将改变前和改变后触发
- 我们可以利用beforeEach来完成标题的修改


1 | // 前置守卫(guard) |
11.keep-alive
- keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。
- 它们有两个非常重要的属性:
- include - 字符串或正则表达,只有匹配的组件会被缓存
- exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存
- router-view 也是一个组件,如果直接被包在 keep-alive 里面,所有路径匹配到的视图组件都会被缓存:
1 | <!-- 路由匹配到的组件将显示在这里 --> |
1 | // 这两个函数, 只有该组件被保持了状态使用了keep-alive时, 才是有效的 |
十四:promise
- Promise到底是做什么的呢?
- Promise是异步编程的一种解决方案
1.promise的基本使用
1 |
|
2.promise另外处理形式
1 |
|
3.promise链式调用简写
1 |
|