vue2学习

1.准备

1.1.官网

https://cn.vuejs.org/

1.2.搭建开发环境

在官网的教程中有安装,点击会下载vue.js文件。下载后在HTML页面中引入即可。
引入之后打开页面显示如下,安装扩展vue开发者工具,
百度网盘,提取码6666
输入vue如下图显示为正常。
vue2学习_第1张图片
关闭上图红色框中的提示信息:

Vue.config.productionTip = false;

vue2学习_第2张图片

2.用到的方法

2.1.unshift()在数组前添加元素

2.2.filter()过滤数组

返回一个新的数组,原数组不改变。
vue2学习_第3张图片

2.3.indexOf判断字符串中是否有某字符

返回一个索引,不包含返回-1。
所有字符串都包含空字符串’',其索引为0.
vue2学习_第4张图片

2.4.arr.sort()数组排序

升序
vue2学习_第5张图片
降序
vue2学习_第6张图片

2.5.instanceof是否是谁的实例

例如a是否是HTML中的一个真实DOM元素。
在这里插入图片描述

2.6.debugger设置断点

在生命周期函数加入以下语句,页面在浏览器打开,打开控制台,语句会在断点处卡住。
vue2学习_第7张图片

2.7.noscript标签

在这里插入图片描述

    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>

2.8.confirm(“确定删除吗”)

返回一个bool值。

2.9.数组的reduce方法

数组有多长就调用reduce多少次,两个参数分别是上一次调用reduce的返回值和数组元素,第一次调用reduce的pre是0,后面逗号后的0是初始值。
最后一次调用的返回值将作为reduce的返回值。
vue2学习_第8张图片

2.10.函数传参不定数量

不管传过来多少个参数,只接收第一个,其他的保存在params数组里面。
vue2学习_第9张图片
在这里插入图片描述

2.11.下划线占位

例如下面第一个参数是不使用的,可用_占位,避免变量不使用的警告。
在这里插入图片描述

2.12.$nextTick方法

vue2学习_第10张图片
例:todo_list案例中编辑功能,点击编辑input获得焦点。如果不使用$nextTick,由于执行完handleEdit中代码再更新DOM,input并不会获得焦点。
vue2学习_第11张图片
vue2学习_第12张图片
此处也可以使用定时器,并且不给时间,由于定时器会推到队列中执行,input获得焦点将在更新DOM之后。

2.13.ES6的对象匹配

欲要将 dataObj 对象中的数据赋给 this.info 对象,使用下面的方法,将对象的元素摊开,如果 this.info 中有而 dataObj 中没有,会保留,如果两者都有则替换,如果只有 dataObj 有则添加。
vue2学习_第13张图片
####2.14.vue项目main.js代码的执行顺序
先执行完所有 import 语句再执行其他。

2.14.css选中高亮

使用bootstrap.css
vue2学习_第14张图片
在这里插入图片描述

2.15.Object.keys

传入对象,返回属性名

var data={a:1,b:2,c:9,d:4,e:5};
console.log(Object.keys(data));//["a", "b", "c", "d", "e"]
Object.keys(data).map((key,item)=>{
    console.log(key,data[key]);//key=>属性名    data[key]=>属性值
});

传入字符串,返回索引

var str = 'ab1234';
console.log(Object.keys(obj));  //[0,1,2,3,4,5]

传入数组 返回索引

var arr = ["a", "b", "c"];
console.log(Object.keys(arr)); // console: ["0", "1", "2"]

2.16.数组的.map方法

map的返回值为一个数组,数组的内容由回调函数确定。
map的参数为一个有返回值的回调函数,返回值即为map函数将要返回的数组的元素。

var arr = [1,2,3,4,5]
var doubleNumber = arr.map(function(num){
    return num*2
})    
console.log(doubleNumber) //[2,4,6,8,10] 

3.vue的basic

3.1.hello小案例

在vscode安装live server插件。
将图标加入到项目文件夹下。
使用live插件打开。
vue2学习_第15张图片

<body>
    <div id="root">
        <h1>hello ,{{name}}</h1>
    </div>
    <script>
        Vue.config.productionTip = false;
        // 创建vue实例
        const x = new Vue({
            el: '#root',//和容器建立关系,通常为css选择器
            // el:document.querySelector('#root');另一种写法
            data: {//data中的数据给el元素使用
                name: '尚硅谷'
            }
        });
    </script>
</body>

vue2学习_第16张图片

vue实例和容器(元素)是一一对应关系

3.2.v-bind和v-model数据绑定

