coderwhy-vue学习

(新)2019Vue、Vuejs最详细教程-入门到项目实战

coderwhy-vue学习

  • 一、邂逅Vuejs
    • 1、认识Vuejs
      • 1.1 简单认识一下Vuejs
    • 2、Vuejs安装方式
      • 2.1 CDN引入
      • 2.2 下载和引入
      • 2.3 NPM安装管理
    • 3、Vuejs初体验
      • 3.1 Hello Vuejs
    • 4、Vuejs的MVVM
    • 5. 创建Vue实例传入的options
  • 6.Vue的生命周期
  • 二、模板语法
    • 1. 插值操作
      • 1.1 Mustache
      • 1.2 v-once
      • 1.3 v-html
      • 1.4 v-text
      • 1.5 v-pre
      • 1.6 v-cloak
    • 2. 绑定属性 v-bind
    • 3.计算属性
      • 3.1什么是计算属性?
      • 3.2 计算属性的复杂操作
      • 3.3 计算属性的setter和getter
      • 3.4 let/var
      • 3.5 const的使用
      • 3.6对象增强写法
    • 4. 事件监听
      • 4.1v-on
      • 4.2 v-on参数
      • 4.3v-on 修饰符
    • 5. 条件判断
      • 5.1 v-if、v-else-if、v-else
      • 5.2 条件渲染案例
      • 5.3 案例小问题
      • 5.4 v-show
    • 6. 循环遍历
      • 6.1 v-for遍历数组
      • 6.2 v-for遍历对象
      • 6.3 组件的key属性
      • 6.4 检测数组更新
    • 7. 阶段案例
      • 7.1 高阶函数
    • 8. v-model
      • 8.1 v-model原理
      • 8.2 v-model:radio
      • 8.3 v-model:checkbox
      • 8.4 v-model:select
      • 8.5 修饰符
  • 三、组件化开发
    • 1. 认识组件化
      • 1.1 什么是组件化?
      • 1.2 Vue组件化思想
    • 2. 注册组件
      • 2.1 注册组件的基本步骤
      • 2.2 注册组件步骤解析
    • 3. 组件其他补充
      • 3.1 全局组件和局部组件
      • 3.2 父组件和子组件
      • 3.3 注册组件语法糖
      • 3.4 模板的分离写法
    • 4. 组件数据存放
      • 4.1 组件可以访问Vue实例数据吗?
      • 4.2 组件数据的存放
    • 5. 父子组件通信
    • 6. 父级向子级传递
      • 6.1 props基本用法
    • 7. 子级向父级传递
    • 8. 插槽slot
      • 8.1 slot基本使用
      • 8.2 具名插槽slot
      • 8.3 编译作用域
      • 8.4 作用域插槽
  • 四、Webpack详解
    • 1. 认识webpack
      • 1.1 什么是Webpack?
      • 1.2 和grunt/gulp的对比
    • 2. webpack的安装
    • 3. webpack的配置
      • 3.1 准备工作
      • 3.2 js文件的打包
      • 3.3 入口和出口
    • 4. loader的使用
      • 4.1 什么是loader?
      • 4.2 css文件处理
      • 4.3 less文件处理
      • 4.4 图片文件处理
      • 4.5 ES6语法处理
    • 5. webpack中配置Vue
      • 5.1 安装
      • 5.2 el和template区别
      • 5.3 Vue组件化开发引入
    • 6. plugin的使用
      • 6.1认识plugin
      • 6.2 添加版权的Plugin
      • 6.3 打包html的plugin
      • 6.4 js压缩的Plugin
    • 7 搭建本地服务器
  • 五、Vue CLI
    • 1. Vue CLI的定义
    • 2. Vue CLI的使用
      • 2.1 Vue CLI使用前提 - Node
      • 2.2 Vue CLI使用前提 - Webpack
      • 2.3 Vue CLI的使用
    • 3. Vue CLI详解
      • 3.1 Vue CLI初始化项目详解
      • 3.2 Vue CLI2目录结构详解
      • 3.3 Runtime-Compiler和Runtime-only的区别
      • 3.4 render和template
      • 3.5 render 函数的使用
      • 3.6 npm run build 和npm run build运行图解
      • 3.7 修改配置:webpack.base.conf.js起别名
    • 4.Vue CLI3
      • 4.1Vue CLI3介绍
      • 4.2 Vue CLI3 目录结构详解
      • 4.3 自定义配置:起别名
  • 六.vue-router
    • 1. 认识路由
      • 1.1 什么是路由
      • 1.2 后端路由阶段
      • 1.3 前端路由阶段
      • 1.4 URL的hash
      • 1.5 HTML5的history模式
      • 1.6认识vue-router\
    • 2. vue-router基本使用
      • 2.1 安装和使用vue-router
      • 2.2 路由的默认路径
      • 2.3 HTML5的History模式
      • 2.4 router-link补充
      • 2.5 路由代码跳转
      • 2.6 动态路由
      • 2.7 认识路由的懒加载
    • 3. vue-router嵌套路由
      • 3.1 认识嵌套路由
      • 3.2 嵌套路由实现
      • 3.3 嵌套默认路径
    • 4. vue-router参数传递
      • 4.1 准备工作
      • 4.2 传递参数的方式
      • 4.3 获取参数
      • 4.4 r o u t e 和 route和 routerouter是有区别的
    • 5. vue-router导航守卫
      • 5.1 为什么使用导航守卫?
      • 5.2 导航守卫使用
    • 6. keep-alive
      • 6.1 keep-alive遇见vue-router
    • 7.TabBar实现思路
  • 七 Promise
    • 1.Promise的定义
    • 2.网络请求的回调地狱
    • 3. 定时器异步事件
    • 4.Promise三种状态
    • 5.Promise链式调用
  • 八、Vuex
    • 1. Vuex的定义
      • 1.1 Vuex是做什么的?
      • 1.2 管理什么状态呢?
    • 2. Vuex简单实用
      • 2.1 简单的案例
    • 3.Vuex核心概念
      • 3.1 State单一状态树
      • 3.2 Getters基本使用
      • 3.3 Mutation状态更新
      • 3.4 Action
      • 3.5 Module
    • 4. 项目结构