单项数据绑定(简写为:)
Vue中有2种数据绑定的方式:
1.单向绑定(v-bind):数据只能从data流向页面。
2.双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data。
备注:
1.双向绑定一般都应用在表单类元素上(如:input、select等有value属性的值)
2.v-model:value 可以简写为 v-model,因为v-model默认收集的就是value值。
在这里插入图片描述

3.3.插值语法和指令语法

插值语法管理标签内容,指令语法管理标签。
vue2学习_第17张图片
vue2学习_第18张图片

3.4.绑定vue实例关联的元素的两种方式

vue2学习_第19张图片

3.5.data的两种写法

在这里插入图片描述
vue2学习_第20张图片
vue2学习_第21张图片

3.6.MVVM模型

vue2学习_第22张图片

3.7.Object.defineproperty()给对象添加属性

相比于直接在对象中写属性,Object.defineproperty()给对象添加的属性可以添加很多限制,例如增删改的限制。
vue2学习_第23张图片

3.8.数据代理

vue2学习_第24张图片

3.9.vue实例vm拿到data后存在了_data

3.10.事件处理

(一)事件的基本使用

vue2学习_第25张图片

vue2学习_第26张图片
也可以这样
在这里插入图片描述
需要传参数可在函数名后加括号和参数。不写$event是没有event事件的
vue2学习_第27张图片

(二)事件修饰符

vue2学习_第28张图片
可以连写,click.stop.prevent。

阻止默认行为

例如不打开链接。
在这里插入图片描述

阻止冒泡

在这里插入图片描述

使用捕获模式

捕获到就触发事件而不等到冒泡再触发。
在这里插入图片描述

vue里面的函数不能用箭头函数

箭头函数this不指向vue实例而是指向window。

scroll滚动条滚动事件

滚动条发生变化时触发

wheel鼠标滚轮事件

鼠标滚轮滚动时触发

案例:姓名-插值语法实现

vue2学习_第29张图片

(三)键盘事件

vue2学习_第30张图片
自定义键盘事件
在这里插入图片描述
示例
vue2学习_第31张图片
按下Ctrl+y生效:@keydown.ctrl.y

3.11.计算属性computed

计算属性的基本使用

vue的data里面的内容就是这里说的属性。
计算属性在computed里面,每个属性写成一个对象。虽然写成一个对象,但存到vm的是计算好的属性,而不是一个对象。
使用时也是使用插值语法。
案例:以下的fullName是一个计算属性,使用属性经过计算的到的,使用get监听,一旦其依赖的属性发生改变,fullName也将改变。
vue2学习_第32张图片

vue2学习_第33张图片
当确定计算属性只读不写时可以不写set,否则必须要写。
vue2学习_第34张图片

计算属性的缓存

缓存:多次读取 fullName,第一次读取会计算 fullName,之后的读取都是读取缓存,fullName发生改变将更新缓存,因此缓存始终与最新的fullName保持一致。

计算属性的简写

以上的为完整写法。
简写:
vue2学习_第35张图片

计算属性的局限

不能开启异步任务,例如定时器,因为需要返回一个值,而使用定时器返回值将返回给定时器,而不返回给计算属性。
而监视属性可以,因为监视属性不靠返回值实现修改fullName的值。

3.12.监视(侦听)属性watch

配置方式和计算属性相似。
计算属性也能监视。

handler()函数

vue2学习_第36张图片
加参数,可以获得旧值和新值。
vue2学习_第37张图片

immediate配置

vue2学习_第38张图片

另一种写法

vue2学习_第39张图片

深度监视

在这里插入图片描述
vue2学习_第40张图片

简写形式

在这里插入图片描述
不能写箭头函数。
在这里插入图片描述

watch实现的姓名案例

一定要使用箭头函数,因为定时器的回调不是属于vue管理的,而属于js引擎。不使用箭头函数this将指向window。
而箭头函数没有自己的this,因此this还是指向vue实例。
在这里插入图片描述

computed 和 watch

vue2学习_第41张图片

3.13.绑定class样式

vue2学习_第42张图片

(一)字符串写法

样式的类名不确定,需要动态绑定。
vue2学习_第43张图片

使用随机数Math.redom(),随机切换类。

vue2学习_第44张图片

(二)数组写法

vue2学习_第45张图片

(三)对象写法

vue2学习_第46张图片

3.14.绑定style样式

在这里插入图片描述
对象要使用驼峰命名。
vue2学习_第47张图片
如果有多个样式对象,可以将多个样式对象放在一个数组里给style。这个办法不常用。
在这里插入图片描述
在这里插入图片描述

3.15.条件渲染:v-show和v-if

为true时显示,为false时隐藏。
两者值为false时都会把标签隐藏,区别是v-show会display:none,v-if会直接删除元素。置为 true时v-show会display:block,而v-if会添加一个元素。
切换频率高用v-show,频率低用v-if。
vue2学习_第48张图片

v-if和v-eles-if和v-else:

从上往下判断条件,找到符合条件的后就不再往下找了。
vue2学习_第49张图片
这几个要连着写,以下情况是不行的
vue2学习_第50张图片

template和v-if配合使用

使用场景,几个h2标签的判断条件相同,不用写三个v-if。这样写之后页面渲染时会把template标签去掉,保留三个h2标签,同时保留v-if的效果。
template不能和v-show配合使用。
在这里插入图片描述

3.16.列表渲染

v-for和key。v-for写在谁身上就遍历谁。

遍历数组(用得最多)

p和index分别是数组元素和索引。
添加三个li标签。
在这里插入图片描述
vue2学习_第51张图片

遍历对象

value和k分别是值和键,例如’奥迪A8’和name。
vue2学习_第52张图片
vue2学习_第53张图片

遍历字符串

vue2学习_第54张图片

vue2学习_第55张图片

遍历指定数字

vue2学习_第56张图片

vue2学习_第57张图片

key的作用

vue2学习_第58张图片

使用index作为key会出现问题。
出现的问题
vue2学习_第59张图片
关键是虚拟DOM对比这一步。
vue2学习_第60张图片
使用id作为key就不会出现这种问题,
在这里插入图片描述

列表过滤

搜索名字案例:
在这里插入图片描述
在这里插入图片描述

监视属性实现。

vue2学习_第61张图片
vue2学习_第62张图片
计算属性实现
vue2学习_第63张图片

列表排序

效果
在这里插入图片描述
结构,key改为p.id。
vue2学习_第64张图片
vue
vue2学习_第65张图片

3.17.vue监测数据改变的原理

vue2学习_第66张图片

出现的问题。
updateMei绑定在一个按钮上,但是点击按钮列表没有改变。
vue2学习_第67张图片
原因,直接修改数组元素,vue是监测不到的,要使用vue提供的方法对数组进行操作。
vue对数组元素的监测是通过包装数组的方法实现的,实现基本功能的同时加入了重新解析模板的步骤,将触发视图更新。包装的方法有以下几个。
vue2学习_第68张图片
也可以使用vm.set(persons,0,{id:'001',name:'马老师',age:50,sex:'男'})将把数组persons索引为0的元素替换。vue可以监测到并会重新解析模板、触发视图更新。

对对象的监测是通过分配getter和setter实现的。

3.18.收集表单数据

vue2学习_第69张图片
vue2学习_第70张图片
v-model.trim用于去掉输入框内首尾空格。
v-model.number将用户的输入值转为数值类型
v-model.lazy当input框失去焦点时触发事件,vue更新读取到的数据。

使用如下代码获得input框的value

<template>
  <div class="todo-header">
    <input type="text" @keyup.enter="add"/>
  </div>
</template>

<script>
export default {
  name: "MyHeader",
  methods: {
    add(event) {
      console.log(event.target.value);
    },
  },
};
</script>

3.19.过滤器

vue2学习_第71张图片
过滤器不写括号也会传入参数,参数为value,多个参数时value是第一个参数。
可以用在插值语法(常用)和v-bind(罕见),其他不可用

案例:

dayjs是一个格式化时间戳的库(插件),可以在bootcdn官网查看和下载。
vue2学习_第72张图片

局部过滤器,只有vm绑定的元素可用:

<!-- 过滤器实现(不传参) -->
<h3>现在是:{{time | timeFormater}}</h3>
<!-- 过滤器实现(传参) -->
<h3>现在是:{{time | timeFormater('YYYY_MM_DD') | mySlice}}</h3>//有多个过滤器时从做到右执行
<h3 :x="msg | mySlice">尚硅谷</h3>
filters:{
	timeFormater(value,str='YYYY年MM月DD日 HH:mm:ss'){//如果不传入str参数,默认为str='YYYY年MM月DD日 HH:mm:ss'
	return dayjs(value).format(str)
	},
	mySlice(value){
		return value.slice(0,4)
	}
}

全局过滤器,都可用:
写在这个位置。
vue2学习_第73张图片

3.20.vue的内置指令

vue2学习_第74张图片

v-text

向其所在的标签添加文本。添加的文本会覆盖标签原有的内容。
不能添加标签,会解析成文本。
在这里插入图片描述
vue2学习_第75张图片