一、邂逅Vuejs

1、认识Vuejs

1.1 简单认识一下Vuejs

  1. Vue (读音 /vjuː/,类似于 view),不要读错。
  2. Vue是一个渐进式的框架,什么是渐进式的呢?

    渐进式意味着你可以将Vue作为你应用的一部分嵌入其中,带来更丰富的交互体验。
    或者如果你希望将更多的业务逻辑使用Vue实现,那么Vue的核心库以及其生态系统。
    比如Core+Vue-router+Vuex,也可以满足你各种各样的需求。

  3. Vue有很多特点和Web开发中常见的高级功能

    解耦视图和数据
    可复用的组件
    前端路由技术
    状态管理
    虚拟DOM
    这些特点,你不需要一个个去记住,我们在后面的学习和开发中都会慢慢体会到的,一些技术点我也会在后面进行讲解。

  4. 学习Vuejs的前提?

    从零学习Vue开发,并不需要你具备其他类似于Angular、React,甚至是jQuery的经验。
    但是你需要具备一定的HTML、CSS、JavaScript基础。

2、Vuejs安装方式

2.1 CDN引入

<!-- 开发环境版本,包含了有帮助的命令行警告 --> 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 生产环境版本,优化了尺寸和速度 -->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

2.2 下载和引入

开发环境 https://vuejs.org/js/vue.js 
生产环境 https://vuejs.org/js/vue.min.js

2.3 NPM安装管理

后续通过webpack和CLI的使用,我们使用该方式。

3、Vuejs初体验

3.1 Hello Vuejs