v-html

和v-text相似,但是可以解析标签。
vue2学习_第76张图片

v-cloak

只有名没有值。
在这里插入图片描述

解决网速慢未经解析模板显示问题。当vue.js加载完接管容器之后这个v-cloak会被移除。
vue2学习_第77张图片

v-once

读取之后就不在改变。
在这里插入图片描述
vue2学习_第78张图片

v-pre

将标签作为普通标签,不会解析vue语法,直接渲染。加快编译。
在这里插入图片描述
vue2学习_第79张图片

3.21.自定义指令

使用配置项 directives 。

定义一个 v-big 指令,将 n 的十倍放入标签中。

vue2学习_第80张图片

使用函数的方式定义指令,big()两个参数分别是操作的元素和big指令这个对象,其中big对象的value是n的值。
vue2学习_第81张图片
v-big何时被调用?
在这里插入图片描述

定义一个v-fbind指令:

在这里插入图片描述
使用对象式定义。
以下代码不好使,因为指令执行时模板还未渲染到页面,因此当页面显示时input框并未获得焦点。
vue2学习_第82张图片
如何解决?当vue把元素放入页面之后给input框焦点。此处就要使用对象式定义了。
对象式中可以写成很多个函数的形式,
vue2学习_第83张图片
指令内vue根据不同时间节点提供了不同函数可以在不同时间节点做不同的事。不同函数都能收到两个参数,即element元素和binding绑定对象。
函数式相当于只有bind和update而没有 inserted,因为bind一般和update相同。
vue2学习_第84张图片
实现上述功能。
在这里插入图片描述

注意事项:

(1)命名:使用时多个单词用 - 分隔。定义时多个单词还用 - 分隔,但是要加 ''。一个单词可以简写不用''
在这里插入图片描述
在这里插入图片描述
(2)directives 里面的函数的this指向window。

全局自定义指令:

对象式
vue2学习_第85张图片
函数式
在这里插入图片描述

3.22.cookie

哪个浏览器存的cookie只能哪个浏览器用,不能跨浏览器。
vue2学习_第86张图片

3.23.生命周期mounted()函数

概念:在vue实例的不同时间节点调用的函数。
vue2学习_第87张图片
vue的生命周期流程图
红色框内是不同时间节点的生命周期函数名。
vue2学习_第88张图片
vue2学习_第89张图片

(一)mounted()函数

什么时候被调用

vue将初始的真实DOM第一次挂载到页面上之后。只调用一次。
不会因为模板再次解析而被重复调用。

4.vue组件化编程

组件:用来实现局部功能效果的代码集合。

4.1.非单文件组件用法

缺点:样式不能写在组件里面。
(1)创建组件
不能写el,data要写成函数形式。
vue2学习_第90张图片

(2)注册组件
局部注册
在这里插入图片描述
注册组件,全局注册
所有vue实例都能用。
vue2学习_第91张图片
(3)使用组件,编写组件标签
vue2学习_第92张图片

4.2.注意事项

在这里插入图片描述

(1)可以写多个相同组件标签,即可以复用。
vue2学习_第93张图片
vue2学习_第94张图片
(2)组件改变不会影响其他组件
vue2学习_第95张图片
(3)组件的命名
单个单词:建议全部小写,也可以首字母大写,开发者工具中呈现的都是首字母大写的形式。
多个单词:官方推荐单词间使用-连接,外加''
在这里插入图片描述
开发者工具显示是这样的
在这里插入图片描述
第二种书写方式是直接连接,首字母全部大写,需要在脚手架里面使用,否则会报错。
在这里插入图片描述
(4)在定义组件时添加配置项name
指定开发者工具中组件的名称,首字母还是会自动大写。
注册的组件名称不会改变,引用的组件标签也不会改变。
在这里插入图片描述

4.3.在vue实例中写一个app组件管理所有组件

标准化写法。
vue2学习_第96张图片

vue2学习_第97张图片

4.4.VueComponent

vue2学习_第98张图片

4.5.原型对象

vue2学习_第99张图片
原型和原型链

4.6.一个重要的内置关系

在这里插入图片描述
以下代码输出为true。
vue2学习_第100张图片
在这里插入图片描述
vue2学习_第101张图片
vue2学习_第102张图片

4.7.单文件组件

School.vue

<template>
	<div class="demo">
		<h2>学校名称:{{name}}</h2>
		<h2>学校地址:{{address}}</h2>
		<button @click="showName">点我提示学校名</button>	
	</div>
</template>

<script>
	 export default {
		name:'School',
		data(){
			return {
				name:'尚硅谷',
				address:'北京昌平'
			}
		},
		methods: {
			showName(){
				alert(this.name)
			}
		},
	}
</script>

<style>
	.demo{
		background-color: orange;
	}
</style>

App.vue

<template>
  <div>
    <School></School>
    <Student></Student>
  </div>
</template>

<script>
//引入组件
import School from "./School.vue";
// import Student from "./Student.vue";

export default {
  name: "App",
  components: {
    School,
    Student,
  },
};
</script>

main.js作为入口文件

import App from './App.vue'

new Vue({
	el:'#root',
	template:``,
	components:{App},
})

html页面,包含容器

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>练习一下单文件组件的语法</title>
	</head>
	<body>
		<!-- 准备一个容器 -->
		<div id="root"></div>
		<!-- <script type="text/javascript" src="../js/vue.js"></script> -->
		<!-- <script type="text/javascript" src="./main.js"></script> -->
	</body>
</html>

5.vue标准化开发平台(脚手架)

5.1.配置

(1)打开cmd。
(2)使用淘宝镜像源
npm config set registry https://registry.npm.taobao.org
(3)全局安装
npm install -g @vue/cli
(4)切换到要创建项目的目录,然后使用命令创建项目
vue create vue_test vue_test为项目名
(5)启动项目
cd vue_test 进入项目所在目录。
npm run serve

5.2.render

render用于渲染使用精简版vue的页面,使用精简版vue空间小但是没有模板解析器,不能渲染 template 模板,不能使用 template 配置项。
只有创建 vm 的时候需要使用render,其他vue文件中的template还是可以使用。
vue2学习_第103张图片
下面的语句是引入组件和创建一个h1标签需要两个参数,分别为标签类型和内容。
在这里插入图片描述

5.3.ref获取元素

vue中有ref属性,用来替代id属性。
vue2学习_第104张图片

在这里插入图片描述
vue2学习_第105张图片

5.4.props配置项,组件动态数据

props接收的数据不建议更改。
Student.vue接收App.vue传过来的数据作为自己的数据。
vue2学习_第106张图片
App.vue传数据给子组件
vue2学习_第107张图片
Student.vue限制接收的数据的类型,age仍然可以接收string但是会输出警告提示。
vue2学习_第108张图片
最完整的接收配置项
vue2学习_第109张图片
如何修改props接收到的数据?不直接使用props接收到的数据,复制一个到data中,修改data中的数据。
vue2学习_第110张图片

5.5.混合mixins

可以将公共的配置项放入混合里面,复用配置,减少组件的代码量。
混合是一个.js文件,里面可以放各种配置。
vue2学习_第111张图片
引入混合(局部混合)
vue2学习_第112张图片
注意点:
如果配置项在混合里面和组件的配置项里面都存在,会进行整合,如果冲突则以组件的配置项为准。
对于生命周期钩子,如果冲突则两者都要,混合的在前。

全局混合,所有vm、vc都会挂载。
vue2学习_第113张图片

5.6.自定义插件

插件放在一个.js文件中,方法定义在install里面,install接收到的第一个参数是Vue的构造函数。
vue2学习_第114张图片

引入插件
在这里插入图片描述
引入插件的时候可以传入参数交给插件处理
在这里插入图片描述
在这里插入图片描述

总结
vue2学习_第115张图片

5.7.解决样式冲突的问题scoped

当不同组件类名相同时采用后来居上的策略,加上scoped之后限制样式的作用域为本组件,不会影响其他组件。
vue2学习_第116张图片

5.8.css编写方式

lang默认是css。
vue2学习_第117张图片

5.9.父组件从子组件接收数据

传给子组件一个函数
父组件
vue2学习_第118张图片

5.10.组件的自定义事件,数据子组件==>父组件

自定义事件也可以使用事件修饰符。
实现子组件向父组件传递数据的自定义事件。
第一种绑定方式:
下面代码在vc实例对象student上绑定了atguigu事件,当atguigu事件触发时调用getStudentName函数。
简写形式,将v-on:换成@
vue2学习_第119张图片
第二种绑定自定义事件的方式:
这种方式更加灵活,可以设置定时器。
首先给student一个ref标识。
在这里插入图片描述
vue2学习_第120张图片

Student组件设置触发atguigu事件的方式,并将所需的数据,即name作为事件的参数,getStudentName作为atguigu事件的回调将收到atguigu事件传回的参数。因此完成了子组件向父组件传递数据。
vue2学习_第121张图片
解绑自定义事件:
vue2学习_第122张图片
销毁组件实例后,自定义事件将失效。原生事件将不受影响。
在这里插入图片描述