coderwhy-vue学习_第1张图片

4、Vuejs的MVVM

什么是MVVM呢?
通常我们学习一个概念,最好的方式是去看维基百科(对,千万别看成了百度百科)
https://zh.wikipedia.org/wiki/MVVM
我们直接来看Vue的MVVM
coderwhy-vue学习_第2张图片

  • View层:

视图层
在我们前端开发中,通常就是DOM层。
主要的作用是给用户展示各种信息。

  • Model层:

数据层
数据可能是我们固定的死数据,更多的是来自我们服务器,从网络上请求下来的数据。
在我们计数器的案例中,就是后面抽取出来的obj,当然,里面的数据可能没有这么简单。

  • VueModel层:

视图模型层
视图模型层是View和Model沟通的桥梁。
一方面它实现了Data Binding,也就是数据绑定,将Model的改变实时的反应到View中
另一方面它实现了DOM Listener,也就是DOM监听,当DOM发生一些事件(点击、滚动、touch等)时,可以监听到,并在需要的情况下改变对应的Data。

5. 创建Vue实例传入的options

你会发现,我们在创建Vue实例的时候,传入了一个对象options。这个options中可以包含哪些选项呢?
详细解析
目前掌握这些选项:

el:
类型:string | HTMLElement
作用:决定之后Vue实例会管理哪一个DOM。
data:
类型:Object | Function (组件当中data必须是一个函数)
作用:Vue实例对应的数据对象。
methods:
类型:{ [key: string]: Function }
作用:定义属于Vue的一些方法,可以在其他地方调用,也可以在指令中使用。

6.Vue的生命周期

coderwhy-vue学习_第3张图片

二、模板语法

1. 插值操作

1.1 Mustache

coderwhy-vue学习_第4张图片

1.2 v-once

该指令后面不需要跟任何表达式(比如之前的v-for后面是由跟表达式的)
该指令表示元素和组件(组件后面才会学习)只渲染一次,不会随着数据的改变而改变。
coderwhy-vue学习_第5张图片
coderwhy-vue学习_第6张图片

1.3 v-html

  • 某些情况下,我们从服务器请求到的数据本身就是一个HTML代码
    如果我们直接通过{{}}来输出,会将HTML代码也一起输出。
    但是我们可能希望的是按照HTML格式进行解析,并且显示对应的内容。
  • 如果我们希望解析出HTML展示
    可以使用v-html指令
    该指令后面往往会跟上一个string类型
    会将string的html解析出来并且进行渲染
    coderwhy-vue学习_第7张图片

1.4 v-text

v-text作用和Mustache比较相似:都是用于将数据显示在界面中
v-text通常情况下,接受一个string类型
coderwhy-vue学习_第8张图片
在这里插入图片描述

1.5 v-pre

v-pre用于跳过这个元素和它子元素的编译过程,用于显示原本的Mustache语法。
coderwhy-vue学习_第9张图片
在这里插入图片描述

1.6 v-cloak

在某些情况下,我们浏览器可能会直接显然出未编译的Mustache标签。
cloak: 斗篷
coderwhy-vue学习_第10张图片
coderwhy-vue学习_第11张图片

2. 绑定属性 v-bind

v-bind用于绑定一个或多个属性值,或者向另一个组件传递props值(这个学到组件时再介绍)
在开发中,有哪些属性需要动态进行绑定呢?
还是有很多的,比如图片的链接src、网站的链接href、动态绑定一些类、样式等等
比如通过Vue实例中的data绑定元素的src和href,代码如下:
coderwhy-vue学习_第12张图片

v-bind有一个对应的语法糖,也就是简写方式
在开发中,我们通常会使用语法糖的形式,因为这样更加简洁。
简写方式如下:
coderwhy-vue学习_第13张图片

绑定class有两种方式:

  • 对象语法
    用法一:直接通过{}绑定一个类