5.11.给组件绑定原生事件

MyFooter是一个组件标签,下面代码并不能给组件绑定一个原生的click事件,vue将其解析为自定义事件。

<MyFooter @click="demo"/>

以下代码会将click解析为原生事件,绑定在组件的根元素,需要加native事件修饰符。

<MyFooter @click.native="demo"/>

5.12.全局事件总线,任意组件间通信

核心思想是在vue原型对象上绑定一个vue实例对象,该vue实例对象可以和各个组件通信,通过自定义事件的方式传输数据。
注意是 $bus 上的$emit
vue2学习_第123张图片

5.12.1.School从Student接收数据

还是使用自定义事件的方式。
安装全局事件总线
vue2学习_第124张图片

School组件绑定事件。
School组件销毁的时候解绑事件。
vue2学习_第125张图片
student去触发hello事件,hello事件的回调函数将数据接收,School组件就接收到数据了。
vue2学习_第126张图片

5.13.pubsub-js插件实现全局通信

消息订阅与发布。
安装插件:

npm i pubsub-js

发送方:hello是消息名,发送方与接收方应保持一致,666是发送的消息。
vue2学习_第127张图片
接收方订阅消息
vue2学习_第128张图片

在这里插入图片描述
总结
vue2学习_第129张图片

6.Todo-list案例

组件化编程,使用了很多小技巧。
使用了本地存储。
使用了自定义事件实现 数据子组件=>父组件
使用全局事件总线实现 数据子组件的子组件=>父组件

7.本地存储

localStorage,刷新页面还存在,不清空缓存会始终存在。
当读取的内容不存在时读取到的是null而不是undefined。
vue2学习_第130张图片
sessionStorage 的api和localStorage 的 api 相同,但是sessionStorage 刷新后会消失。

8.过渡与动画

8.1动画

在css3中写动画
vue2学习_第131张图片
vue用transition将要添加动画效果的标签包含起来,渲染的时候transition会被去掉,和template一样。
其中hello是动画名,appear属性默认为true,页面加载完就有动画。
vue2学习_第132张图片

8.2过渡

h1同样用transition包含起来
vue2学习_第133张图片

vue2学习_第134张图片
简写
vue2学习_第135张图片
不破坏原本样式的写法
vue2学习_第136张图片

8.2.1多个元素过渡

需要使用transition-group包含,且为每个元素设置一个独一无二的key
vue2学习_第137张图片

8.3第三方动画库animate.css

https://www.npmjs.com/package/animate.css
查看动画示例
https://animate.style/

在终端安装

npm install animate.css

引入
在这里插入图片描述
将以下固定的类名放入name

animate__animated animate__bounce

在这里插入图片描述
选择动画,可根据需要选择,复制类名添加即可。
在这里插入图片描述
vue2学习_第138张图片

9.vue和Ajax

9.1axios

引入axios

npm i axios

使用axios发送get请求
在这里插入图片描述

解决跨域问题需要后端人员配置cors头部信息。
还可以使用代理服务器,前端和代理服务器交互,而代理服务器与目标服务器交互,因为服务器之间不会收到跨域的限制,因此可以解决跨域问题。

9.2在vue开启代理服务器

需要编辑配置项,而修改配置文件 vue.config.js需要重启脚手架才会生效。

9.2.1.方式1

这种方式只能开启一个代理服务器,且会有一个问题。
代理服务器和前端页面的URL是相同的。此处都为http://localhost:8080
目标服务器的地址:http://localhost:5000/students
vue.config.js中添加如下代码,注意5000这个端口是目标服务器的端口。

devServer:{
proxy:‘http://localhost:5000’
}

一个代理服务器就开启了。

axios.get请求URL的端口号调整为 8080
vue2学习_第139张图片
解决了跨域问题
vue2学习_第140张图片
注意:
axios.get 请求发送给代理服务器,当代理服务器中有所请求的数据时将直接返回数据,而不会去请求目标服务器。
例如请求http://localhost:8080/students,如果public中有students,将直接返回,不再访问目标服务器。
代理服务器拥有的数据是 public 中的数据。
vue2学习_第141张图片

9.2.2.方式2

可配置多个代理服务器。
同样在 vue.config.js 添加代码,以下代码中的/atguigu是前缀,发送请求时在端口号后添加前缀,将不使用代理服务器的数据,代理服务器会将请求发给目标服务器。

  devServer: {
    proxy: {
      '/atguigu': {
        target: 'http://localhost:5000',
      },
    }
  }