<h2 :class="{'active': isActive}">Hello World</h2>

用法二:也可以通过判断,传入多个值
<h2 :class="{'active': isActive, 'line': isLine}">Hello World</h2>

用法三:和普通的类同时存在,并不冲突
注:如果isActive和isLine都为true,那么会有title/active/line三个类
<h2 class="title" :class="{'active': isActive, 'line': isLine}">Hello World</h2>

用法四:如果过于复杂,可以放在一个methods或者computed中
注:classes是一个计算属性
<h2 class="title" :class="classes">Hello World</h2>
  • 数组语法
    用法一:直接通过{}绑定一个类
<h2 :class="['active']">Hello World</h2>

用法二:也可以传入多个值
<h2 :class=[‘active’, 'line']">Hello World</h2>

用法三:和普通的类同时存在,并不冲突
注:会有title/active/line三个类
<h2 class="title" :class=[‘active’, 'line']">Hello World</h2>

用法四:如果过于复杂,可以放在一个methods或者computed中
注:classes是一个计算属性
<h2 class="title" :class="classes">Hello World</h2>

v-bind绑定style有两种方式:

  • 对象语法
    :
style="{color: currentColor, fontSize: fontSize + 'px'}"
style后面跟的是一个对象类型
对象的key是CSS属性名称
对象的value是具体赋的值,值可以来自于data中的属性
  • 数组语法
div v-bind:style="[baseStyles, overridingStyles]"></div>
style后面跟的是一个数组类型
多个值以,分割即可

3.计算属性

3.1什么是计算属性?

我们知道,在模板中可以直接通过插值语法显示一些data中的数据。
但是在某些情况,我们可能需要对数据进行一些转化后再显示,或者需要将多个数据结合起来进行显示
比如我们有firstName和lastName两个变量,我们需要显示完整的名称。
但是如果多个地方都需要显示完整的名称,我们就需要写多个{{firstName}} {{lastName}}
我们可以将上面的代码换成计算属性:
OK,我们发现计算属性是写在实例的computed选项中的.
coderwhy-vue学习_第14张图片

3.2 计算属性的复杂操作

coderwhy-vue学习_第15张图片

3.3 计算属性的setter和getter

每个计算属性都包含一个getter和一个setter
在上面的例子中,我们只是使用getter来读取。
在某些情况下,你也可以提供一个setter方法(不常用)。
在需要写setter的时候,代码如下:

coderwhy-vue学习_第16张图片

3.4 let/var

JS中使用var来声明一个变量时, 变量的作用域主要是和函数的定义有关.
针对于其他块定义来说是没有作用域的,比如if/for等,这在我们开发中往往会引起一些问题。
coderwhy-vue学习_第17张图片

3.5 const的使用

什么时候使用const呢?
当我们修饰的标识符不会被再次赋值时, 就可以使用const来保证数据的安全性.
建议: 在ES6开发中,优先使用const, 只有需要改变某一个标识符的时候才使用let.
在这里插入图片描述
在这里插入图片描述

3.6对象增强写法

coderwhy-vue学习_第18张图片
coderwhy-vue学习_第19张图片

4. 事件监听

4.1v-on

coderwhy-vue学习_第20张图片

  • v-on:click可以写成@click
    coderwhy-vue学习_第21张图片

4.2 v-on参数

情况一:如果该方法不需要额外参数,那么方法后的()可以不添加。
但是注意:如果方法本身中有一个参数,那么会默认将原生事件event参数传递进去
情况二:如果需要同时传入某个参数,同时需要event时,可以通过$event传入事件。
coderwhy-vue学习_第22张图片
coderwhy-vue学习_第23张图片

4.3v-on 修饰符

在某些情况下,我们拿到event的目的可能是进行一些事件处理。
Vue提供了修饰符来帮助我们方便的处理一些事件

coderwhy-vue学习_第24张图片

5. 条件判断

5.1 v-if、v-else-if、v-else

v-if、v-else-if、v-else
这三个指令与JavaScript的条件语句if、else、else if类似。
Vue的条件指令可以根据表达式的值在DOM中渲染或销毁元素或组件
v-if的原理:
v-if后面的条件为false时,对应的元素以及其子元素不会渲染。
也就是根本没有不会有对应的标签出现在DOM中。
coderwhy-vue学习_第25张图片
coderwhy-vue学习_第26张图片

5.2 条件渲染案例

用户再登录时,可以切换使用用户账号登录还是邮箱地址登录。
coderwhy-vue学习_第27张图片
coderwhy-vue学习_第28张图片

5.3 案例小问题

小问题
如果我们在有输入内容的情况下,切换了类型,我们会发现文字依然显示之前的输入的内容。
但是按道理讲,我们应该切换到另外一个input元素中了。
在另一个input元素中,我们并没有输入内容。
为什么会出现这个问题呢?
问题解答
这是因为Vue在进行DOM渲染时,出于性能考虑,会尽可能的复用已经存在的元素,而不是重新创建新的元素。
在上面的案例中,Vue内部会发现原来的input元素不再使用,直接作为else中的input来使用了。
解决方案:
如果我们不希望Vue出现类似重复利用的问题,可以给对应的input添加key
并且我们需要保证key的不同
coderwhy-vue学习_第29张图片

5.4 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
coderwhy-vue学习_第30张图片

6. 循环遍历

6.1 v-for遍历数组

当我们有一组数据需要进行渲染时,我们就可以使用v-for来完成。
格式如下:item in items的形式。
coderwhy-vue学习_第31张图片
coderwhy-vue学习_第32张图片

6.2 v-for遍历对象

在这里插入图片描述

6.3 组件的key属性

coderwhy-vue学习_第33张图片

6.4 检测数组更新

因为Vue是响应式的,所以当数据发生变化时,Vue会自动检测数据变化,视图会发生对应的更新。
Vue中包含了一组观察数组编译的方法,使用它们改变数组也会触发视图的更新。
push()
pop()
shift()
unshift()
splice()
sort()
reverse()
coderwhy-vue学习_第34张图片

7. 阶段案例

7.1 高阶函数

//1.需求: 取出所有小于100的数字
//1. filter函数的使用
// 10, 20, 40, 50
let newNums = nums.filter(function(n) {
        return n < 100
    })
    // console.log(newNums);
//2.需求:将所有小于100的数字进行转化: 全部*2
// 2.map函数的使用
// 20, 40, 80, 100
let new2Nums = newNums.map(function(n) { // 20
    return n * 2
})
console.log(new2Nums);
//3.需求:将所有new2Nums数字相加,得到最终的结果
// 3.reduce函数的使用
// reduce作用对数组中所有的内容进行汇总
let total = new2Nums.reduce(function(preValue, n) {
    return preValue + n
}, 0)
console.log(total);

简化1let total = nums.filter(function(n) {
    return n < 100
}).map(function(n) {
    return n * 2
}).reduce(function(prevValue, n) {
    return prevValue + n
}, 0)
console.log(total);

简化2let total = nums.filter(n => n < 100).map(n => n * 2).reduce((pre, n) => pre + n);
console.log(total);

8. v-model

表单控件在实际开发中是非常常见的。特别是对于用户信息的提交,需要大量的表单。
Vue中使用v-model指令来实现表单元素和数据的双向绑定。

coderwhy-vue学习_第35张图片

8.1 v-model原理

v-model其实是一个语法糖,它的背后本质上是包含两个操作:
1.v-bind绑定一个value属性
2.v-on指令给当前元素绑定input事件

<input type="text" v-model="message">
等同于
<input type="text" v-bind:value="message" v-on:input="message = $event.target.value">

8.2 v-model:radio

当存在多个单选框时
coderwhy-vue学习_第36张图片

8.3 v-model:checkbox