以下请求将 404
vue2学习_第142张图片
原因如下,代理服务器请求的是 /atguigu 下的 /students ,因此是 404 。
vue2学习_第143张图片
如何解决?添加一个配置项 pathRewrite
vue2学习_第144张图片
其他配置项:
ws项用于支持websocket
changeOrigin为true时,代理服务器将告诉目标服务器自己的端口号和它一样,即5000;为 false 时将如实告知目标服务器 自己的端口号为 8080 。这个配置项不写默认为 true 。
./foo是另一个代理服务器。
vue2学习_第145张图片

9.3.案例:GitHub搜索用户

9.4.vue-resource插件

所有组件都会多一个 $http
安装:npm i vue-resource
引入:
vue2学习_第146张图片
使用:
axios差不多,把axios替换成this.$http即可
vue2学习_第147张图片

10.插槽语法slot

插槽的样式可以写在 app.vue ,也可以写在 Category.vue ,app.vue 解析完DOM之后才传给 Category.vue 。

10.1.默认插槽

在 app.vue 的组件标签中填入红色框中内容,作为插槽的使用者。
vue2学习_第148张图片
对应的组件用 slot 接收 app.vue 传过来的内容,slot用于确定传过来的内容的位置。
如果没有传过来内容,则显示 slot 标签的内容。
插槽的提供者。
vue2学习_第149张图片

10.2具名插槽

给slot标签一个 name 属性,指定一个名字。
vue2学习_第150张图片

组件标签中的元素加上slot属性,值为slot的name,就可指定元素的插槽。如下代码 img 将放在 name="center" 的插槽。
在这里插入图片描述
可以使用 template 临时标签
vue2学习_第151张图片

10.3.作用域插槽

插槽的使用者要使用的数据在插槽所在的组件。
插槽的提供者:
vue2学习_第152张图片
插槽的使用者:
接收插槽提供者的数据,需要配置 scope 属性,名字可随意起,作为接收数据的对象,之后就可以使用插槽提供者的数据了。
vue2学习_第153张图片
可以传多个数据
vue2学习_第154张图片
vue2学习_第155张图片

11.vuex(求和案例)

vuex作为中间人,可以和任意组件通信,将数组存在vuex的state中,任何组件都能使用。
在这里插入图片描述
案例vue2学习_第156张图片

11.1.配置

vue2 中只能使用 vuex3 ,vue3 用 vuex 4。
安装vuex,npm i vuex@3
引入vuex,import Vuex from 'vuex'
Vue.use(Vuex)
创建store:
创建文件 src/store/index.js

//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)

//准备actions对象——响应组件中用户的动作
const actions = {}
//准备mutations对象——修改state中的数据
const mutations = {}
//准备state对象——保存具体的数据
const state = {}

//创建并暴露store
export default new Vuex.Store({
	actions,
	mutations,
	state
})

在main.js中创建vm时传入store配置项

......
//引入store
import store from './store'
......

//创建vm
new Vue({
	el:'#app',
	render: h => h(App),
	store
})

11.2.使用

Count.vue 中要使用 存在 store 中的 sum
vue2学习_第157张图片
Count.vue 使用 this.$store.dispatch("jia", this.n); 告诉store 要执行的操作为jia,具体的操作在store中定义。
vue2学习_第158张图片
storeactions 中定义 jia 这个动作,并将之提交给 mutations。业务逻辑都写在 actions 里面,包括判断、定时器等。
在这里插入图片描述
mutations 中真正定义了jia具体的操作。
在这里插入图片描述
actions 中的context是低配版的 store ,可以调用commit 将动作提交给 mutations ,也可以读取到 state 中的数据,还可以写业务逻辑,即判断、定时器等。
vue2学习_第159张图片
如果没有业务逻辑也没有特殊要求,可在 Count.vue 直接调用commit提交,而不必等到 actions 提交。
vue2学习_第160张图片

11.3.actions中context的使用

除了 state 还有 context.dispatch
vue2学习_第161张图片

11.3.store的getters配置项

getters和state的关系类似于computed和data
vue2学习_第162张图片
在这里插入图片描述

11.4.mapState映射

效果,标签中可以写成如下这样,使用 sum 而不用写 $store.state.sum
vue2学习_第163张图片

对象写法
在这里插入图片描述
数组写法
需要state中的名字和结构中的名字相同。
在这里插入图片描述

mapGetters映射

需要import引入。
和mapState相似,读取的是getters中的数据。
vue2学习_第164张图片