复选框分为两种情况:单个勾选框和多个勾选框
单个勾选框:
v-model即为布尔值。
此时input的value并不影响v-model的值。
多个复选框:
当是多个复选框时,因为可以选中多个,所以对应的data中属性是一个数组。
当选中某一个时,就会将input的value添加到数组中。
coderwhy-vue学习_第37张图片
coderwhy-vue学习_第38张图片

8.4 v-model:select

和checkbox一样,select也分单选和多选两种情况。
单选:只能选中一个值。
v-model绑定的是一个值。
当我们选中option中的一个时,会将它对应的value赋值到mySelect中
多选:可以选中多个值。
v-model绑定的是一个数组。
当选中多个值时,就会将选中的option对应的value添加到数组mySelects中
coderwhy-vue学习_第39张图片
coderwhy-vue学习_第40张图片
在这里插入图片描述

8.5 修饰符

lazy修饰符:
默认情况下,v-model默认是在input事件中同步输入框的数据的。
也就是说,一旦有数据发生改变对应的data中的数据就会自动发生改变。
lazy修饰符可以让数据在失去焦点或者回车时才会更新:
number修饰符:
默认情况下,在输入框中无论我们输入的是字母还是数字,都会被当做字符串类型进行处理。
但是如果我们希望处理的是数字类型,那么最好直接将内容当做数字处理。
number修饰符可以让在输入框中输入的内容自动转成数字类型:
trim修饰符:
如果输入的内容首尾有很多空格,通常我们希望将其去除
trim修饰符可以过滤内容左右两边的空格
coderwhy-vue学习_第41张图片

三、组件化开发

1. 认识组件化

1.1 什么是组件化?

如果我们将一个页面中所有的处理逻辑全部放在一起,处理起来就会变得非常复杂,而且不利于后续的管理以及扩展。
但如果,我们讲一个页面拆分成一个个小的功能块,每个功能块完成属于自己这部分独立的功能,那么之后整个页面的管理和维护就变得非常容易了。
coderwhy-vue学习_第42张图片
我们将一个完整的页面分成很多个组件。
每个组件都用于实现页面的一个功能块。
而每一个组件又可以进行细分。
coderwhy-vue学习_第43张图片

1.2 Vue组件化思想

它提供了一种抽象,让我们可以开发出一个个独立可复用的小组件来构造我们的应用。
任何的应用都会被抽象成一颗组件树。
coderwhy-vue学习_第44张图片

2. 注册组件

2.1 注册组件的基本步骤

组件的使用分成三个步骤:
创建组件构造器
注册组件
使用组件。
coderwhy-vue学习_第45张图片
coderwhy-vue学习_第46张图片

2.2 注册组件步骤解析

1.Vue.extend():
调用Vue.extend()创建的是一个组件构造器。
通常在创建组件构造器时,传入template代表我们自定义组件的模板。
该模板就是在使用到组件的地方,要显示的HTML代码。
事实上,这种写法在Vue2.x的文档中几乎已经看不到了,它会直接使用下面我们会讲到的语法糖,但是在很多资料还是会提到这种方式,而且这种方式是学习后面方式的基础。
2.Vue.component():
调用Vue.component()是将刚才的组件构造器注册为一个组件,并且给它起一个组件的标签名称。
所以需要传递两个参数:1、注册组件的标签名 2、组件构造器
**3.组件必须挂载在某个Vue实例下,否则它不会生效。
我们来看下面我使用了三次
而第三次其实并没有生效:
coderwhy-vue学习_第47张图片

3. 组件其他补充

3.1 全局组件和局部组件

当我们通过调用Vue.component()注册组件时,组件的注册是全局的
这意味着该组件可以在任意Vue示例下使用。
如果我们注册的组件是挂载在某个实例中, 那么就是一个局部组件
coderwhy-vue学习_第48张图片
coderwhy-vue学习_第49张图片

3.2 父组件和子组件

coderwhy-vue学习_第50张图片

3.3 注册组件语法糖

在上面注册组件的方式,可能会有些繁琐。
Vue为了简化这个过程,提供了注册的语法糖。
主要是省去了调用Vue.extend()的步骤,而是可以直接使用一个对象来代替。
coderwhy-vue学习_第51张图片

3.4 模板的分离写法

Vue提供了两种方案来定义HTML模块内容:

使用<script>标签
使用<template>标签

coderwhy-vue学习_第52张图片
coderwhy-vue学习_第53张图片

4. 组件数据存放

4.1 组件可以访问Vue实例数据吗?

coderwhy-vue学习_第54张图片
我们发现不能访问,而且即使可以访问,如果将所有的数据都放在Vue实例中,Vue实例就会变的非常臃肿。
结论:Vue组件应该有自己保存数据的地方。

4.2 组件数据的存放

组件自己的数据存放在哪里呢?
组件对象也有一个data属性(也可以有methods等属性,下面我们有用到)
只是这个data属性必须是一个函数
而且这个函数返回一个对象,对象内部保存着数据
coderwhy-vue学习_第55张图片
为什么是一个函数呢?
首先,如果不是一个函数,Vue直接就会报错。
其次,原因是在于Vue让每个组件对象都返回一个新的对象,因为如果是同一个对象的,组件在多次使用后会相互影响。

5. 父子组件通信

coderwhy-vue学习_第56张图片

6. 父级向子级传递

6.1 props基本用法

props的值有两种方式:
方式一:字符串数组,数组中的字符串就是传递时的名称。
方式二:对象,对象可以设置传递时的类型,也可以设置默认值等。
coderwhy-vue学习_第57张图片
props数据验证:
验证都支持哪些数据类型呢?
String
Number
Boolean
Array
Object
Date
Function
Symbol
coderwhy-vue学习_第58张图片
coderwhy-vue学习_第59张图片

7. 子级向父级传递

什么时候需要自定义事件呢?
当子组件需要向父组件传递数据时,就要用到自定义事件了。
我们之前学习的v-on不仅仅可以用于监听DOM事件,也可以用于组件间的自定义事件。
自定义事件的流程:
在子组件中,通过$emit()来触发事件。
在父组件中,通过v-on来监听子组件事件。
我们来看一个简单的例子:
我们之前做过一个两个按钮+1和-1,点击后修改counter。
我们整个操作的过程还是在子组件中完成,但是之后的展示交给父组件。
这样,我们就需要将子组件中的counter,传给父组件的某个属性,比如total。
coderwhy-vue学习_第60张图片

8. 插槽slot

组件的插槽也是为了让我们封装的组件更加具有扩展性。
让使用者可以决定组件内部的一些内容到底展示什么
如何封装合适呢?抽取共性,保留不同。
最好的封装方式就是将共性抽取到组件中,将不同暴露为插槽。
一旦我们预留了插槽,就可以让使用者根据自己的需求,决定插槽中插入什么内容。
是搜索框,还是文字,还是菜单。由调用者自己来决定。

8.1 slot基本使用

我们通过一个简单的例子,来给子组件定义一个插槽:
中的内容表示,如果没有在该组件中插入任何其他内容,就默认显示该内容
有了这个插槽后,父组件如何使用呢?
coderwhy-vue学习_第61张图片
coderwhy-vue学习_第62张图片

8.2 具名插槽slot

如何使用具名插槽呢?
非常简单,只要给slot元素一个name属性即可

coderwhy-vue学习_第63张图片
coderwhy-vue学习_第64张图片

8.3 编译作用域

官方给出了一条准则:父组件模板的所有东西都会在父级作用域内编译;子组件模板的所有东西都会在子级作用域内编译。
coderwhy-vue学习_第65张图片

8.4 作用域插槽

coderwhy-vue学习_第66张图片

我们通过