mapMutations映射

vue2学习_第165张图片
在这里插入图片描述

mapActions

在这里插入图片描述

11.5.vuex模块化编程

11.5.1.配置

vue2学习_第166张图片
vue2学习_第167张图片
不同组件使用的配置分开写,开启命名空间。
vue2学习_第168张图片
在这里插入图片描述
引入
vue2学习_第169张图片
使用
vue2学习_第170张图片
mutations和actions
vue2学习_第171张图片
不借助map的写法。getters中数据的读取
vue2学习_第172张图片
vue2学习_第173张图片
不借助map的写法。actions和mutations。
在这里插入图片描述

11.5.2.将配置项放到不同文件

vue2学习_第174张图片
在这里插入图片描述
vue2学习_第175张图片

总结
vue2学习_第176张图片

12.路由router

vue2学习_第177张图片

vue2学习_第178张图片

12.1.配置

安装:npm i vue-router@3 (vue2只能用3版本)
在main.js引入:
在这里插入图片描述
新建 src/router/index.js,创建一个路由器
vue2学习_第179张图片
在main.js引入创建的路由器并添加相应的配置项
vue2学习_第180张图片

12.2.使用

实现路由切换,router-link 渲染时会生成 a 标签。
在这里插入图片描述
指定组件呈现位置
在这里插入图片描述
整体:
vue2学习_第181张图片

12.3.组件分类

路由组件和一般组件分别放在src/pagessrc/components文件夹中。

12.4.嵌套路由(分级路由)

案例:
vue2学习_第182张图片
配置子路由,需要注意的是子路由的 path 不用写 /
vue2学习_第183张图片
引用:to 里面路径要写两级
vue2学习_第184张图片

12.5.路由传参(query)

字符串写法:
在 router-link 标签的 to 属性中传参,给子路由组件。参数存在 $route.query 中。
vue2学习_第185张图片
在子路由组件中使用参数

vue2学习_第186张图片
对象写法:
vue2学习_第187张图片

路由传参(params)

在这里插入图片描述
路由配置中使用如下方式占位,声明接收参数。
vue2学习_第188张图片
对象写法
只能用 name ,不能用 path 。
在这里插入图片描述
子路由组件接收参数
vue2学习_第189张图片

简化接收参数(props)

vue2学习_第190张图片

12.6.路由命名

路径过长时可简化路由跳转。
在这里插入图片描述
配合传参
在这里插入图片描述

在这里插入图片描述

12.7.router-link的replace属性

vue2学习_第191张图片

12.8.不使用router-link跳转

而使用回调函数实现,例如 @click="pushShow"
router-link 标签会生成一个 a 标签,但是有时需要使用其他标签,如 button。
vue2学习_第192张图片

12.9.$router的back、forward和go

分别控制页面的后退和前进。
vue2学习_第193张图片
go可以一次前进多步或后退多步,如下是连续前进3步,参数为负数则后退。
在这里插入图片描述

12.10.缓存路由组件

为何需要缓存,有时在 input 中进行了输入,到别的组件再回来希望输入还在。
使用 keep-alive 将展示区包裹起来
include="News" 表示只缓存名称为 News 的路由组件,News为组件名而不是路由名。不写 include 则在该展示区的组件都将缓存。
在这里插入图片描述

在这里插入图片描述
缓存多个组件
在这里插入图片描述

12.11.路由的生命周期函数

时间点分别为切入和切出路由组件。
vue2学习_第194张图片
vue2学习_第195张图片

12.12.路由守卫

写在 index.js 里面。

12.12.1.全局路由守卫

前置路由守卫。
vue2学习_第196张图片
简化写法,在路由配置项增加自定义属性。
需使用meta配置项添加自定义属性。
vue2学习_第197张图片
vue2学习_第198张图片

后置路由守卫
可以修改一些信息,例如网页标题
在这里插入图片描述

12.12.2.独享路由守卫

写在路由配置里面。
独享路由守卫只有前置守卫没有后置守卫。
在这里插入图片描述

12.12.3.组件路由守卫

有两个时间点,都需要调用next放行,beforeRouteLeave 和 后置守卫不同,是在离开时调用。
通过路由规则进入才会调用,直接使用组件标签不会调用。
vue2学习_第199张图片

12.13.路由器的hash和history工作模式

vue2学习_第200张图片

13.UI组件库

13.1.配置

饿了么的。
官网:https://element.eleme.cn
在终端安装:npm i element-ui
最好引入时使用按需引入,减小代码体积。

你可能感兴趣的:(JavaScript,学习,前端,vue)