Vue.js 框架进阶笔记

Vue.js 框架进阶笔记

    • 1. 模块化开发
        • 1.1 为什么要模块化
            • 1.1.1 JavaScript 原始功能
            • 1.1.2 匿名函数的解决方案
            • 1.1.3 使用模块作为出口
        • 1.2 CommonJS
        • 1.3 ES6 的 export 指令
            • 1.3.1 export 基本使用
            • 1.3.2 导出函数或类
            • 1.3.3 export default
        • 1.4 ES6 的 import 指令
            • 1.4.1 import 使用
    • 2. Vue CLI 详解
        • 2.1 Vue CLI
            • 2.1.1 Vue CLI 是什么?
            • 2.1.2 Vue CLI 使用前提 - Node
            • 2.1.3 Vue CLI 使用前提 - Webpack
            • 2.1.4 Vue CLI 的使用
        • 2.2 Vue CLI2 的使用
            • 2.2.1 Vue CLI2 详解
            • 2.2.2 目录结构详解
            • 2.2.3 Runtime-Compiler 和 Runtime-only 的区别
            • 2.2.4 render 和 template
            • 2.2.5 Vue 程序运行过程
            • 2.2.6 render 函数的使用
            • 2.2.7 npm run build
            • 2.2.8 npm run dev
            • 2.2.9 修改配置:webpack.base.conf.js
        • 2.3 Vue CLI3 的使用
            • 2.3.1 认识 Vue CLI3
            • 2.3.2 目录结构详解
            • 2.3.3 Vue cli3 配置
            • 2.3.4 自定义配置:起别名
    • 3. Vue Router
        • 3.1 认识路由
            • 3.1.1 什么是路由
            • 3.1.2 后端路由阶段
            • 3.1.3 前端路由阶段
        • 3.2 前端路由的规则
            • 3.2.1 URL 的 hash
            • 3.2.2 HTML5 的 history 模式
        • 3.3 vue-router 基础
            • 3.3.1 认识 vue-router
            • 3.3.2 安装和使用 vue-router
            • 3.3.3 创建 router 实例
            • 3.3.4. 挂载到 Vue 实例中
            • 3.3.5 vue-router 基本使用
        • 3.4 vue-router 细节补充
            • 3.4.1 路由的默认路径
            • 3.4.2. HTML5的History模式
            • 3.4.3. router-link 补充
            • 3.4.4 修改 linkActiveClass
            • 3.4.5 路由代码跳转
            • 3.4.6 动态路由
        • 3.5 路由的懒加载
            • 3.5.1 认识路由懒加载
            • 3.1.2 路由懒加载的效果
            • 3.1.3 懒加载的方式
        • 3.6 路由嵌套使用
            • 3.6.1 认识嵌套路由
            • 3.6.2 嵌套路由实现
            • 3.6.3 嵌套默认路径
        • 3.7 路由传递参数
            • 3.7.1 准备工作
            • 3.7.2 传递参数的方式
            • 3.7.3 传递参数方式一
            • 3.7.4 传递参数方式二
            • 3.7.5 接收参数
            • 3.7.6 `$route`和`$router`是有区别的
        • 3.8 路由导航守卫
            • 3.8.1 什么是导航守卫
            • 3.8.2 为什么使用导航守卫?
            • 3.8.3 全局导航守卫
            • 3.8.4 路由独享的守卫
            • 3.8.5 组件内的守卫
            • 3.8.6 完整的导航解析流程
        • 3.9 keep-alive
            • 3.9.1 记录路由信息
        • 3.10 TabBar练习
            • 3.10.1 TabBar 实现思路
            • 3.10.2 代码实现
    • 4. Vuex 详解
        • 4.1 认识 Vuex
            • 4.1.1 Vuex 作用
            • 4.1.2 管理什么状态
            • 4.1.3 单界面的状态管理
            • 4.1.4 单界面状态管理的实现
            • 4.1.5 多界面状态管理
            • 4.1.6 全局单例模式
            • 4.1.7 Vuex状态管理图例
        • 4.2 Vuex 基本使用
            • 4.2.1 简单的案例
            • 4.2.2 挂载到 Vue 实例中
            • 4.2.3 使用 Vuex 的 count
    • 5. Vuex核心概念
        • 1. state
            • State单一状态树
        • 2. Getters
            • Getters基本使用
            • Getters作为参数和传递参数
        • 3. Mutation
            • Mutation状态更新
            • Mutation传递参数
            • Mutation提交风格
            • Mutation响应规则
            • Mutation常量类型 – 概念
            • Mutation常量类型 – 代码
            • Mutation同步函数
        • 4. Action
            • Action基本定义
            • Action的分发
            • Action返回的Promise
        • 5. Module
            • 认识Vuex的Module
            • Module的局部状态
            • Module的Actions写法
    • 5. 网络模块封装
        • 1. 网络模块的选择
            • 1. 选择 `Ajax`
            • 2. 选择 `jQuery-Ajax`
            • 3. 选择 `Vue-resource`
            • 4. 选择 `axios`
        • 2. jsonp的封装
            • jsonp
            • JSONP封装
        • 3. axios的使用
            • 1. 认识 `axios`
            • 2. 发送基本请求
        • 4. axios的实例
            • axios的实例
            • axios 封装
        • 5. 拦截器
            • 1. 如何使用拦截器?
            • 2. 拦截器中都做什么呢?
    • 6. 总结

1. 模块化开发

1.1 为什么要模块化

1.1.1 JavaScript 原始功能
  • 早期
    • js作为一种脚本语言,做简单的表单验证动画实现少量代码
  • 后期
    • 随着ajax异步请求的出现,形成了前后端的分离
    • 客户端需要完成的事情越来越多,代码量与日俱增
  • 如何应对
    • 通常会将代码组织在多个js文件中,进行维护
      • 缺陷
        • 比如全局变量同名问题
        • 这种代码的编写方式对js文件的依赖顺序几乎是强制性
        • js文件过多,理清文件顺序很困难
// aaa.js文件中,小明定义了一个变量,名称是flag,并且为true
flag = true

// bbb.js文件中,小丽也喜欢用flag这个变量名称,值为false
flag = false

// main.js文件中,小明想通过flag进行一些判断,完成后续的事情
if (flag) {
	console.log('小明是个天才');
}
1.1.2 匿名函数的解决方案
  • 使用匿名函数来解决方面的重名问题
    • aaa.js文件中,我们使用匿名函数
(function(){
	var flag = true
})()
  • 问题
    • 如果在main.js文件中,用到flag,应该如何处理呢?
      • 另外一个文件中不容易使用,因为flag是一个局部变量
1.1.3 使用模块作为出口
  • 需要暴露到外面的变量,使用一个模块作为出口
    • 匿名函数内部,定义一个对象
    • 给对象添加各种需要暴露到外面的属性和方法(不需要暴露的直接定义即可)
    • 将这个对象返回,并且在外面使用了一个MoudleA接收
    • man.js中,只需要使用属于自己模块的属性和方法即可
var ModuleA = (function() {
	// 1. 定义一个对象
	var obj = {}
	// 2. 在对象内部添加变量和方法
	obj.flag = true
	obj.myFunc = function(info){
		console.log(info);
	}
	// 3. 将对象返回
	return obj
})()
if (ModuleA.flag){
	console.log('小明是个天才');
}

ModuleA.myFunc('小明长得真帅')

console.log(ModuleA);
  • 常见的模块化规范
    • CommonJSAMDCMD,也有ES6modules

1.2 CommonJS

  • 模块化有两个核心:导出导入
  • CommonJS 导出
    • module.exports
module.exports = {
	flag: true,
	test(a,b){
		return a + b
	},
	demo(a,b){
		return a * b
	}
}
  • CommonJS 导入
    • require
// CommonJS模块
let {test,demo,flag} = require('moduleA');

// 等同于
let _mA = require('moduleA');
let test = _mA.test;
let demo = _mA.demo;
let flag = _mA.flag;

1.3 ES6 的 export 指令

1.3.1 export 基本使用
  • export指令用于导出变量
// info.js
export let name = 'why'
export let age = 18
export let height = 1.88

// 另一种写法
// info.js
let name = 'why'
let age = 18
let height = 1.88

export {name,age,height}
1.3.2 导出函数或类
  • 上面主要是输出变量,也可以输出函数或者输出类
export function test(content){
	console.log(content);
}

export class Person{
	constructor(name,age){
		this.name = name;
		this.age = age;
	}

	run(){
		console.log(this.name + '在奔跑');
	}
}
function test(content){
	console.log(content);
}

class Person{
	constructor(name,age){
		this.name = name;
		this.age = age;
	}

	run(){
		console.log(this.name + '在奔跑');
	}
}

export {test,Person}
1.3.3 export default
  • 某些情况下,一个模块中包含某个的功能,希望让导入者可以自己来命名
  • 可以使用export default
## info.js

export default function(){
	console.log('default function');
}
  • main.js中可以根据需要命名它对应的名字
## mian.js

import myFunc from './info.js'

myFunc()
  • 注意
    • export default同一个模块中,不允许同时存在多个

1.4 ES6 的 import 指令

1.4.1 import 使用
  • 使用export指令导出了模块对外提供的接口
  • 之后就可以通过import命令来加载对应的模块
  • 首先,需要在HTML代码中引入两个js文件,并且类型需要设置为module
<script src="info.js" type="module">script>
<script src="main.js" type="module">script>
  • import指令用于导入模块中的内容
## mian.js

import {name,age,height} from "./info.js"

console.log(name,age,height);
  • 如果需要某个模块中所有的信息都导入
    • 通过*可以导入模块中所有的export变量
    • 但是通常情况下需要给*起一个别名,方便后续的使用
## mian.js

import * as info from './info.js'

console.log(info.name, info.age, info.height, info.friends);

2. Vue CLI 详解

2.1 Vue CLI

2.1.1 Vue CLI 是什么?
  • 使用Vue.js开发大型应用时,需要考虑代码目录结构项目结构部署热加载代码单元测试等事情
  • 通常会使用一些脚手架工具来完成
  • CLI是什么意思?
    • CLICommand-Line Interface, 翻译为命令行界面, 但是俗称脚手架
    • Vue CLI是一个官方发布 vue.js 项目脚手架
    • 使用 vue-cli 可以快速搭建Vue开发环境以及对应的webpack配置
2.1.2 Vue CLI 使用前提 - Node
  • 安装NodeJS
    • 网址: http://nodejs.cn/download/
  • 检测安装的版本
    • 默认情况下自动安装NodeNPM
    • Node环境要求8.9以上或者更高版本
    • node -v
    • npm -v
  • 什么是NPM
    • NPM的全称是Node Package Manager
    • NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准
2.1.3 Vue CLI 使用前提 - Webpack
  • Vue.js官方脚手架工具就使用了webpack模板
    • 对所有的资源会压缩等优化操作
    • 它在开发过程中提供了一套完整的功能,能够使得我们开发过程中变得高效
  • Webpack的全局安装
    • npm install webpack -g
2.1.4 Vue CLI 的使用
  • 安装Vue脚手架
    • npm install -g @vue/cli
    • vue --version
  • 注意:上面安装的是Vue CLI3的版本,如果需要想按照Vue CLI2的方式初始化项目时是不可以
    在这里插入图片描述
  • Vue CLI2初始化项目
    • vue init webpack my-project
  • Vue CLI3初始化项目
    • vue create my-project

2.2 Vue CLI2 的使用

2.2.1 Vue CLI2 详解

在这里插入图片描述

2.2.2 目录结构详解

在这里插入图片描述

2.2.3 Runtime-Compiler 和 Runtime-only 的区别

在这里插入图片描述

  • 如果之后的开发中,依然使用template,就需要选择Runtime-Compiler
  • 如果之后的开发中,使用的是.vue文件夹开发,那么可以选择Runtime-only
2.2.4 render 和 template
  • Runtime-CompilerRuntime-only
new Vue({
	el: '#app',
	components: { App },
	template: ''
})
new Vue({
	el: '#app',
	render: h => h(App)
})
2.2.5 Vue 程序运行过程

在这里插入图片描述

2.2.6 render 函数的使用
  • 方式一
new Vue({
	el: '#app',
	render: (createElement) => {
		// 1. 使用方式一:
		return createElement('标签','相关数据对象(可以不传)'.['内容数组'])
		// 1.1 render函数基本使用
		return createElement('div',{class: 'box'}, ['xxx'])
		// 1.2 嵌套render函数
		return createElement('div',{class: 'box'}, ['xxx', createElement('h2', ['标题'])])
	}
})
  • 方式二
const cpn = Vue.component('cpn',{
	template: '
我是cpn组件
'
, data() { return { } } }) new Vue({ el: '#app', render: (createElement) => { // 2. 使用方式二:传入一个组件对象 return createElement(cpn) } })
2.2.7 npm run build

在这里插入图片描述

2.2.8 npm run dev

在这里插入图片描述

2.2.9 修改配置:webpack.base.conf.js
resolve: {
	extensions: ['.js','.vue','.json'],
	alias: {
		'@': resolve('src'),
		'pages': resolve('src/pages'),
		'common':resolve('src/common'),
		'components': resolve('src/components'),
		'network': resolve('src/network')
	}
}

2.3 Vue CLI3 的使用

2.3.1 认识 Vue CLI3
  • vue-cli 3 与 2 版本有很大区别
    • vue-cli 3 是基于 webpack 4 打造,vue-cli 2 还是 webapck 3
    • vue-cli 3 的设计原则是“0配置”,移除的配置文件根目录下的,buildconfig等目录
    • vue-cli 3 提供了 vue ui 命令,提供了可视化配置,更加人性化
    • 移除了static文件夹,新增了public文件夹,并且index.html移动到public
      在这里插入图片描述
2.3.2 目录结构详解

在这里插入图片描述

2.3.3 Vue cli3 配置
  • UI方面的配置
    • 启动配置服务器:vue ui

在这里插入图片描述
在这里插入图片描述

2.3.4 自定义配置:起别名
const path = require('path')
function resolve (dir) {
	return path.join(__dirname,dir)
}

module.exports = {
	// 1. 基础的配置方式
	configureWebpack: {
		resolve: {
			alias: {
				'components': '@/components',
				'pages': '@/pages'
			}
		}
	},
	// 2. 利用webpack4的webpack-chain来配置
	chainWebpack: (config) => {
		config.resolve.alias
			.set('@$',resolve('src'))
			.set('components',resolve('src/components')
	}
}

3. Vue Router

3.1 认识路由

3.1.1 什么是路由
  • 概念
    • 路由routing)就是通过互联的网络把信息从源地址传输到目的地址的活动. — 维基百科
  • 作用
    • 路由器提供了两种机制: 路由转送
      • 路由
        • 决定数据包从来源到目的地的路径
      • 转送
        • 将输入端的数据转移到合适的输出端
  • 路由表
    • 路由表本质上就是一个映射表, 决定了数据包的指向
3.1.2 后端路由阶段
  • 后端路由过程
    • 服务器直接生产渲染好对应的HTML页面, 返回给客户端进行展示
    • 网站有这么多页面,服务器如何处理
      • 一个页面有自己对应的网址, 也就是URL
      • URL会发送到服务器, 服务器会通过正则对该URL进行匹配, 并且最后交给一个Controller进行处理
      • Controller进行各种处理, 最终生成HTML或者数据, 返回给前端
      • 这就完成了一个IO操作
    • 当页面中需要请求不同的路径内容时, 交给服务器来进行处理, 服务器渲染好整个页面, 并且将页面返回给客户端
    • 这种情况下渲染好的页面, 不需要单独加载任何的js和css, 可以直接交给浏览器展示, 这样也有利于SEO的优化
  • 缺点
    • 一种情况是整个页面的模块由后端人员来编写和维护的
    • 另一种情况是前端开发人员如果要开发页面, 需要通过PHPJava等语言来编写页面代码
    • 而且通常情况下HTML代码和数据以及对应的逻辑会混在一起, 编写和维护都是非常糟糕的事情
3.1.3 前端路由阶段
  • 前后端分离
    • 随着Ajax的出现, 有了前后端分离的开发模式
    • 后端只提供API返回数据, 前端通过Ajax获取数据, 并且可以通过JavaScript将数据渲染到页面中
  • 优点
    • 前后端责任的清晰
      • 后端专注于数据
      • 前端专注于交互可视化
    • 并且当移动端(iOS/Android)出现后, 后端不需要进行任何处理, 依然使用之前的一套API即可
  • 单页面富应用阶段(Single Page Application)
    • SPA最主要的特点就是在前后端分离的基础上加了一层前端路由
    • 前端来维护一套路由规则
  • 前端路由核心
    • 改变URL,但是页面不进行整体的刷新

3.2 前端路由的规则

3.2.1 URL 的 hash
  • URL的hash
    • URLhash也就是锚点(#), 本质上是改变window.locationhref属性
    • 可以通过直接赋值location.hash来改变href, 但是页面不发生刷新
      在这里插入图片描述
3.2.2 HTML5 的 history 模式
  • history接口是HTML5新增的, 它有五种模式改变URL不刷新页面
  • pushState
    • history.pushState()
      • history.pushState()方法向浏览器历史添加了一个状态(增加一个记录)
      • pushState()方法带有三个参数:一个状态对象、一个标题(现在被忽略了)以及一个可选的URL地址
      • pushState方法不会触发页面刷新,只是导致history对象发生变化地址栏会有反应
      • 如果pushState的url参数设置了一个新的锚点值(即hash)并不会触发hashchange事件
      • 如果设置了一个跨域网址,则会报错
        在这里插入图片描述
  • replaceState
    • history.replaceState()
    • 参数与pushState一样,区别为修改浏览历史中当前纪录
      在这里插入图片描述
  • go
    • history.go()
    • go() 方法可加载历史列表中的某个具体的页面
      在这里插入图片描述
  • 补充说明:
    • history.back() 等价于 history.go(-1)
    • history.forward() 则等价于 history.go(1)
    • 这三个接口等同于浏览器界面的前进后退

3.3 vue-router 基础

3.3.1 认识 vue-router
  • 目前前端流行的三大框架, 都有自己的路由实现
    • AngularngRouter
    • ReactReactRouter
    • Vuevue-router
  • vue-router
    • vue-routerVue.js官方的路由插件,它和vue.js深度集成的,适合用于构建单页面应用
    • 官方网站 https://router.vuejs.org/zh/
  • vue-router是基于路由组件
    • 路由用于设定访问路径, 将路径和组件映射起来
    • vue-router的单页面应用中, 页面的路径的改变就是组件的切换
3.3.2 安装和使用 vue-router
  • 安装vue-router
    • npm install vue-router --save
  • 在模块化工程中使用它(因为是一个插件, 所以可以通过Vue.use()来安装路由功能)
    • 第一步:导入路由对象,并且调用 Vue.use(VueRouter)
    • 第二步:创建路由实例,并且传入路由映射配置
    • 第三步:在Vue实例中挂载创建的路由实例
import Vue from 'vue'
import VueRouter form 'vue-router'

Vue.use(VueRouter)
  • 使用vue-router的步骤
    • 第一步: 创建路由组件
    • 第二步: 配置路由映射: 组件和路径映射关系
    • 第三步: 使用路由( 通过
3.3.3 创建 router 实例

在这里插入图片描述

3.3.4. 挂载到 Vue 实例中

在这里插入图片描述

3.3.5 vue-router 基本使用

3.4 vue-router 细节补充

3.4.1 路由的默认路径
  • 如何可以让路径默认跳到首页, 并且渲染首页组件呢?
  • 只需要配置多配置一个映射就可以
const routes = [
	{
		path: '/',
		redirect: '/home'
	}
]
  • 配置解析
    • 我们在routes中又配置了一个映射
    • path配置的是根路径: /
    • redirect重定向
      • 根路径重定向/home的路径下, 这样就可以让路径默认跳到首页
3.4.2. HTML5的History模式
  • 改变路径的方式有两种
    • URL的hash
    • HTML5的history
    • 默认情况下, 路径的改变使用的URL的hash
  • 如果希望使用HTML5history模式, 进行如下配置即可:
const router = new VueRouter({
	routes,
	mode: 'history'
})
3.4.3. router-link 补充
3.4.4 修改 linkActiveClass
  • 修改 router-link-active 的默认名称
  • class具体的名称也可以通过router实例的属性进行修改
    在这里插入图片描述
    在这里插入图片描述
  • exact-active-class
    • 类似于active-class, 只是在精准匹配下才会出现的class
    • 后面看到嵌套路由时, 再看下这个属性
3.4.5 路由代码跳转
  • 页面的跳转可能需要执行对应的JavaScript代码
  • 可以使用 this.$router.push('/home')
  • 原理
    • vue 源码中在 data 中默认添加了 $router 属性
    • 调用 $router 属性中的 push() 方法
    • push => pushState
    • 调用 $router 属性中的 replace() 方法不能返回上一页
    • replace => replaceState
      在这里插入图片描述
3.4.6 动态路由
  • 当页面的path路径不确定
    • 比如进入用户界面时,希望是如下的路径:
      • /user/aaaa/user/bbbb
      • 除了前面的/user之外,后面还跟上了用户的 ID
  • 这种pathComponent的匹配关系,称之为动态路由(也是路由传递数据的一种方式)
  • router.js
{
	path: '/user/:id',
	component: User
}

<router-link :to="'/user/'+userId">用户router-link>
...
data(){
	return {
		userId:'123'
	}
}
  • 动态展示获取路由 ID 信息
    • $router 就是 router 文件夹 index.js 中定义的 router 对象
    • $route 就是当前活跃状态的路由对象
  • this.$route.params.userId
    • parmas 方式接收参数
<h2>{{userId}}h2>
...
data(){
	return {
		userId(){
			// 接收 path: '/user/:id/' 中的 id
			return this.$route.params.id
		}
	}
}

在这里插入图片描述

3.5 路由的懒加载

3.5.1 认识路由懒加载
  • 官方解释
    • 打包构建应用时,Javascript 包会变得非常大影响页面加载
    • 如果把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样更加高效
  • 如何理解
    • 首先, 路由中通常会定义很多不同的页面
    • 一般情况下, 这些页面最后被打包在一个js文件中
    • 但是页面都放在一个js文件中, 必然会造成这个页面非常的大
    • 如果一次性从服务器请求这些页面, 可能需要花费一定的时间, 甚至还会出现了短暂空白的情况
  • 如何解决
    • 路由懒加载
  • 路由懒加载作用
    • 路由懒加载的主要作用就是将路由对应的组件打包成一个个的js代码块
    • 只有在这个路由被访问到的时候, 才加载对应的组件
3.1.2 路由懒加载的效果

在这里插入图片描述

3.1.3 懒加载的方式
  • 方式一: 结合Vue的异步组件和Webpack的代码分析
const Home = resolve => { require.ensure(['../components/Home.vue'], () => { resolve(require('../components/Home.vue')) })};
  • 方式二: ADM写法
const About = resolve => require(['../components/About.vue'], resolve);
  • 方式三: 在ES6写法
const Home = () => import('../components/Home.vue')

3.6 路由嵌套使用

3.6.1 认识嵌套路由
  • 嵌套路由是一个很常见的功能
    • 比如在home页面中, 通过/home/news/home/message访问一些内容
    • 一个路径映射一个组件, 访问这两个路径也会分别渲染两个组件
  • 路径和组件的关系如下:
    在这里插入图片描述
  • 嵌套路由步骤
    • 创建对应的子组件
    • 在路由映射中配置对应的子路由
    • 在组件内部使用标签
3.6.2 嵌套路由实现
  • 定义两个组件
    在这里插入图片描述
  • 使用 children 设置子路由进行路由嵌套
    在这里插入图片描述
  • 使用 链接子组件
    在这里插入图片描述
    在这里插入图片描述
3.6.3 嵌套默认路径

在这里插入图片描述

3.7 路由传递参数

3.7.1 准备工作
  • 为了演示传递参数, 再创建一个组件, 并且将其配置好
    • 第一步: 创建新的组件Profile.vue
    • 第二步: 配置路由映射
    • 第三步: 添加跳转
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
3.7.2 传递参数的方式
  • 传递参数主要有两种类型: paramsquery
  • params的类型
    • 配置路由格式: /router/:id
    • 传递的方式: 在path后面跟上对应的值
    • 传递后形成的路径: /router/123, /router/abc
this.$router.push({
  name:'xxx'
  params:{
    id:id
  }
})
  • query的类型
    • 配置路由格式: /router, 也就是普通配置
    • 传递的方式: 对象中使用querykey作为传递方式
    • 传递后形成的路径: /router?id=123, /router?id=abc
this.$router.push({
  path:'/xxx'
  query:{
    id:id
  }
})
  • 如何使用
    • 的方式
    • JavaScript代码方式
3.7.3 传递参数方式一
  • 的方式

    • 在这里插入图片描述
3.7.4 传递参数方式二
  • JavaScript代码形式
    • 添加方法
    • this.$router.push
    • path: '/路由/' + 参数
    • query: { key : value }
      在这里插入图片描述
3.7.5 接收参数
  • 接收参数通过$route对象获取的
    • 在使用了 vue-router 的应用中,路由对象会被注入每个组件中,赋值为 this.$route
    • 并且当路由切换时,路由对象会被更新
  • 通过$route获取传递的信息如下
    • this.$route.params.id
    • this.$route.query.name/age
      在这里插入图片描述
3.7.6 $route$router是有区别的
  • $route$router是有区别的
    • $routerVueRouter实例,想要导航到不同URL,则使用$router.push方法
    • $route为当前router跳转对象,里面可以获取name、path、query、params
      在这里插入图片描述

3.8 路由导航守卫

3.8.1 什么是导航守卫
  • vue-router提供的导航守卫主要用来监听路由的进入和离开
  • vue-router提供了beforeEachafterEach钩子函数
  • 它们会在路由即将改变前改变后触发
3.8.2 为什么使用导航守卫?
  • 需求: 在一个单页面应用中, 如何改变网页的标题呢?
    • 网页标题是通过</code>来显示的, 但是<code>SPA应用</code>只有一个固定的<code>HTML</code>, <code>切换不同的页面时, 标题并不会改变</code></li> <li>可以通过<code>JavaScript</code>来修改<code><title></code>的内容 <ul> <li><code>window.document.title = '新的标题'</code></li> </ul> </li> <li>在<code>Vue</code>项目中, <code>在哪里修改?</code> <code>什么时候修改?</code></li> </ul> </li> <li><code>普通的修改方式</code> <ul> <li>每一个路由对应的组件<code>.vue</code>文件中</li> <li>通过<code>mounted</code>声明<code>周期函数</code>, 执行对应的代码进行修改即可</li> <li>当页面比较多时, 这种方式<code>不容易维护</code>(因为需要在多个页面执行类似的代码)</li> </ul> </li> <li><code>导航守卫方式</code></li> </ul> <h6>3.8.3 全局导航守卫</h6> <ul> <li><code>全局守卫</code> <ul> <li><code>beforeEach</code> 进入组件前调用</li> <li><code>afterEach</code> 进入组件后调用</li> </ul> </li> <li>可以利用<code>beforeEach</code>来完成<code>标题的修改</code> <ul> <li>首先, 在钩子当中<code>定义一些标题</code>, 可以利用<code>meta</code>来定义(<code>meta元数据--描述数据的数据</code>)</li> <li>其次, 利用<code>导航守卫</code>,<code>修改标题</code></li> </ul> </li> </ul> <pre><code class="prism language-js"><span class="token comment">// 2.创建VueRouter对象</span> <span class="token keyword">const</span> routes <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> path<span class="token operator">:</span> <span class="token string">''</span><span class="token punctuation">,</span> <span class="token comment">// redirect重定向</span> redirect<span class="token operator">:</span> <span class="token string">'/home'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> path<span class="token operator">:</span> <span class="token string">'/home'</span><span class="token punctuation">,</span> component<span class="token operator">:</span> Home<span class="token punctuation">,</span> meta<span class="token operator">:</span> <span class="token punctuation">{</span> title<span class="token operator">:</span> <span class="token string">'首页'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> children<span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token comment">// {</span> <span class="token comment">// path: '',</span> <span class="token comment">// redirect: 'news'</span> <span class="token comment">// },</span> <span class="token punctuation">{</span> path<span class="token operator">:</span> <span class="token string">'news'</span><span class="token punctuation">,</span> component<span class="token operator">:</span> HomeNews <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> path<span class="token operator">:</span> <span class="token string">'message'</span><span class="token punctuation">,</span> component<span class="token operator">:</span> HomeMessage <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> path<span class="token operator">:</span> <span class="token string">'/about'</span><span class="token punctuation">,</span> component<span class="token operator">:</span> About<span class="token punctuation">,</span> meta<span class="token operator">:</span> <span class="token punctuation">{</span> title<span class="token operator">:</span> <span class="token string">'关于'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> path<span class="token operator">:</span> <span class="token string">'/user/:id'</span><span class="token punctuation">,</span> component<span class="token operator">:</span> User<span class="token punctuation">,</span> meta<span class="token operator">:</span> <span class="token punctuation">{</span> title<span class="token operator">:</span> <span class="token string">'用户'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> path<span class="token operator">:</span> <span class="token string">'/profile'</span><span class="token punctuation">,</span> component<span class="token operator">:</span> Profile<span class="token punctuation">,</span> meta<span class="token operator">:</span> <span class="token punctuation">{</span> title<span class="token operator">:</span> <span class="token string">'档案'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token operator">...</span> <span class="token comment">// 前置守卫(guard)</span> router<span class="token punctuation">.</span><span class="token function">beforeEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">to<span class="token punctuation">,</span> <span class="token keyword">from</span><span class="token punctuation">,</span> next</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token comment">// 从from跳转到to</span> document<span class="token punctuation">.</span>title <span class="token operator">=</span> to<span class="token punctuation">.</span>matched<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>meta<span class="token punctuation">.</span>title <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> ## beforeEach 源码 <span class="token function">beforeEach</span> <span class="token punctuation">(</span>guard<span class="token operator">:</span> NavigationGuard<span class="token punctuation">)</span><span class="token operator">:</span> Function<span class="token punctuation">;</span> <span class="token keyword">export</span> type NavigationGuard<span class="token operator"><</span><span class="token constant">V</span> <span class="token keyword">extends</span> <span class="token class-name">Vue</span> <span class="token operator">=</span> Vue<span class="token operator">></span> <span class="token operator">=</span> <span class="token punctuation">(</span> to<span class="token operator">:</span> Route<span class="token punctuation">,</span> <span class="token keyword">from</span><span class="token operator">:</span> Route<span class="token punctuation">,</span> next<span class="token operator">:</span> <span class="token punctuation">(</span>to<span class="token operator">?</span><span class="token operator">:</span> RawLocation <span class="token operator">|</span> <span class="token boolean">false</span> <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">vm<span class="token operator">:</span> <span class="token constant">V</span></span><span class="token punctuation">)</span> <span class="token operator">=></span> any<span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token keyword">void</span> <span class="token punctuation">)</span> <span class="token operator">=></span> any </code></pre> <ul> <li><code>导航钩子的三个参数解析</code> <ul> <li><code>to</code>: <code>即将要进入的目标的路由对象</code></li> <li><code>from</code>: <code>当前导航即将要离开的路由对象</code></li> <li><code>next</code>: <code>调用该方法后, 才能进入下一个钩子</code></li> </ul> </li> <li><code>注意</code> <ul> <li>如果是<code>后置钩子</code>, 也就是<code>afterEach</code></li> <li><code>不需要主动调用next()函数</code></li> </ul> </li> </ul> <pre><code class="prism language-js"><span class="token comment">// 后置钩子(hook)</span> router<span class="token punctuation">.</span><span class="token function">afterEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">to<span class="token punctuation">,</span> <span class="token keyword">from</span></span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> ## afterEach 源码 <span class="token function">afterEach</span> <span class="token punctuation">(</span><span class="token function-variable function">hook</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token parameter">to<span class="token operator">:</span> Route<span class="token punctuation">,</span> <span class="token keyword">from</span><span class="token operator">:</span> Route</span><span class="token punctuation">)</span> <span class="token operator">=></span> any<span class="token punctuation">)</span><span class="token operator">:</span> Function<span class="token punctuation">;</span> </code></pre> <h6>3.8.4 路由独享的守卫</h6> <ul> <li><code>路由独享的守卫</code> <ul> <li><code>beforeEnter</code> 进入<code>指定的组件</code>之前调用</li> </ul> </li> </ul> <pre><code class="prism language-js"><span class="token keyword">const</span> router <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">VueRouter</span><span class="token punctuation">(</span><span class="token punctuation">{</span> routes<span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> path<span class="token operator">:</span> <span class="token string">'/foo'</span><span class="token punctuation">,</span> component<span class="token operator">:</span> Foo<span class="token punctuation">,</span> <span class="token function-variable function">beforeEnter</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token parameter">to<span class="token punctuation">,</span> <span class="token keyword">from</span><span class="token punctuation">,</span> next</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <h6>3.8.5 组件内的守卫</h6> <ul> <li><code>组件内的守卫</code> <ul> <li>在路由<code>组件内直接定义</code>路由导航守卫</li> <li><code>beforeRouteEnter</code></li> <li><code>beforeRouterUpdate</code></li> <li><code>beforeRouteLeave</code></li> </ul> </li> </ul> <pre><code class="prism language-js"><span class="token keyword">const</span> Foo <span class="token operator">=</span> <span class="token punctuation">{</span> template<span class="token operator">:</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">...</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span> <span class="token function">beforeRouteEnter</span> <span class="token punctuation">(</span><span class="token parameter">to<span class="token punctuation">,</span> <span class="token keyword">from</span><span class="token punctuation">,</span> next</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 在渲染该组件的对应路由被 confirm 前调用</span> <span class="token comment">// 不能获取组件实例 `this`</span> <span class="token comment">// 因为当守卫执行前,组件实例还没被创建</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">beforeRouteUpdate</span> <span class="token punctuation">(</span><span class="token parameter">to<span class="token punctuation">,</span> <span class="token keyword">from</span><span class="token punctuation">,</span> next</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 在当前路由改变,但是该组件被复用时调用</span> <span class="token comment">// 举例来说,对于一个带有动态参数的路径 /foo/:id, 在 /foo/1 和 /foo/2 之间跳转的时候,</span> <span class="token comment">// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用</span> <span class="token comment">// 可以访问组件实例 `this`</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">beforeRouteLeave</span> <span class="token punctuation">(</span><span class="token parameter">to<span class="token punctuation">,</span> <span class="token keyword">from</span><span class="token punctuation">,</span> next</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">// 导航离开该组件的对应路由时调用</span> <span class="token comment">// 可以访问组件实例 `this`</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <h6>3.8.6 完整的导航解析流程</h6> <ol> <li>导航被触发</li> <li>在失活的组件里调用 beforeRouteLeave 守卫</li> <li>调用全局的 beforeEach 守卫</li> <li>在重用的组件里调用 beforeRouteUpdate 守卫</li> <li>在路由配置里调用 beforeEnter</li> <li>解析异步路由组件</li> <li>在被激活的组件里调用 beforeRouteEnter</li> <li>调用全局的 beforeResolve 守卫 (2.5+)</li> <li>导航被确认</li> <li>调用全局的 afterEach 钩子</li> <li>触发 DOM 更新</li> <li>调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入</li> </ol> <h4>3.9 keep-alive</h4> <ul> <li><code>keep-alive</code> 是 <code>Vue</code> 内置的一个组件 <ul> <li>可以<code>使被包含的组件保留状态</code>,或<code>避免重新渲染</code></li> <li><code>两个重要的属性</code> <ul> <li><code>include</code> - 字符串或正则表达,<code>只有匹配的组件会被缓存</code></li> <li><code>exclude</code> - 字符串或正则表达式,<code>任何匹配的组件都不会被缓存</code></li> </ul> </li> </ul> </li> <li><code>router-view</code> 也是一个组件 <ul> <li>如果<code>直接被包在 keep-alive 里面</code>,<code>所有路径匹配到的视图组件都会被缓存</code></li> </ul> </li> </ul> <pre><code class="prism language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>keep-alive</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>router-view</span><span class="token punctuation">></span></span> <span class="token comment"><!-- 所有路径匹配到的视图组件都会被缓存! --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>router-view</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>keep-alive</span><span class="token punctuation">></span></span> </code></pre> <ul> <li>通过<code>create</code>声明周期函数来验证</li> </ul> <h6>3.9.1 记录路由信息</h6> <ul> <li><code>记录离开时的路由信息,当返回时依然是这个路由</code></li> </ul> <pre><code class="prism language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h2</span><span class="token punctuation">></span></span>我是首页<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h2</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>我是首页内容, 哈哈哈<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>router-link</span> <span class="token attr-name">to</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/home/news<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>新闻<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>router-link</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>router-link</span> <span class="token attr-name">to</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/home/message<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>消息<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>router-link</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>router-view</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>router-view</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>h2</span><span class="token punctuation">></span></span>{{message}}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>h2</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">"Home"</span><span class="token punctuation">,</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> message<span class="token operator">:</span> <span class="token string">'你好啊'</span><span class="token punctuation">,</span> path<span class="token operator">:</span> <span class="token string">'/home/news'</span> <span class="token comment">// 默认显示新闻的路由</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">created</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'home created'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">destroyed</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'home destroyed'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment">// 这两个函数, 只有该组件被保持了状态使用了keep-alive时, 才是有效的</span> <span class="token function">activated</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$router<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'activated'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">deactivated</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'deactivated'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">beforeRouteLeave</span> <span class="token punctuation">(</span><span class="token parameter">to<span class="token punctuation">,</span> <span class="token keyword">from</span><span class="token punctuation">,</span> next</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>$route<span class="token punctuation">.</span>path<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>path <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$route<span class="token punctuation">.</span>path<span class="token punctuation">;</span> <span class="token comment">// 离开前将路由记录在默认path中</span> <span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span> <span class="token attr-name">scoped</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span> </code></pre> <h4>3.10 TabBar练习</h4> <h6>3.10.1 TabBar 实现思路</h6> <ul> <li><code>如何封装自定义 TabBar 组件</code> <ul> <li>让<code>TabBar</code>处于<code>底部</code>,并且<code>设置相关的样式</code></li> <li><code>TabBar</code>中显示的内容由<code>外界</code>决定 <ul> <li><code>插槽</code></li> <li><code>flex</code>布局平分<code>TabBar</code></li> </ul> </li> <li>自定义<code>TabBarItem</code>,可以<code>传入图片和文字</code> <ul> <li>定义<code>TabBarItem</code>,并且<code>定义两个插槽:图片、文字</code></li> <li>给两个插槽外层包装<code>div</code>,用于<code>设置样式</code></li> <li><code>填充插槽</code>,实现底部<code>TabBar</code>的效果</li> </ul> </li> <li>传入<code>高亮图片</code> <ul> <li>定义另外一个插槽,插入<code>active-icon</code>的数据</li> <li>定义一个变量<code>isActive</code>,通过<code>v-show</code>来决定是否显示对应的<code>icon</code></li> </ul> </li> <li><code>TabBarItem 绑定路由数据</code> <ul> <li>安装路由:<code>npm install vue-router —save</code></li> <li>完成<code>router/index.js</code>的内容,以及<code>创建对应的组件</code></li> <li><code>main.js</code>中注册<code>router</code></li> <li><code>APP</code>中加入<code><router-view></code>组件</li> </ul> </li> <li><code>点击 item 跳转到对应路由</code>,并且<code>动态决定 isActive</code> <ul> <li>监听<code>item</code>的点击,通过<code>this.$router.replace()替换路由路径</code></li> <li>通过<code>this.$route.path.indexOf(this.link) !== -1</code>来判断是否是<code>active</code></li> </ul> </li> <li><code>动态计算 active 样式</code> <ul> <li><code>封装新的计算属性</code>:<code>this.isActive ? {'color': 'red'} : {}</code><br> <img src="http://img.e-com-net.com/image/info8/2a9e0d3255f9469793afac1bc9a5ffb1.jpg" alt="在这里插入图片描述" width="0" height="0"></li> </ul> </li> </ul> </li> </ul> <h6>3.10.2 代码实现</h6> <ul> <li><code>TabBar.vue</code></li> </ul> <pre><code class="prism language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>tab-bar<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>slot</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>slot</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">"TabBar"</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span> <span class="token attr-name">scoped</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"> <span class="token selector">#tab-bar</span> <span class="token punctuation">{</span> <span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span> <span class="token property">background-color</span><span class="token punctuation">:</span> #f6f6f6<span class="token punctuation">;</span> <span class="token property">position</span><span class="token punctuation">:</span> fixed<span class="token punctuation">;</span> <span class="token property">left</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span> <span class="token property">right</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span> <span class="token property">bottom</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span> <span class="token property">box-shadow</span><span class="token punctuation">:</span> 0 -1px 1px <span class="token function">rgba</span><span class="token punctuation">(</span>100<span class="token punctuation">,</span>100<span class="token punctuation">,</span>100<span class="token punctuation">,</span>.2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span> </code></pre> <ul> <li><code>TabBarItem.vue</code></li> </ul> <pre><code class="prism language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>template</span><span class="token punctuation">></span></span> <span class="token comment"><!--所有的item都展示同一个图片, 同一个文字--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>tab-bar-item<span class="token punctuation">"</span></span> <span class="token attr-name">@click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>itemClick<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">v-if</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>!isActive<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>slot</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-icon<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>slot</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">v-else</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>slot</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-icon-active<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>slot</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">:style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>activeStyle<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>slot</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-text<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>slot</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">"TabBarItem"</span><span class="token punctuation">,</span> props<span class="token operator">:</span> <span class="token punctuation">{</span> path<span class="token operator">:</span> String<span class="token punctuation">,</span> activeColor<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> String<span class="token punctuation">,</span> <span class="token keyword">default</span><span class="token operator">:</span> <span class="token string">'red'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> <span class="token comment">// isActive: true</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> computed<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">isActive</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// /home -> item1(/home) = true</span> <span class="token comment">// /home -> item1(/category) = false</span> <span class="token comment">// /home -> item1(/cart) = true</span> <span class="token comment">// /home -> item1(/profile) = true</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$route<span class="token punctuation">.</span>path<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>path<span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">activeStyle</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>isActive <span class="token operator">?</span> <span class="token punctuation">{</span>color<span class="token operator">:</span> <span class="token keyword">this</span><span class="token punctuation">.</span>activeColor<span class="token punctuation">}</span> <span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> methods<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">itemClick</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$router<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>path<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span> <span class="token attr-name">scoped</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"> <span class="token selector">.tab-bar-item</span> <span class="token punctuation">{</span> <span class="token property">flex</span><span class="token punctuation">:</span> 1<span class="token punctuation">;</span> <span class="token property">text-align</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span> <span class="token property">height</span><span class="token punctuation">:</span> 49px<span class="token punctuation">;</span> <span class="token property">font-size</span><span class="token punctuation">:</span> 14px<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token selector">.tab-bar-item img</span> <span class="token punctuation">{</span> <span class="token property">width</span><span class="token punctuation">:</span> 24px<span class="token punctuation">;</span> <span class="token property">height</span><span class="token punctuation">:</span> 24px<span class="token punctuation">;</span> <span class="token property">margin-top</span><span class="token punctuation">:</span> 3px<span class="token punctuation">;</span> <span class="token property">vertical-align</span><span class="token punctuation">:</span> middle<span class="token punctuation">;</span> <span class="token property">margin-bottom</span><span class="token punctuation">:</span> 2px<span class="token punctuation">;</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span> </code></pre> <ul> <li><code>MainTabBar.vue</code></li> </ul> <pre><code class="prism language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tab-bar</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tab-bar-item</span> <span class="token attr-name">path</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/home<span class="token punctuation">"</span></span> <span class="token attr-name">activeColor</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>pink<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">slot</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-icon<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>~assets/img/tabbar/home.svg<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">slot</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-icon-active<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>~assets/img/tabbar/home_active.svg<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">slot</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-text<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>首页<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tab-bar-item</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tab-bar-item</span> <span class="token attr-name">path</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/category<span class="token punctuation">"</span></span> <span class="token attr-name">activeColor</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>pink<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">slot</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-icon<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>../../assets/img/tabbar/category.svg<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">slot</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-icon-active<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>../../assets/img/tabbar/category_active.svg<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">slot</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-text<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>分类<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tab-bar-item</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tab-bar-item</span> <span class="token attr-name">path</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/cart<span class="token punctuation">"</span></span> <span class="token attr-name">activeColor</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>pink<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">slot</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-icon<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>../../assets/img/tabbar/shopcart.svg<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">slot</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-icon-active<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>../../assets/img/tabbar/shopcart_active.svg<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">slot</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-text<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>购物车<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tab-bar-item</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tab-bar-item</span> <span class="token attr-name">path</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/profile<span class="token punctuation">"</span></span> <span class="token attr-name">activeColor</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>deepPink<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">slot</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-icon<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>../../assets/img/tabbar/profile.svg<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">slot</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-icon-active<span class="token punctuation">"</span></span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>../../assets/img/tabbar/profile_active.svg<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">slot</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>item-text<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>我的<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tab-bar-item</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tab-bar</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">import</span> TabBar <span class="token keyword">from</span> <span class="token string">'components/tabbar/TabBar'</span> <span class="token keyword">import</span> TabBarItem <span class="token keyword">from</span> <span class="token string">'components/tabbar/TabBarItem'</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">"MainTabBar"</span><span class="token punctuation">,</span> components<span class="token operator">:</span> <span class="token punctuation">{</span> TabBar<span class="token punctuation">,</span> TabBarItem <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>style</span> <span class="token attr-name">scoped</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css"> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>style</span><span class="token punctuation">></span></span> </code></pre> <h2>4. Vuex 详解</h2> <h4>4.1 认识 Vuex</h4> <h6>4.1.1 Vuex 作用</h6> <ul> <li><code>官方解释</code> <ul> <li><code>Vuex</code> 是一个专为 <code>Vue.js</code> 应用程序开发的<code>状态管理模式</code> <ul> <li>采用 <code>集中式存储管理</code> 应用的<code>所有组件的状态</code></li> <li>并以<code>相应的规则</code>保证状态以一种<code>可预测</code>的方式发生变化</li> </ul> </li> <li><code>Vuex</code> 也集成到 <code>Vue</code> 的官方调试工具 <code>devtools extension</code> <ul> <li>提供了诸如零配置的 <code>time-travel</code> 调试、<code>状态快照</code>导入导出等高级调试功能</li> </ul> </li> </ul> </li> <li><code>状态管理</code> <ul> <li>将其看成<code>把需要多个组件共享的变量全部存储在一个对象里面</code></li> <li>将这个对象放在顶层的<code>Vue</code>实例中,<code>让其他组件可以使用</code></li> <li><code>多个组件</code>就可以<code>共享</code>这个对象中的所有<code>变量属性</code></li> <li><code>Vuex</code>就是为了提供这样一个<code>在多个组件间共享状态</code>的插件</li> </ul> </li> </ul> <h6>4.1.2 管理什么状态</h6> <ul> <li><code>多个状态,在多个界面间的共享问题</code> <ul> <li>比如用户的<code>登录状态</code>、<code>用户名称</code>、<code>头像</code>、<code>地理位置信息</code>等等</li> <li>比如<code>商品的收藏</code>、<code>购物车中的物品</code>等等</li> <li>这些<code>状态信息</code>,都可以放在<code>统一</code>的地方,对它进行<code>保存和管理</code>,而且数据还是<code>响应式</code>的</li> </ul> </li> </ul> <h6>4.1.3 单界面的状态管理</h6> <ul> <li><code>State</code>:就是组件的<code>状态</code></li> <li><code>View</code>:<code>视图层</code>,可以针对<code>State</code>的变化,<code>显示不同的信息</code></li> <li><code>Actions</code>:这里的<code>Actions</code>主要是用户的各种<code>操作</code>:<code>点击、输入</code>等等,会导致<code>状态的改变</code><br> <img src="http://img.e-com-net.com/image/info8/f53ecb7458064d19bc67d0077f3d0654.jpg" alt="在这里插入图片描述" width="0" height="0"></li> </ul> <h6>4.1.4 单界面状态管理的实现</h6> <ul> <li><code>案例</code> <ul> <li><code>counter</code>需要某种方式被<code>记录</code>下来,也就是<code>State</code></li> <li><code>counter</code>目前的值需要被显示在界面中,也就是<code>View</code>部分</li> <li>界面发生某些<code>操作</code>时(用户的<code>点击</code>,也可以是用户的<code>input</code>),需要去<code>更新状态</code>,也就是<code>Actions</code></li> </ul> </li> </ul> <pre><code class="prism language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>test<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span><span class="token punctuation">></span></span>当前计数:{{counter}}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">@click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>counter+=1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>+1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">@click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>counter-=1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>-1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">'HelloWorld'</span><span class="token punctuation">,</span> <span class="token function">data</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> counter<span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> </code></pre> <h6>4.1.5 多界面状态管理</h6> <ul> <li><code>多个视图都依赖同一个状态</code> <ul> <li><code>一个状态改了,多个界面需要进行更新</code></li> <li><code>不同界面的 Actions 都想修改同一个状态</code> <ul> <li><code>Home.vue</code>需要修改,<code>Profile.vue</code>也需要修改这个状态</li> </ul> </li> </ul> </li> <li><code>如何理解</code> <ul> <li>对于某些状态<code>(状态1/状态2/状态3)</code>来说<code>只属于某一个视图</code> <ul> <li><code>状态1/状态2/状态3 自己管理自己用</code></li> </ul> </li> <li>但是也有一些状态<code>(状态a/状态b/状态c)</code>属于<code>多个视图共同想要维护</code>的 <ul> <li><code>状态a/状态b/状态c 统一管理</code></li> </ul> </li> <li><code>Vuex</code>就是提供<code>统一管理</code>的<code>工具</code></li> </ul> </li> </ul> <h6>4.1.6 全局单例模式</h6> <ul> <li><code>Vuex</code>基本思想 <ul> <li><code>将共享的状态抽取出来</code>,交给<code>Vuex</code>,<code>统一进行管理</code></li> <li><code>每个视图,按照规定好的规定,进行访问和修改等操作</code></li> </ul> </li> </ul> <h6>4.1.7 Vuex状态管理图例</h6> <ul> <li><code>Devtools 工具</code> <ul> <li><code>对组件变化状态进行跟踪</code></li> <li><code>通过 Devtools 知道哪个具体的组件改变了 State</code><br> <img src="http://img.e-com-net.com/image/info8/08668dd4828747f6812eed37f3a26753.jpg" alt="在这里插入图片描述" width="0" height="0"></li> </ul> </li> </ul> <h4>4.2 Vuex 基本使用</h4> <h6>4.2.1 简单的案例</h6> <ul> <li>创建一个文件夹<code>store</code></li> <li>在其中创建一个<code>index.js</code>文件</li> <li>在 <code>index.js</code> 中存放<code>Vuex</code>代码</li> </ul> <pre><code class="prism language-js"><span class="token keyword">import</span> Vuex <span class="token keyword">from</span> <span class="token string">'vuex'</span> <span class="token keyword">import</span> Vue <span class="token keyword">from</span> <span class="token string">'vue'</span> Vue<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span>Vuex<span class="token punctuation">)</span> <span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Vuex<span class="token punctuation">.</span>Store</span><span class="token punctuation">(</span><span class="token punctuation">{</span> state<span class="token operator">:</span> <span class="token punctuation">{</span> count<span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> mutations<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token parameter">state</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> state<span class="token punctuation">.</span>count<span class="token operator">++</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">decrement</span><span class="token punctuation">(</span><span class="token parameter">state</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> state<span class="token punctuation">.</span>count<span class="token operator">--</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <h6>4.2.2 挂载到 Vue 实例中</h6> <ul> <li><code>引入 Vuex</code> <ul> <li>在<code>main.js</code>文件,<code>导入store对象</code>,并且放在<code>new Vue</code>中</li> <li>在其他<code>Vue组件</code>中,就可以通过<code>this.$store</code>的方式,获取到这个<code>store对象</code></li> </ul> </li> <li><code>main.js</code></li> </ul> <pre><code class="prism language-js"><span class="token keyword">import</span> Vue <span class="token keyword">from</span> <span class="token string">'vue'</span> <span class="token keyword">import</span> App <span class="token keyword">from</span> <span class="token string">'./App'</span> <span class="token keyword">import</span> store <span class="token keyword">from</span> <span class="token string">'./store'</span> <span class="token keyword">new</span> <span class="token class-name">Vue</span><span class="token punctuation">(</span><span class="token punctuation">{</span> el<span class="token operator">:</span> <span class="token string">'#app'</span><span class="token punctuation">,</span> store<span class="token punctuation">,</span> <span class="token function-variable function">render</span><span class="token operator">:</span> <span class="token parameter">h</span> <span class="token operator">=></span> <span class="token function">h</span><span class="token punctuation">(</span>App<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <h6>4.2.3 使用 Vuex 的 count</h6> <pre><code class="prism language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>app<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>{{count}}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">@click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>increment<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>+1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">@click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>decrement<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>-1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">'App'</span><span class="token punctuation">,</span> components<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> computed<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function-variable function">count</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span>state<span class="token punctuation">.</span>count <span class="token comment">// 拿到 Vuex 中的 count</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> methods<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function-variable function">increment</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'increment'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function-variable function">decrement</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'decrement'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> </code></pre> <ul> <li>这就是使用<code>Vuex</code>最简单的方式了</li> <li>我们来对使用步骤,做一个简单的小节: <ol> <li>提取出一个公共的<code>store对象</code>,用于<code>保存</code>在多个组件中共享的<code>状态</code></li> <li>将<code>store对象</code>放置在<code>new Vue对象</code>中,这样可以保证在所有的组件中都可以使用到</li> <li>在其他组件中使用<code>store对象</code>中保存的状态即可 <ul> <li>通过<code>this.$store.state.属性</code>的方式来<code>访问</code>状态</li> <li>通过<code>this.$store.commit('mutation中方法')</code>来<code>修改</code>状态</li> </ul> </li> </ol> </li> <li>注意事项: <ul> <li>我们通过<code>提交mutation</code>的方式,而<code>非直接改变store.state.count</code></li> <li>这是因为<code>Vuex</code>可以更明确的追踪状态的变化,所以不要直接改变<code>store.state.count</code>的值</li> </ul> </li> </ul> <h2>5. Vuex核心概念</h2> <h4>1. state</h4> <h6>State单一状态树</h6> <ul> <li><code>Vuex</code>提出使用<code>单一状态树</code>, 什么是单一状态树呢? <ul> <li>英文名称是<code>Single Source of Truth</code>,也可以翻译成<code>单一数据源</code></li> </ul> </li> <li>但是,它是什么呢?我们来看一个生活中的例子 <ul> <li>我用一个生活中的例子做一个简单的<code>类比</code></li> <li>我们知道,在国内我们有很多的信息需要被<code>记录</code>,比如上学时的<code>个人档案</code>,工作后的<code>社保记录</code>,<code>公积金记录</code>,结婚后的<code>婚姻信息</code>,以及其他相关的<code>户口、医疗、文凭、房产记录</code>等等。</li> <li>这些信息被分散在很多地方进行管理,有一天需要办某个业务时(比如入户某个城市),你会发现你需要到各个对应的工作地点去打印、盖章各种资料信息,最后到一个地方提交证明你的信息无误。</li> <li>这种保存信息的方案,不仅仅<code>低效</code>,而且<code>不方便管理</code>,以及日后的维护也是一个庞大的工作(<code>需要大量的各个部门的人力来维护</code>,当然国家目前已经在完善我们的这个系统了)。</li> </ul> </li> <li>这个和我们在应用开发中比较类似: <ul> <li>如果你的状态信息是保存到多个<code>Store对象</code>中的,那么之后的<code>管理</code>和<code>维护</code>等等都会变得特别困难。</li> <li>所以<code>Vuex</code>也使用了<code>单一状态树</code>来<code>管理应用层级的全部状态</code></li> <li><code>单一状态树</code>能够让我们最<code>直接</code>的方式找到某个状态的片段,而且在之后的<code>维护</code>和<code>调试</code>过程中,也可以非常方便的<code>管理</code>和<code>维护</code></li> </ul> </li> </ul> <h4>2. Getters</h4> <h6>Getters基本使用</h6> <ul> <li>有时候,我们需要从<code>store</code>中获取一些<code>state变异后的状态</code>,比如下面的<code>Store</code>中: <ul> <li>获取学生年龄大于20的个数</li> </ul> </li> </ul> <pre><code class="prism language-js"><span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Vuex<span class="token punctuation">.</span>Store</span><span class="token punctuation">(</span><span class="token punctuation">{</span> state<span class="token operator">:</span> <span class="token punctuation">{</span> students<span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span>id<span class="token operator">:</span> <span class="token number">110</span><span class="token punctuation">,</span> name<span class="token operator">:</span> <span class="token string">'zs'</span><span class="token punctuation">,</span> age<span class="token operator">:</span> <span class="token number">18</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>id<span class="token operator">:</span> <span class="token number">111</span><span class="token punctuation">,</span> name<span class="token operator">:</span> <span class="token string">'ls'</span><span class="token punctuation">,</span> age<span class="token operator">:</span> <span class="token number">21</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>id<span class="token operator">:</span> <span class="token number">112</span><span class="token punctuation">,</span> name<span class="token operator">:</span> <span class="token string">'we'</span><span class="token punctuation">,</span> age<span class="token operator">:</span> <span class="token number">25</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>id<span class="token operator">:</span> <span class="token number">113</span><span class="token punctuation">,</span> name<span class="token operator">:</span> <span class="token string">'zx'</span><span class="token punctuation">,</span> age<span class="token operator">:</span> <span class="token number">30</span><span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <ul> <li>我们可以在<code>Store</code>中定义<code>getters</code></li> </ul> <pre><code class="prism language-js">computed<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">getGreaterAgesCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span>students<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span><span class="token parameter">age</span> <span class="token operator">=></span> age <span class="token operator">>=</span> <span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">.</span>length <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> getters<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function-variable function">greaterAgesCount</span><span class="token operator">:</span> <span class="token parameter">state</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> state<span class="token punctuation">.</span>students<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span><span class="token parameter">s</span> <span class="token operator">=></span> s<span class="token punctuation">.</span>age <span class="token operator">>=</span> <span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">.</span>length <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <h6>Getters作为参数和传递参数</h6> <ul> <li>如果我们已经有了一个获取所有年龄大于20岁学生列表的<code>getters</code>, 那么代码可以这样来写</li> </ul> <pre><code class="prism language-js">getters<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function-variable function">greaterAgesStus</span><span class="token operator">:</span> <span class="token parameter">state</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> state<span class="token punctuation">.</span>students<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span><span class="token parameter">s</span> <span class="token operator">=></span> s<span class="token punctuation">.</span>age <span class="token operator">>=</span> <span class="token number">20</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function-variable function">greaterAgesCount</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token parameter">state<span class="token punctuation">,</span>getters</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> getters<span class="token punctuation">.</span>greaterAgesStus<span class="token punctuation">.</span>length <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <ul> <li><code>getters</code>默认是不能传递参数的, 如果希望传递参数, 那么只能让<code>getters</code>本身返回另一个函数. <ul> <li>比如上面的案例中,我们希望根据<code>ID</code>获取用户的信息</li> </ul> </li> </ul> <pre><code class="prism language-js">getters<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function-variable function">stuByID</span><span class="token operator">:</span> <span class="token parameter">state</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token parameter">id</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> state<span class="token punctuation">.</span>students<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token parameter">s</span> <span class="token operator">=></span> s<span class="token punctuation">.</span>id <span class="token operator">===</span> id<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <h4>3. Mutation</h4> <h6>Mutation状态更新</h6> <ul> <li><code>Vuex</code>的<code>store状态</code>的更新唯一方式:<code>提交Mutation</code></li> <li><code>Mutation</code>主要包括两部分: <ul> <li><code>字符串的事件类型(type)</code></li> <li><code>一个回调函数(handler)</code>,该回调函数的第一个参数就是<code>state</code></li> </ul> </li> <li><code>mutation</code>的定义方式:</li> </ul> <pre><code class="prism language-js">mutations<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token parameter">state</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> state<span class="token punctuation">.</span>count<span class="token operator">++</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <ul> <li>通过<code>mutation更新</code></li> </ul> <pre><code class="prism language-js"><span class="token function-variable function">increment</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'increment'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <h6>Mutation传递参数</h6> <ul> <li>在通过<code>mutation</code>更新数据的时候, 有可能我们希望携带一些额外的参数 <ul> <li>参数被称为是<code>mutation的载荷(Payload)</code></li> </ul> </li> <li><code>Mutation</code>中的代码:</li> </ul> <pre><code class="prism language-js"><span class="token function">decrement</span><span class="token punctuation">(</span><span class="token parameter">state<span class="token punctuation">,</span>n</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> state<span class="token punctuation">.</span>count <span class="token operator">-=</span> n <span class="token punctuation">}</span> </code></pre> <pre><code class="prism language-js"><span class="token function-variable function">decrement</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'decrement'</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <ul> <li>但是如果参数不是一个呢? <ul> <li>比如我们有很多参数需要传递.</li> <li>这个时候, 我们通常会<code>以对象的形式传递</code>, 也就是<code>payload</code>是一个<code>对象</code></li> <li>这个时候可以再从对象中取出相关的信息</li> </ul> </li> </ul> <pre><code class="prism language-js"><span class="token function">changeCount</span><span class="token punctuation">(</span><span class="token parameter">state<span class="token punctuation">,</span>payload</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> state<span class="token punctuation">.</span>count <span class="token operator">=</span> payload<span class="token punctuation">.</span>count <span class="token punctuation">}</span> </code></pre> <pre><code class="prism language-js"><span class="token function-variable function">changeCount</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'changeCount'</span><span class="token punctuation">,</span><span class="token punctuation">{</span>count<span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <h6>Mutation提交风格</h6> <ul> <li>上面的通过<code>commit</code>进行提交是一种普通的方式</li> <li><code>Vue</code>还提供了另外一种风格, 它是一个包含<code>type</code>属性的对象</li> </ul> <pre><code class="prism language-js"><span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token punctuation">{</span> type<span class="token operator">:</span> <span class="token string">'changeCount'</span><span class="token punctuation">,</span> count<span class="token operator">:</span> <span class="token number">100</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <ul> <li><code>Mutation</code>中的处理方式是将整个<code>commit</code>的对象作为<code>payload</code>使用, 所以代码没有改变, 依然如下:</li> </ul> <pre><code class="prism language-js"><span class="token function">changeCount</span><span class="token punctuation">(</span><span class="token parameter">state<span class="token punctuation">,</span>payload</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> state<span class="token punctuation">.</span>count <span class="token operator">=</span> payload<span class="token punctuation">.</span>count <span class="token punctuation">}</span> </code></pre> <h6>Mutation响应规则</h6> <ul> <li><code>Vuex</code>的<code>store</code>中的<code>state</code>是<code>响应式</code>的, 当<code>state</code>中的数据发生改变时, <code>Vue</code>组件会<code>自动更新</code></li> <li>这就要求我们必须遵守一些<code>Vuex</code>对应的规则: <ul> <li>提前在<code>store</code>中初始化好所需的属性.</li> <li>当给<code>state</code>中的对象添加新属性时, 使用下面的方式: <ul> <li>方式一: 使用<code>Vue.set(obj, 'newProp', 123)</code></li> <li>方式二: 用新对象给旧对象<code>重新赋值</code></li> </ul> </li> </ul> </li> <li>我们来看一个例子: <ul> <li>当我们<code>点击更新信息</code>时, 界面并没有发生对应改变.</li> </ul> </li> <li><code>App.vue</code></li> </ul> <pre><code class="prism language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>app<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>我的个人信息:{{info}}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">@click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>updateInfo<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>更新信息<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>template</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">'App'</span><span class="token punctuation">,</span> components<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> computed<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">info</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span>state<span class="token punctuation">.</span>info <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> methods<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">updateInfo</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'updateInfo'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>height<span class="token operator">:</span> <span class="token number">1.88</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> </code></pre> <ul> <li><code>Vuex</code></li> </ul> <pre><code class="prism language-js"><span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Vuex<span class="token punctuation">.</span>Store</span><span class="token punctuation">(</span><span class="token punctuation">{</span> state<span class="token operator">:</span> <span class="token punctuation">{</span> info<span class="token operator">:</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">'xxx'</span><span class="token punctuation">,</span> age<span class="token operator">:</span> <span class="token number">18</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> mutations<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">updateInfo</span><span class="token punctuation">(</span><span class="token parameter">state<span class="token punctuation">,</span>payload</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> state<span class="token punctuation">.</span>info<span class="token punctuation">[</span><span class="token string">'height'</span><span class="token punctuation">]</span> <span class="token operator">=</span> payload<span class="token punctuation">.</span>height <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <ul> <li>如何才能让它改变呢? <ul> <li>查看下面代码的方式一和方式二</li> <li>都可以让<code>state</code>中的属性是<code>响应式</code>的</li> </ul> </li> </ul> <pre><code class="prism language-js">mutations<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">updateInfo</span><span class="token punctuation">(</span><span class="token parameter">state<span class="token punctuation">,</span>payload</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// state.info['height'] = payload.height</span> <span class="token comment">// 方式一: Vue.set()</span> Vue<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>state<span class="token punctuation">.</span>info<span class="token punctuation">,</span> <span class="token string">'height'</span><span class="token punctuation">,</span> payload<span class="token punctuation">.</span>height<span class="token punctuation">)</span> <span class="token comment">// 方式二: 给 info 赋值一个新的对象</span> state<span class="token punctuation">.</span>info <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token operator">...</span>state<span class="token punctuation">.</span>info<span class="token punctuation">,</span> <span class="token string">'height'</span><span class="token operator">:</span> payload<span class="token punctuation">.</span>height<span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <h6>Mutation常量类型 – 概念</h6> <ul> <li>我们来考虑下面的问题: <ul> <li>在<code>mutation</code>中, 我们定义了很多事件类型(也就是其中的方法名称).</li> <li>当我们的项目增大时, <code>Vuex</code>管理的状态越来越多, 需要更新状态的情况越来越多, 那么意味着<code>Mutation</code>中的方法越来越多.</li> <li>方法过多, 使用者需要花费大量的经历去记住这些方法, 甚至是多个文件间来回切换, 查看方法名称, 甚至如果不是复制的时候, 可能还会出现写错的情况.</li> </ul> </li> <li>如何避免上述的问题呢? <ul> <li>在各种<code>Flux</code>实现中, 一种很常见的方案就是<code>使用常量替代Mutation事件</code>的类型.</li> <li>我们可以将这些常量放在一个单独的文件中, 方便管理以及让整个<code>app</code>所有的事件类型一目了然.</li> </ul> </li> <li>具体怎么做呢? <ul> <li>我们可以创建一个文件: <code>mutation-types.js</code>, 并且在其中定义我们的常量.</li> <li>定义常量时, 我们可以使用<code>ES2015</code>中的风格, 使用一个常量来作为函数的名称.</li> </ul> </li> </ul> <h6>Mutation常量类型 – 代码</h6> <ul> <li><code>mutation-types.js</code></li> </ul> <pre><code class="prism language-js"><span class="token keyword">export</span> <span class="token keyword">const</span> <span class="token constant">UPDATE_INFO</span> <span class="token operator">=</span> <span class="token string">'UPDATE_INFO'</span> </code></pre> <ul> <li><code>index.js</code></li> </ul> <pre><code class="prism language-js"><span class="token keyword">import</span> Vuex <span class="token keyword">from</span> <span class="token string">'vuex'</span> <span class="token keyword">import</span> Vue <span class="token keyword">from</span> <span class="token string">'vue'</span> <span class="token keyword">import</span> <span class="token operator">*</span> <span class="token keyword">as</span> types <span class="token keyword">from</span> <span class="token string">'./mutation-types'</span> Vue<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span>Vuex<span class="token punctuation">)</span> <span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Vuex<span class="token punctuation">.</span>Store</span><span class="token punctuation">(</span><span class="token punctuation">{</span> state<span class="token operator">:</span> <span class="token punctuation">{</span> info<span class="token operator">:</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">'xxx'</span><span class="token punctuation">,</span> age<span class="token operator">:</span> <span class="token number">18</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> mutations<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token punctuation">[</span>types<span class="token punctuation">.</span><span class="token constant">UPDATE_INFO</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token parameter">state<span class="token punctuation">,</span> payload</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> state<span class="token punctuation">.</span>info <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token operator">...</span>state<span class="token punctuation">.</span>info<span class="token punctuation">,</span> <span class="token string">'height'</span><span class="token operator">:</span> payload<span class="token punctuation">.</span>height<span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token keyword">export</span> <span class="token keyword">default</span> store </code></pre> <ul> <li><code>App.vue</code></li> </ul> <pre><code class="prism language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">import</span> <span class="token punctuation">{</span><span class="token constant">UPDATE_INFO</span><span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"./store/mutation-types"</span><span class="token punctuation">;</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">'App'</span><span class="token punctuation">,</span> components<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> computed<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">info</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span>state<span class="token punctuation">.</span>info <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> methods<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">updateInfo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token constant">UPDATE_INFO</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>height<span class="token operator">:</span> <span class="token number">1.88</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> </code></pre> <h6>Mutation同步函数</h6> <ul> <li>通常情况下, <code>Vuex</code>要求我们<code>Mutation</code>中的方法必须是<code>同步方法</code> <ul> <li>主要的原因是当我们使用<code>devtools</code>时, 可以<code>devtools</code>可以帮助我们捕捉<code>mutation</code>的快照.</li> <li>但是如果是<code>异步操作</code>, 那么<code>devtools</code>将不能很好的追踪这个操作什么时候会被完成.</li> </ul> </li> <li>比如我们之前的代码, 当执行更新时, <code>devtools</code>中会有如下信息:<br> <img src="http://img.e-com-net.com/image/info8/74e26bc613d1492ba7952fb1ad725e84.jpg" alt="在这里插入图片描述" width="0" height="0"></li> <li>但是, 如果<code>Vuex</code>中的代码, 我们使用了<code>异步函数</code>:</li> </ul> <pre><code class="prism language-js">mutations<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token punctuation">[</span>types<span class="token punctuation">.</span><span class="token constant">UPDATE_INFO</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token parameter">state<span class="token punctuation">,</span>payload</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> state<span class="token punctuation">.</span>info <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token operator">...</span>state<span class="token punctuation">.</span>info<span class="token punctuation">,</span> <span class="token string">'height'</span><span class="token operator">:</span> payload<span class="token punctuation">.</span>height<span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token number">10000</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p><img src="http://img.e-com-net.com/image/info8/0d81ca882c574a05b098ebf566663797.jpg" alt="在这里插入图片描述" width="0" height="0"></p> <h4>4. Action</h4> <h6>Action基本定义</h6> <ul> <li>我们强调, 不要再<code>Mutation</code>中进行<code>异步操作</code> <ul> <li>但是某些情况, 我们确实希望在<code>Vuex</code>中进行一些<code>异步操作</code>, 比如<code>网络请求</code>, 必然是异步的. 这个时候怎么处理呢?</li> <li><code>Action</code>类似于<code>Mutation</code>, 但是是用来代替<code>Mutation</code>进行<code>异步操作</code>的</li> </ul> </li> <li><code>Action</code>的基本使用代码如下:</li> <li><code>context</code>是什么? <ul> <li><code>context</code>是和<code>store对象</code>具有相同方法和属性的对象.</li> <li>也就是说, 我们可以通过<code>context</code>去进行<code>commit</code>相关的操作, 也可以获取<code>context.state</code>等.</li> <li>但是注意, 这里它们并不是同一个对象</li> </ul> </li> <li>这样的代码是否多此一举呢? <ul> <li>事实上并不是这样, 如果在<code>Vuex</code>中有<code>异步操作</code>, 那么我们就可以在<code>actions</code>中完成了</li> </ul> </li> </ul> <pre><code class="prism language-js"><span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Vuex<span class="token punctuation">.</span>Store</span><span class="token punctuation">(</span><span class="token punctuation">{</span> state<span class="token operator">:</span> <span class="token punctuation">{</span> count<span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> mutations<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token parameter">state</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> state<span class="token punctuation">.</span>count<span class="token operator">++</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> actions<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token parameter">context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> context<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'increment'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <h6>Action的分发</h6> <ul> <li>在<code>Vue</code>组件中, 如果我们调用<code>action</code>中的方法, 那么就需要使用<code>dispatch</code></li> </ul> <pre><code class="prism language-js">methods<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token string">'increment'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <ul> <li>同样的, 也是<code>支持传递payload</code></li> </ul> <pre><code class="prism language-js">methods<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token string">'increment'</span><span class="token punctuation">,</span><span class="token punctuation">{</span>cCount<span class="token operator">:</span> <span class="token number">5</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <pre><code class="prism language-js">mutations<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token parameter">state<span class="token punctuation">,</span>payload</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> state<span class="token punctuation">.</span>count <span class="token operator">+=</span> payload<span class="token punctuation">.</span>cCount <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> actions<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token parameter">context<span class="token punctuation">,</span>payload</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> context<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'increment'</span><span class="token punctuation">,</span>payload<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token number">5000</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <h6>Action返回的Promise</h6> <ul> <li>学习<code>ES6</code>语法的时候, <code>Promise</code>经常用于<code>异步操作</code> <ul> <li>在<code>Action</code>中, 我们可以将<code>异步操作</code>放在一个<code>Promise</code>中, 并且在成功或者失败后, 调用对应的<code>resolve</code>或<code>reject</code></li> </ul> </li> <li>来看下面的代码:</li> </ul> <pre><code class="prism language-js">actions<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token parameter">context</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">resolve</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> context<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'increment'</span><span class="token punctuation">)</span> <span class="token function">resolve</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token number">1000</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <pre><code class="prism language-js">methods<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">dispatch</span><span class="token punctuation">(</span><span class="token string">'increment'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">res</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'完成了更新操作'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <h4>5. Module</h4> <h6>认识Vuex的Module</h6> <ul> <li><code>Module</code>是模块的意思, 为什么在<code>Vuex</code>中我们要使用模块呢? <ul> <li><code>Vue</code>使用<code>单一状态树</code>,那么也意味着很多状态都会交给<code>Vuex</code>来管理.</li> <li>当应用变得非常复杂时,<code>store对象</code>就有可能变得相当臃肿.</li> <li>为了解决这个问题, <code>Vuex</code>允许我们将<code>store</code>分割成<code>模块(Module)</code>, 而每个模块拥有自己的<code>state</code>、<code>mutations</code>、<code>actions</code>、<code>getters</code>等</li> </ul> </li> <li>我们按照什么样的方式来组织模块呢?</li> </ul> <pre><code class="prism language-js"><span class="token keyword">const</span> moduleA <span class="token operator">=</span> <span class="token punctuation">{</span> state<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> mutations<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> actions<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> getters<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> moduleB <span class="token operator">=</span> <span class="token punctuation">{</span> state<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> mutations<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> actions<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Vuex<span class="token punctuation">.</span>Store</span><span class="token punctuation">(</span><span class="token punctuation">{</span> modules<span class="token operator">:</span> <span class="token punctuation">{</span> a<span class="token operator">:</span> moduleA<span class="token punctuation">,</span> b<span class="token operator">:</span> moduleB <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> store<span class="token punctuation">.</span>state<span class="token punctuation">.</span>a <span class="token comment">// -> moduleA 的状态</span> store<span class="token punctuation">.</span>state<span class="token punctuation">.</span>b <span class="token comment">// -> moduleB 的状态</span> </code></pre> <h6>Module的局部状态</h6> <ul> <li>上面的代码中, 我们已经有了整体的组织结构, 下面我们来看看具体的局部模块中的代码如何书写. <ul> <li>我们在<code>moduleA</code>中添加<code>state</code>、<code>mutations</code>、<code>getters</code></li> <li><code>mutation</code>和<code>getters</code>接收的第一个参数是<code>局部状态</code>对象</li> </ul> </li> </ul> <pre><code class="prism language-js"><span class="token keyword">const</span> moduleA <span class="token operator">=</span> <span class="token punctuation">{</span> state<span class="token operator">:</span> <span class="token punctuation">{</span> count<span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> mutations<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token parameter">state</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> state<span class="token punctuation">.</span>count<span class="token operator">++</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> getters<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">doubleCount</span><span class="token punctuation">(</span><span class="token parameter">state</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> state<span class="token punctuation">.</span>count <span class="token operator">*</span> <span class="token number">2</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> moduleB <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Vuex<span class="token punctuation">.</span>Store</span><span class="token punctuation">(</span><span class="token punctuation">{</span> state<span class="token operator">:</span> <span class="token punctuation">{</span> gCount<span class="token operator">:</span> <span class="token number">111</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> modules<span class="token operator">:</span> <span class="token punctuation">{</span> a<span class="token operator">:</span> moduleA<span class="token punctuation">,</span> b<span class="token operator">:</span> moduleB <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token keyword">export</span> <span class="token keyword">default</span> store<span class="token punctuation">;</span> </code></pre> <pre><code class="prism language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">'App'</span><span class="token punctuation">,</span> components<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> computed<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">count</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span>getters<span class="token punctuation">.</span>doubleCount <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> methods<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$store<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'increment'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> </code></pre> <ul> <li>注意: <ul> <li>虽然, 我们的<code>doubleCount</code>和<code>increment</code>都是定义在<code>对象内部</code>的</li> <li>但是在调用的时候, 依然是通过<code>this.$store</code>来直接调用的</li> </ul> </li> </ul> <h6>Module的Actions写法</h6> <ul> <li><code>actions</code>的写法呢? 接收一个<code>context参数对象</code> <ul> <li><code>局部状态</code>通过 <code>context.state</code> 暴露出来,<code>根节点状态</code>则为 <code>context.rootState</code></li> </ul> </li> </ul> <pre><code class="prism language-js"><span class="token keyword">const</span> moduleA <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> actions<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">incrementIfOddOnRootSum</span> <span class="token punctuation">(</span><span class="token parameter"><span class="token punctuation">{</span> state<span class="token punctuation">,</span>commit<span class="token punctuation">,</span>rootState <span class="token punctuation">}</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>state<span class="token punctuation">.</span>count <span class="token operator">+</span> rootState<span class="token punctuation">.</span>count<span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">===</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'increment'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <ul> <li>如果<code>getters</code>中也需要使用全局的状态, 可以接受更多的参数</li> </ul> <pre><code class="prism language-js"><span class="token keyword">const</span> moduleA <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> getters<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token function">sumWithRootCount</span> <span class="token punctuation">(</span><span class="token parameter">state<span class="token punctuation">,</span>getters<span class="token punctuation">,</span>rootState</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> state<span class="token punctuation">.</span>count <span class="token operator">+</span> rootState<span class="token punctuation">.</span>count <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <h2>5. 网络模块封装</h2> <h4>1. 网络模块的选择</h4> <p><strong><code>Vue</code>中发送网络请求有非常多的方式, 那么, 在开发中, 如何选择呢?</strong></p> <h6>1. 选择 <code>Ajax</code></h6> <ul> <li>传统的<code>Ajax</code>是基于<code>XMLHttpRequest(XHR)</code></li> <li>为什么不用它呢? <ul> <li>非常好解释, <code>配置</code>和<code>调用方式</code>等非常混乱.</li> <li>编码起来看起来就非常蛋疼.</li> <li>所以真实开发中很少直接使用, 而是使用<code>jQuery-Ajax</code></li> </ul> </li> </ul> <h6>2. 选择 <code>jQuery-Ajax</code></h6> <ul> <li>在前面的学习中, 我们经常会使用<code>jQuery-Ajax</code>,相对于传统的<code>Ajax</code>非常好用.</li> <li>为什么不用它呢? <ul> <li>首先, 我们先明确一点: 在<code>Vue</code>的整个开发中都是不需要使用<code>jQuery</code>了.</li> <li>那么, 就意味着为了方便我们进行一个网络请求, 特意引用一个<code>jQuery</code>, 你觉得合理吗?</li> <li><code>jQuery</code>的代码1w+行.</li> <li><code>Vue</code>的代码才1w+行.</li> <li>完全没有必要为了用<code>网络请求</code>就引用这个<code>重量级</code>的框架.</li> </ul> </li> </ul> <h6>3. 选择 <code>Vue-resource</code></h6> <ul> <li>官方在<code>Vue1.x</code>的时候, 推出了<code>Vue-resource</code>. <ul> <li><code>Vue-resource</code>的体积相对于<code>jQuery</code>小很多.</li> <li>另外<code>Vue-resource</code>是官方推出的.</li> </ul> </li> <li>为什么不选择它呢? <ul> <li>在<code>Vue2.0</code>退出后, <code>Vue</code>作者就在<code>GitHub</code>的<code>Issues</code>中说明了去掉<code>vue-resource</code>, 并且以后也<code>不会再更新</code>.</li> <li>那么意味着以后<code>vue-reource</code>不再支持新的版本时, 也不会再继续<code>更新</code>和<code>维护</code>.</li> <li>对以后的项目开发和维护都存在很大的<code>隐患</code>.</li> </ul> </li> </ul> <h6>4. 选择 <code>axios</code></h6> <ul> <li>在说明不再继续更新和维护<code>vue-resource</code>的同时, 作者还推荐了一个框架: <code>axios</code></li> <li><code>axios</code>有非常多的优点, 并且用起来也非常方便.</li> </ul> <h4>2. jsonp的封装</h4> <h6>jsonp</h6> <ul> <li>在前端开发中, 我们一种常见的<code>网络请求</code>方式就是<code>JSONP</code> <ul> <li>使用<code>JSONP</code>最主要的原因往往是为了<code>解决跨域访问</code>的问题.</li> </ul> </li> <li><code>JSONP</code>的原理是什么呢? <ul> <li><code>JSONP</code>的核心在于通过<code><script>标签</code>的<code>src</code>来帮助我们<code>请求数据</code>.</li> <li>原因是我们的项目部署在<code>domain1.com</code>服务器上时, 是不能直接访问<code>domain2.com</code>服务器上的资料的.</li> <li>这个时候, 我们利用<code><script>标签</code>的<code>src</code>帮助我们去服务器请求到数据, 将数据当做一个<code>javascript</code>的函数来执行, 并且执行的过程中传入我们需要的<code>json</code>.</li> <li>所以, <code>封装jsonp</code>的核心就在于我们<code>监听window上的jsonp</code>进行<code>回调</code>时的名称.</li> </ul> </li> </ul> <p><img src="http://img.e-com-net.com/image/info8/e9419348dc034619aa717b1f03e622fa.jpg" alt="在这里插入图片描述" width="0" height="0"></p> <h6>JSONP封装</h6> <pre><code class="prism language-js"><span class="token keyword">let</span> count <span class="token operator">=</span> <span class="token number">1</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">originPJSONP</span><span class="token punctuation">(</span><span class="token parameter">option</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 1. 从传入的option中提取URL</span> <span class="token keyword">const</span> url <span class="token operator">=</span> option<span class="token punctuation">.</span>url <span class="token comment">// 2. 在body中添加script标签</span> <span class="token keyword">const</span> body <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementsByTagName</span><span class="token punctuation">(</span><span class="token string">'body'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token keyword">const</span> script <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'script'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 3. 内部生产一个不重复的callback</span> <span class="token keyword">const</span> callback <span class="token operator">=</span> <span class="token string">'jsonp'</span> <span class="token operator">+</span> count<span class="token operator">++</span> <span class="token comment">// 4. 监听window上的jsonp的调用</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">resolve<span class="token punctuation">,</span>reject</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> window<span class="token punctuation">[</span>callback<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">result</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> body<span class="token punctuation">.</span><span class="token function">removeChild</span><span class="token punctuation">(</span>script<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">resolve</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> params <span class="token operator">=</span> <span class="token function">handleParam</span><span class="token punctuation">(</span>option<span class="token punctuation">.</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span> script<span class="token punctuation">.</span>src <span class="token operator">=</span> url <span class="token operator">+</span> <span class="token string">'?callback='</span> <span class="token operator">+</span> callback <span class="token operator">+</span> params<span class="token punctuation">;</span> body<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>script<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span> body<span class="token punctuation">.</span><span class="token function">removeChild</span><span class="token punctuation">(</span>script<span class="token punctuation">)</span> <span class="token function">reject</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <pre><code class="prism language-js"><span class="token keyword">function</span> <span class="token function">handleParam</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> url <span class="token operator">=</span> <span class="token string">''</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> key <span class="token keyword">in</span> data<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> value <span class="token operator">=</span> data<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token operator">!==</span> <span class="token keyword">undefined</span> <span class="token operator">?</span> data<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token operator">:</span> <span class="token string">''</span> url <span class="token operator">+=</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">&</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>key<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">=</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span><span class="token function">encodeURIComponent</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">`</span></span> <span class="token punctuation">}</span> <span class="token keyword">return</span> url <span class="token punctuation">}</span> </code></pre> <h4>3. axios的使用</h4> <h6>1. 认识 <code>axios</code></h6> <ul> <li> <p>为什么选择<code>axios</code></p> <ul> <li>功能特点: <ul> <li>在浏览器中发送 <code>XMLHttpRequests</code> 请求</li> <li>在 <code>node.js</code> 中发送 http请求</li> <li>支持 <code>Promise API</code></li> <li><code>拦截请求和响应</code></li> <li><code>转换请求和响应数据</code></li> <li>等等</li> </ul> </li> </ul> </li> <li> <p><code>axios</code>请求方式</p> <ul> <li>支持多种请求方式:</li> </ul> </li> </ul> <pre><code class="prism language-js"><span class="token function">axios</span><span class="token punctuation">(</span>config<span class="token punctuation">)</span> axios<span class="token punctuation">.</span><span class="token function">request</span><span class="token punctuation">(</span>config<span class="token punctuation">)</span> axios<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>url<span class="token punctuation">[</span><span class="token punctuation">,</span> config<span class="token punctuation">]</span><span class="token punctuation">)</span> axios<span class="token punctuation">.</span><span class="token function">delete</span><span class="token punctuation">(</span>url<span class="token punctuation">[</span><span class="token punctuation">,</span> config<span class="token punctuation">]</span><span class="token punctuation">)</span> axios<span class="token punctuation">.</span><span class="token function">head</span><span class="token punctuation">(</span>url<span class="token punctuation">[</span><span class="token punctuation">,</span> config<span class="token punctuation">]</span><span class="token punctuation">)</span> axios<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span>url<span class="token punctuation">[</span><span class="token punctuation">,</span> data<span class="token punctuation">[</span><span class="token punctuation">,</span> config<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span> axios<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>url<span class="token punctuation">[</span><span class="token punctuation">,</span> data<span class="token punctuation">[</span><span class="token punctuation">,</span> config<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span> axios<span class="token punctuation">.</span><span class="token function">patch</span><span class="token punctuation">(</span>url<span class="token punctuation">[</span><span class="token punctuation">,</span> data<span class="token punctuation">[</span><span class="token punctuation">,</span> config<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span> </code></pre> <h6>2. 发送基本请求</h6> <ul> <li>发送<code>get</code>请求演示</li> </ul> <pre><code class="prism language-js"><span class="token keyword">import</span> axios <span class="token keyword">from</span> <span class="token string">'axios'</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">'app'</span><span class="token punctuation">,</span> <span class="token function">created</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 提问:为什么这里没有跨域的问题</span> <span class="token comment">// 1. 没有请求参数</span> axios<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'接口地址'</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">res</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">catch</span><span class="token punctuation">(</span><span class="token parameter">err</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token comment">// 2. 有请求参数</span> axios<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'接口地址'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>params<span class="token operator">:</span> <span class="token punctuation">{</span>type<span class="token operator">:</span> <span class="token string">'sell'</span><span class="token punctuation">,</span> page<span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">res</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">catch</span><span class="token punctuation">(</span><span class="token parameter">err</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <ul> <li>发送<code>并发请求</code>演示 <ul> <li>有时候, 我们可能需求同时发送<code>两个请求</code> <ul> <li>使用<code>axios.all</code>, 可以放入<code>多个请求</code>的<code>数组</code>.</li> <li><code>axios.all([])</code> 返回的结果是一个数组,使用 <code>axios.spread</code> 可将数组 <code>[res1,res2]</code> 展开为 <code>res1, res2</code></li> </ul> </li> </ul> </li> </ul> <pre><code class="prism language-js"><span class="token keyword">import</span> axios <span class="token keyword">from</span> <span class="token string">'axios'</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span> name<span class="token operator">:</span> <span class="token string">'app'</span><span class="token punctuation">,</span> <span class="token function">created</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 发送并发请求</span> axios<span class="token punctuation">.</span><span class="token function">all</span><span class="token punctuation">(</span><span class="token punctuation">[</span>axios<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'接口地址'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> axios<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'接口地址'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>params<span class="token operator">:</span> <span class="token punctuation">{</span>type<span class="token operator">:</span> <span class="token string">'sell'</span><span class="token punctuation">,</span> page<span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span>axios<span class="token punctuation">.</span><span class="token function">spread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">res1<span class="token punctuation">,</span> res2</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res1<span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <ul> <li><code>全局配置</code> <ul> <li>在上面的示例中, 我们的<code>BaseURL</code>是<code>固定</code>的 <ul> <li>事实上, 在开发中可能很多参数都是<code>固定</code>的.</li> <li>这个时候我们可以进行一些抽取, 也可以利用<code>axios</code>的<code>全局配置</code></li> </ul> </li> </ul> </li> </ul> <pre><code class="prism language-js">axios<span class="token punctuation">.</span>defaults<span class="token punctuation">.</span>baseURL <span class="token operator">=</span> ‘<span class="token number">123.207</span><span class="token number">.32</span><span class="token number">.32</span><span class="token operator">:</span><span class="token number">8000</span>’ axios<span class="token punctuation">.</span>defaults<span class="token punctuation">.</span>headers<span class="token punctuation">.</span>post<span class="token punctuation">[</span>‘Content<span class="token operator">-</span>Type’<span class="token punctuation">]</span> <span class="token operator">=</span> ‘application<span class="token operator">/</span>x<span class="token operator">-</span>www<span class="token operator">-</span>form<span class="token operator">-</span>urlencoded’<span class="token punctuation">;</span> </code></pre> <pre><code class="prism language-js"><span class="token function">created</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 提取全局的配置</span> axios<span class="token punctuation">.</span>defaults<span class="token punctuation">.</span>baseURL <span class="token operator">=</span> <span class="token string">'接口地址'</span> <span class="token comment">// 发送并发请求</span> axios<span class="token punctuation">.</span><span class="token function">all</span><span class="token punctuation">(</span><span class="token punctuation">[</span>axios<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/category'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> axios<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/home/data'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>params<span class="token operator">:</span> <span class="token punctuation">{</span>type<span class="token operator">:</span> <span class="token string">'sell'</span><span class="token punctuation">,</span> page<span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span>axios<span class="token punctuation">.</span><span class="token function">spread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">res1<span class="token punctuation">,</span> res2</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res1<span class="token punctuation">)</span><span class="token punctuation">;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <ul> <li><code>常见的配置选项</code></li> </ul> <pre><code class="prism language-js">## 请求地址 url<span class="token operator">:</span> <span class="token string">'/user'</span><span class="token punctuation">,</span> ## 请求类型 method<span class="token operator">:</span> <span class="token string">'get'</span><span class="token punctuation">,</span> ## 请根路径 baseURL<span class="token operator">:</span> <span class="token string">'http://www.mt.com/api'</span><span class="token punctuation">,</span> ## 请求前的数据处理 transformRequest<span class="token operator">:</span><span class="token punctuation">[</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">,</span> ## 请求后的数据处理 transformResponse<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">data</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">,</span> ## 自定义的请求头 headers<span class="token operator">:</span><span class="token punctuation">{</span><span class="token string">'x-Requested-With'</span><span class="token operator">:</span><span class="token string">'XMLHttpRequest'</span><span class="token punctuation">}</span><span class="token punctuation">,</span> ## <span class="token constant">URL</span>查询对象 params<span class="token operator">:</span><span class="token punctuation">{</span> id<span class="token operator">:</span> <span class="token number">12</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> ## 查询对象序列化函数 <span class="token function-variable function">paramsSerializer</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">params</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token punctuation">}</span> ## request body data<span class="token operator">:</span> <span class="token punctuation">{</span> key<span class="token operator">:</span> <span class="token string">'aa'</span><span class="token punctuation">}</span><span class="token punctuation">,</span> ## 超时设置s timeout<span class="token operator">:</span> <span class="token number">1000</span><span class="token punctuation">,</span> ## 跨域是否带Token withCredentials<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> ## 自定义请求处理 <span class="token function-variable function">adapter</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">resolve<span class="token punctuation">,</span> reject<span class="token punctuation">,</span> config</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> ## 身份验证信息 auth<span class="token operator">:</span> <span class="token punctuation">{</span> uname<span class="token operator">:</span> <span class="token string">''</span><span class="token punctuation">,</span> pwd<span class="token operator">:</span> <span class="token string">'12'</span><span class="token punctuation">}</span><span class="token punctuation">,</span> ## 响应的数据格式 json <span class="token operator">/</span> blob <span class="token operator">/</span>document <span class="token operator">/</span>arraybuffer <span class="token operator">/</span> text <span class="token operator">/</span> stream responseType<span class="token operator">:</span> <span class="token string">'json'</span><span class="token punctuation">,</span> </code></pre> <h4>4. axios的实例</h4> <h6>axios的实例</h6> <ul> <li>为什么要创建<code>axios</code>的实例呢? <ul> <li>当我们从<code>axios</code>模块中导入对象时, 使用的实例是默认的实例.</li> <li>当给该实例设置一些默认配置时, 这些配置就被固定下来了.</li> <li>但是后续开发中, 某些配置可能会不太一样.</li> <li>比如某些请求需要使用特定的<code>baseURL</code>或者<code>timeout</code>或者<code>content-Type</code>等.</li> <li>这个时候, 我们就可以创建新的实例, 并且传入属于该实例的配置信息.</li> </ul> </li> </ul> <pre><code class="prism language-js"><span class="token comment">// 创建新的实例</span> <span class="token keyword">const</span> axiosInstance <span class="token operator">=</span> axios<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">{</span> baseURL<span class="token operator">:</span> <span class="token string">'接口地址'</span><span class="token punctuation">,</span> timeout<span class="token operator">:</span> <span class="token number">5000</span><span class="token punctuation">,</span> headers<span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string">'Content-Type'</span><span class="token operator">:</span> <span class="token string">'application/x-www-form-urlencoded'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <pre><code class="prism language-js"><span class="token comment">// 发送网络请求</span> <span class="token function">axiosInstance</span><span class="token punctuation">(</span><span class="token punctuation">{</span> url<span class="token operator">:</span> <span class="token string">'/category'</span><span class="token punctuation">,</span> method<span class="token operator">:</span> <span class="token string">'get'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">res</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">catch</span><span class="token punctuation">(</span><span class="token parameter">err</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <h6>axios 封装</h6> <pre><code class="prism language-js"><span class="token keyword">import</span> originAxios <span class="token keyword">from</span> <span class="token string">'axios'</span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">axios</span><span class="token punctuation">(</span><span class="token parameter">options</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">resolve<span class="token punctuation">,</span>reject</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token comment">// 1. 创建axios的实例</span> <span class="token keyword">const</span> instance <span class="token operator">=</span> originAxios<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">{</span> baseURL<span class="token operator">:</span> <span class="token string">'/api'</span><span class="token punctuation">,</span> timeout<span class="token operator">:</span> <span class="token number">5000</span><span class="token punctuation">,</span> headers<span class="token operator">:</span> <span class="token string">''</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 2. 传入对象进行网络请求</span> <span class="token function">instance</span><span class="token punctuation">(</span>option<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">res</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">resolve</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">catch</span><span class="token punctuation">(</span><span class="token parameter">err</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">reject</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <h4>5. 拦截器</h4> <h6>1. 如何使用拦截器?</h6> <ul> <li><code>axios</code>提供了<code>拦截器</code>,用于我们在发送每次请求或者得到相应后,进行对应的处理。</li> <li>如何使用拦截器呢?</li> </ul> <pre><code class="prism language-js"><span class="token comment">// 配置请求和响应拦截</span> instance<span class="token punctuation">.</span>interceptors<span class="token punctuation">.</span>request<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span><span class="token parameter">config</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'来到了request拦截success中'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> config <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token parameter">err</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'来到了request拦截failure中'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> err <span class="token punctuation">}</span><span class="token punctuation">)</span> instance<span class="token punctuation">.</span>interceptors<span class="token punctuation">.</span>response<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span><span class="token parameter">response</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'来到了request拦截success中'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> response<span class="token punctuation">.</span>data <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token parameter">err</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'来到了request拦截failure中'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> err <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <pre><code class="prism language-js"><span class="token function">axios</span><span class="token punctuation">(</span><span class="token punctuation">{</span> url<span class="token operator">:</span> <span class="token string">'/home/data'</span><span class="token punctuation">,</span> method<span class="token operator">:</span> <span class="token string">'get'</span><span class="token punctuation">,</span> params<span class="token operator">:</span> <span class="token punctuation">{</span> type<span class="token operator">:</span> <span class="token string">'sell'</span><span class="token punctuation">,</span> page<span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">res</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">catch</span><span class="token punctuation">(</span><span class="token parameter">err</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <p><img src="http://img.e-com-net.com/image/info8/e7bd0913c20a4d32a2c863d0c474a25a.jpg" alt="在这里插入图片描述" width="0" height="0"></p> <h6>2. 拦截器中都做什么呢?</h6> <ul> <li>请求拦截可以做到的事情:</li> </ul> <pre><code class="prism language-js">instance<span class="token punctuation">.</span>interceptors<span class="token punctuation">.</span>request<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span><span class="token parameter">config</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'来到了request拦截success中'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1. 当发送网络请求时,在页面中添加一个loading组件,作为动画</span> <span class="token comment">// 2. 某些请求要求用户必须登录,判断用户是否有token,如果没有token跳转到login页面</span> <span class="token comment">// 3. 对请求的参数进行序列化</span> config<span class="token punctuation">.</span>data <span class="token operator">=</span> qs<span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>config<span class="token punctuation">.</span>data<span class="token punctuation">)</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>config<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 4. 等等</span> <span class="token keyword">return</span> config </code></pre> <ul> <li><code>请求拦截</code>中错误拦截较少,通常都是配置相关的拦截 <ul> <li>可能的错误比如<code>请求超时</code>,可以将页面跳转到一个错误页面中。</li> </ul> </li> <li><code>响应拦截</code>中完成的事情: <ul> <li>响应的成功拦截中,主要是对数据进行过滤。</li> </ul> </li> </ul> <p><img src="http://img.e-com-net.com/image/info8/cb27b8ca7d5740078b29872abf1d9733.jpg" alt="在这里插入图片描述" width="0" height="0"></p> <pre><code class="prism language-js">instance<span class="token punctuation">.</span>interceptors<span class="token punctuation">.</span>response<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span><span class="token parameter">response</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'来到了request拦截success中'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> response<span class="token punctuation">.</span>data </code></pre> <ul> <li>响应的失败拦截中,可以根据status判断报错的错误码,跳转到不同的错误提示页面。</li> </ul> <pre><code class="prism language-js"><span class="token parameter">err</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'来到了request拦截failure中'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>err <span class="token operator">&&</span> err<span class="token punctuation">.</span>response<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span>err<span class="token punctuation">.</span>response<span class="token punctuation">.</span>status<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> <span class="token number">400</span><span class="token operator">:</span> err<span class="token punctuation">.</span>message <span class="token operator">=</span> <span class="token string">'请求错误'</span> <span class="token keyword">break</span> <span class="token keyword">case</span> <span class="token number">401</span><span class="token operator">:</span> err<span class="token punctuation">.</span>message <span class="token operator">=</span> <span class="token string">'未授权的访问'</span> <span class="token keyword">break</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> err </code></pre> <h2>6. 总结</h2> <ul> <li>对于Vue框架学习的总结笔记,复习的时候参考</li> </ul> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1615148611702652928"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(#,Vue相关,Vue,进阶,VueRouter,Vuex,Axios,VueCli)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835512920797179904.htm" title="element实现动态路由+面包屑" target="_blank">element实现动态路由+面包屑</a> <span class="text-muted">软件技术NINI</span> <a class="tag" taget="_blank" href="/search/vue%E6%A1%88%E4%BE%8B/1.htm">vue案例</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>el-breadcrumb是ElementUI组件库中的一个面包屑导航组件,它用于显示当前页面的路径,帮助用户快速理解和导航到应用的各个部分。在Vue.js项目中,如果你已经安装了ElementUI,就可以很方便地使用el-breadcrumb组件。以下是一个基本的使用示例:安装ElementUI(如果你还没有安装的话):你可以通过npm或yarn来安装ElementUI。bash复制代码npmi</div> </li> <li><a href="/article/1835504723210366976.htm" title="第四天旅游线路预览——从换乘中心到喀纳斯湖" target="_blank">第四天旅游线路预览——从换乘中心到喀纳斯湖</a> <span class="text-muted">陟彼高冈yu</span> <a class="tag" taget="_blank" href="/search/%E5%9F%BA%E4%BA%8EGoogle/1.htm">基于Google</a><a class="tag" taget="_blank" href="/search/earth/1.htm">earth</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/%E7%9A%84%E6%97%85%E6%B8%B8%E8%A7%84%E5%88%92%E5%92%8C%E9%A2%84%E8%A7%88/1.htm">的旅游规划和预览</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a> <div>第四天:从贾登峪到喀纳斯风景区入口,晚上住宿贾登峪;换乘中心有4路车,喀纳斯①号车,去喀纳斯湖,路程时长约5分钟;将上面的的行程安排进行动态展示,具体步骤见”Googleearthstudio进行动态轨迹显示制作过程“、“Googleearthstudio入门教程”和“Googleearthstudio进阶教程“相关内容,得到行程如下所示:Day4-2-480p</div> </li> <li><a href="/article/1835504470440636416.htm" title="Goolge earth studio 进阶4——路径修改与平滑" target="_blank">Goolge earth studio 进阶4——路径修改与平滑</a> <span class="text-muted">陟彼高冈yu</span> <a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a><a class="tag" taget="_blank" href="/search/earth/1.htm">earth</a><a class="tag" taget="_blank" href="/search/studio/1.htm">studio</a><a class="tag" taget="_blank" href="/search/%E8%BF%9B%E9%98%B6%E6%95%99%E7%A8%8B/1.htm">进阶教程</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a> <div>如果我们希望在大约中途时获得更多的城市鸟瞰视角。可以将相机拖动到这里并创建一个新的关键帧。camera_target_clip_7EarthStudio会自动平滑我们的路径,所以当我们通过这个关键帧时,不是一个生硬的角度,而是一个平滑的曲线。camera_target_clip_8路径上有贝塞尔控制手柄,允许我们调整路径的形状。右键单击,我们可以选择“平滑路径”,这是默认的自动平滑算法,或者我们可</div> </li> <li><a href="/article/1835493753557708800.htm" title="每日算法&面试题,大厂特训二十八天——第二十天(树)" target="_blank">每日算法&面试题,大厂特训二十八天——第二十天(树)</a> <span class="text-muted">肥学</span> <a class="tag" taget="_blank" href="/search/%E2%9A%A1%E7%AE%97%E6%B3%95%E9%A2%98%E2%9A%A1%E9%9D%A2%E8%AF%95%E9%A2%98%E6%AF%8F%E6%97%A5%E7%B2%BE%E8%BF%9B/1.htm">⚡算法题⚡面试题每日精进</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a> <div>目录标题导读算法特训二十八天面试题点击直接资料领取导读肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行二十八天的一个小总结。还在等什么快来一起肥学进行二十八天挑战吧!!特别介绍小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章</div> </li> <li><a href="/article/1835492740536823808.htm" title="node.js学习" target="_blank">node.js学习</a> <span class="text-muted">小猿L</span> <a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a> <div>node.js学习实操及笔记温故node.js,node.js学习实操过程及笔记~node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记为什么学node.js可以让别人访问我们编写的网页为后续的框架学习打下基础,三大框架vuereactangular离不开node.jsnode.js是什么官网:node.js是一个开源的、跨平台的运行JavaScript的运行</div> </li> <li><a href="/article/1835453535777550336.htm" title="vue3中el-table中点击图片放大时,被表格覆盖" target="_blank">vue3中el-table中点击图片放大时,被表格覆盖</a> <span class="text-muted">叫我小鹏呀</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>问题:vue3中el-table中点击图片放大时,被表格覆盖。解决方法:el-image添加preview-teleported</div> </li> <li><a href="/article/1835452528599330816.htm" title="vue项目element-ui的table表格单元格合并" target="_blank">vue项目element-ui的table表格单元格合并</a> <span class="text-muted">酋长哈哈</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/elementui/1.htm">elementui</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>一、合并效果二全部代码exportdefault{name:'CellMerge',data(){return{tableData:[{id:'1',name:'王小虎',amount1:'165',amount2:'3.2',amount3:10},{id:'1',name:'王小虎',amount1:'162',amount2:'4.43',amount3:12},{id:'1',name:'</div> </li> <li><a href="/article/1835450513689243648.htm" title="2023-08-20" target="_blank">2023-08-20</a> <span class="text-muted">圆梦菌</span> <div>魔力宝贝最详细新手教程,新手该如何完美开局,建议收藏转发2023-08-2010:34《魔力宝贝》手游体力是什么?魔力宝贝体力恢复机制是每10分钟回复1点;体力作用:挑战关卡需消耗体力体力获取方式1、好友每天可以赠送15次,也就是15点体力2、系统每天中午12点以及下午6点赠送25体3、在商城使用神石购买《魔力宝贝》手游战斗力如何提升?1、宠物强化宠物通过融合进阶后可以大幅度提升战力,最高级的宠物</div> </li> <li><a href="/article/1835450384655675392.htm" title="Vue中table合并单元格用法" target="_blank">Vue中table合并单元格用法</a> <span class="text-muted">weixin_30613343</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/ViewUI/1.htm">ViewUI</a> <div>地名结果人名性别{{item.name}}已完成未完成{{item.groups[0].name}}{{item.groups[0].sex}}{{item.groups[son].name}}{{item.groups[son].sex}}exportdefault{data(){return{list:[{name:'地名1',result:'1',groups:[{name:'张三',sex</div> </li> <li><a href="/article/1835448238103162880.htm" title="springboot+vue项目实战一-创建SpringBoot简单项目" target="_blank">springboot+vue项目实战一-创建SpringBoot简单项目</a> <span class="text-muted">苹果酱0567</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98%E6%B1%87%E6%80%BB%E4%B8%8E%E8%A7%A3%E6%9E%90/1.htm">面试题汇总与解析</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6/1.htm">中间件</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>这段时间抽空给女朋友搭建一个个人博客,想着记录一下建站的过程,就当做笔记吧。虽然复制zjblog只要一个小时就可以搞定一个网站,或者用cms系统,三四个小时就可以做出一个前后台都有的网站,而且想做成啥样也都行。但是就是要从新做,自己做的意义不一样,更何况,俺就是专门干这个的,嘿嘿嘿要做一个网站,而且从零开始,首先呢就是技术选型了,经过一番思量决定选择-SpringBoot做后端,前端使用Vue做一</div> </li> <li><a href="/article/1835443569528238080.htm" title="Vue( ElementUI入门、vue-cli安装)" target="_blank">Vue( ElementUI入门、vue-cli安装)</a> <span class="text-muted">m0_l5z</span> <a class="tag" taget="_blank" href="/search/elementui/1.htm">elementui</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a> <div>一.ElementUI入门目录:1.ElementUI入门1.1ElementUI简介1.2Vue+ElementUI安装1.3开发示例2.搭建nodejs环境2.1nodejs介绍2.2npm是什么2.3nodejs环境搭建2.3.1下载2.3.2解压2.3.3配置环境变量2.3.4配置npm全局模块路径和cache默认安装位置2.3.5修改npm镜像提高下载速度2.3.6验证安装结果3.运行n</div> </li> <li><a href="/article/1835439322715746304.htm" title="258-各位相加" target="_blank">258-各位相加</a> <span class="text-muted">不胖二十斤不改名zz</span> <div>给定一个非负整数num,反复将各个位上的数字相加,直到结果为一位数。输入:38输出:2解释:各位相加的过程为:3+8=11,1+1=2。由于2是一位数,所以返回2。最简单的方法就是递归了。进阶:你可以不使用循环或者递归,且在O(1)时间复杂度内解决这个问题吗?假如一个三位数'abc',其值大小为s1=100*a+10*b+1*c,经过一次各位相加后,变为s2=a+b+c,减小的差值为(s1-s2)</div> </li> <li><a href="/article/1835437775344726016.htm" title="博客网站制作教程" target="_blank">博客网站制作教程</a> <span class="text-muted">2401_85194651</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>首先就是技术框架:后端:Java+SpringBoot数据库:MySQL前端:Vue.js数据库连接:JPA(JavaPersistenceAPI)1.项目结构blog-app/├──backend/│├──src/main/java/com/example/blogapp/││├──BlogApplication.java││├──config/│││└──DatabaseConfig.java</div> </li> <li><a href="/article/1835435885760442368.htm" title="vue+el-table 可输入表格使用上下键进行input框切换" target="_blank">vue+el-table 可输入表格使用上下键进行input框切换</a> <span class="text-muted">以对_</span> <a class="tag" taget="_blank" href="/search/vue%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/1.htm">vue学习记录</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>使用上下键进行完工数量这一列的切换-->//键盘触发事件show(ev,index){letnewIndex;letinputAll=document.querySelectorAll('.table_inputinput');//向上=38if(ev.keyCode==38){if(index==0){//如果是第一行,回到最后一个newIndex=inputAll.length-1}elsei</div> </li> <li><a href="/article/1835435885122908160.htm" title="vue + Element UI table动态合并单元格" target="_blank">vue + Element UI table动态合并单元格</a> <span class="text-muted">我家媳妇儿萌哒哒</span> <a class="tag" taget="_blank" href="/search/element/1.htm">element</a><a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>一、功能需求1、根据名称相同的合并工作阶段和主要任务合并这两列,但主要任务内容一样,但要考虑主要任务一样,但工作阶段不一样的情况。(枞向合并)2、落实情况里的定量内容和定性内容值一样则合并。(横向合并)二、功能实现exportdefault{data(){return{tableData:[{name:'a',address:'1',age:'1',six:'2'},{name:'a',addre</div> </li> <li><a href="/article/1835431726982197248.htm" title="vue 创建项目报错:command failed: npm install --loglevel error" target="_blank">vue 创建项目报错:command failed: npm install --loglevel error</a> <span class="text-muted">那鱼、会飞</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/vue-cli3/1.htm">vue-cli3</a> <div>这个问题其实很好解决,只是很多种情况,逐一排除即可。稳下心来~vuecli3创建项目我的node版本是node14.15.0,(永远不要尝试最新版本)node各种版本下载地址:以往的版本|Node.js(nodejs.org)vue/cli@3.12.1npminstall-g@vue/cli@3.12.1(注意vue/cli2和vue/cli3的下载命名有所改变,2是-形式,3是/形式)其实报错</div> </li> <li><a href="/article/1835428821877223424.htm" title="计算机毕业设计PHP仓储综合管理系统(源码+程序+VUE+lw+部署)" target="_blank">计算机毕业设计PHP仓储综合管理系统(源码+程序+VUE+lw+部署)</a> <span class="text-muted">java毕设程序源码王哥</span> <a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/1.htm">课程设计</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a> <div>该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流项目运行环境配置:phpStudy+Vscode+Mysql5.7+HBuilderX+Navicat11+Vue+Express。项目技术:原生PHP++Vue等等组成,B/S模式+Vscode管理+前后端分离等等。环境需要1.运行环境:最好是小皮phpstudy最新版,我们在这个版本上开发的。其他版本理论上也可以。2.开发</div> </li> <li><a href="/article/1835414702142877696.htm" title="Python编程 - 函数进阶" target="_blank">Python编程 - 函数进阶</a> <span class="text-muted">易辰君</span> <a class="tag" taget="_blank" href="/search/Python%E6%A0%B8%E5%BF%83%E7%BC%96%E7%A8%8B/1.htm">Python核心编程</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>目录前言一、函数参数的高级用法(一)缺省参数(二)命名参数(三)不定长参数二、拆包(一)函数返回值拆包(二)通过星号拆包(三)总结三、匿名函数(一)函数定义(二)使用匿名函数四、递归函数(一)简介(二)基本结构(三)简单示例(四)优缺点总结前言上篇文章主要了解了函数基础,如何定义函数,函数种类以及局部变量和全局变量的差异等,接下来就讲解python函数较为进阶的知识点,若有任何想法欢迎一起沟通讨论</div> </li> <li><a href="/article/1835411044768509952.htm" title="字节二面" target="_blank">字节二面</a> <span class="text-muted">Redstone Monstrosity</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>1.假设你是正在面试前端开发工程师的候选人,面试官让你详细说出你上一段实习过程的收获和感悟。在上一段实习过程中,我获得了宝贵的实践经验和深刻的行业洞察,以下是我的主要收获和感悟:一、专业技能提升框架应用熟练度:通过实际项目,我深入掌握了React、Vue等前端框架的使用,不仅提升了编码效率,还学会了如何根据项目需求选择合适的框架。问题解决能力:在实习期间,我遇到了许多预料之外的技术难题。通过查阅文</div> </li> <li><a href="/article/1835401975269781504.htm" title="vue render 函数详解 (配参数详解)" target="_blank">vue render 函数详解 (配参数详解)</a> <span class="text-muted">你的眼睛會笑</span> <a class="tag" taget="_blank" href="/search/vue2/1.htm">vue2</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>vuerender函数详解(配参数详解)在Vue3中,`render`函数被用来代替Vue2中的模板语法。它接收一个h函数(或者是`createElement`函数的别名),并且返回一个虚拟DOM。render函数的语法结构如下:render(h){returnh('div',{class:'container'},'Hello,World!')}在上面的示例中,我们使用h函数创建了一个div元素</div> </li> <li><a href="/article/1835398064727224320.htm" title="前端代码上传文件" target="_blank">前端代码上传文件</a> <span class="text-muted">余生逆风飞翔</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>点击上传文件import{ElNotification}from'element-plus'import{API_CONFIG}from'../config/index.js'import{UploadFilled}from'@element-plus/icons-vue'import{reactive}from'vue'import{BASE_URL}from'../config/index'i</div> </li> <li><a href="/article/1835393400380157952.htm" title="VUE3 + xterm + nestjs实现web远程终端 或 连接开启SSH登录的路由器和交换机。" target="_blank">VUE3 + xterm + nestjs实现web远程终端 或 连接开启SSH登录的路由器和交换机。</a> <span class="text-muted">焚木灵</span> <a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a> <div>可远程连接系统终端或开启SSH登录的路由器和交换机。相关资料:xtermjs/xterm.js:Aterminalfortheweb(github.com)后端实现(NestJS):1、安装依赖:npminstallnode-ssh@nestjs/websockets@nestjs/platform-socket.io2、我们将创建一个名为RemoteControlModule的NestJS模块,</div> </li> <li><a href="/article/1835390752381825024.htm" title="详解“c:/work/src/components/a/b.vue“‘ has no default export报错原因" target="_blank">详解“c:/work/src/components/a/b.vue“‘ has no default export报错原因</a> <span class="text-muted">hw_happy</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>前情提要在一个vue文件中需要引入定义的b.vue文件,但是提示b文件没有默认导出,对于vue2文件来说有exportdefault,在中,所有定义的变量、函数和组件都会自动被视为默认导出的组件内容。因此,不需要显式地使用exportdefault来导出组件。但是在我引用这个文件的时候还是提示了这个错误,原来是我的项目使用了ts和vite\webpack,因为TypeScript和Vue的默认导出</div> </li> <li><a href="/article/1835388111874519040.htm" title="教师资格证常考的5个知识点" target="_blank">教师资格证常考的5个知识点</a> <span class="text-muted">a3cb74a20840</span> <div>知识点1:教育与人的发展(5规律、4因素、3动因)五大规律:顺序性—循序渐进阶段性—不搞“一刀切”不平衡性—抓关键期互补性—扬长避短个别差异性—因材施教考点精华:1.举例子对应五大规律;2.每个规律的教学启示;3规律特点。四大因素:遗传(地位:物质前提、可能性)环境(地位:多种可能、现实性)学校教育(主导)个人主观能动性(动力、决定)三大动因:内发论(1.孟子:性善论;2.弗洛伊德:性本能)外铄论</div> </li> <li><a href="/article/1835376631733121024.htm" title="Vue 项目运行时,报错 Error: Cannot find module ‘node:path‘" target="_blank">Vue 项目运行时,报错 Error: Cannot find module ‘node:path‘</a> <span class="text-muted">周bro</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a> <div>node-v是否显示nodenpm-v报错Error:Cannotfindmodule‘node:path'是因为node版本和npm版本不匹配安装相对应的版本node版本10.16.0对应npm版本6.9.0npminstallnpm@6.14.17-g执行该命令即可匹配版本官网https://nodejs.org/en/about/previous-releases</div> </li> <li><a href="/article/1835376632366460928.htm" title="vue2实现复制,粘贴功能" target="_blank">vue2实现复制,粘贴功能</a> <span class="text-muted">周bro</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>一、需求说明在项目中点击按钮复制某行文本是很常见的应用场景,在Vue项目中实现复制功能需要借助vue-clipboard2插件。二、代码实现1、安装vue-clipboard2依赖(出现错误的话,可以试试切换成淘宝镜像源npmconfigsetregistryhttps://registry.npm.taobao.org)npminstall--savevue-clipboard22、在main.</div> </li> <li><a href="/article/1835370074102394880.htm" title="【vite 自动配置路由】" target="_blank">【vite 自动配置路由】</a> <span class="text-muted">CODER-V</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%9E%84%E5%BB%BA/1.htm">软件构建</a> <div>手动配置路由,是一个没有技术含量又浪费时间的工作。本文将介绍vite构建的vue3项目如何编写一个自动配置路由的脚本。约定大于配置要想使用脚本完成路由的自动配置,我们就需要遵循以下目录规则:每一个页面对应一个包,当前包下的主页面命名为index.vue;每个包里必须配置一个page.js;在每一个page.js里边配置,额外的路由信息,比如:exportdefault{title:'商品',men</div> </li> <li><a href="/article/1835368019430305792.htm" title="Vue + Express实现一个表单提交" target="_blank">Vue + Express实现一个表单提交</a> <span class="text-muted">九旬大爷的梦</span> <div>最近在折腾一个cms系统,用的vue+express,但是就一个表单提交就弄了好久,记录一下。环境:Node10+前端:Vue服务端:Express依赖包:vueexpressaxiosexpress-formidableelement-ui(可选)前言:axiosget请求参数是:paramsaxiospost请求参数是:dataexpressget接受参数是req.queryexpresspo</div> </li> <li><a href="/article/1835365412099944448.htm" title="Vue3 vant组件库自动导入" target="_blank">Vue3 vant组件库自动导入</a> <span class="text-muted">不叫虎子</span> <a class="tag" taget="_blank" href="/search/Vue/1.htm">Vue</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/typescript/1.htm">typescript</a> <div>实现:完整使用vant组件库文档安装:#Vue3项目,安装最新版Vantnpmivant#通过yarn安装yarnaddvant#通过pnpm安装pnpmaddvant【一】按需引入:https://vant-contrib.gitee.io/vant/#/zh-CN/quickstart#fang-fa-er.-an-xu-yin-ru-zu-jian-yang-shi【二】批量引入在基于vit</div> </li> <li><a href="/article/1835361379343757312.htm" title="vant-element-ts一起使用存在的问题" target="_blank">vant-element-ts一起使用存在的问题</a> <span class="text-muted">flynn_</span> <a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93/1.htm">问题总结</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a> <div>由于vant-ui与element-ui部分组件存在冲突,导致在vue-typescript中出现错误:Subsequentpropertydeclarationsmusthavethesametype.Property'$notify'mustbeoftype'ElNotification',butherehastype'Notify'.方案:一个全局导入,一个按需导入,避免冲突的组件同时使用,</div> </li> <li><a href="/article/9.htm" title="apache ftpserver-CentOS config" target="_blank">apache ftpserver-CentOS config</a> <span class="text-muted">gengzg</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a> <div><server xmlns="http://mina.apache.org/ftpserver/spring/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://mina.apache.o</div> </li> <li><a href="/article/136.htm" title="优化MySQL数据库性能的八种方法" target="_blank">优化MySQL数据库性能的八种方法</a> <span class="text-muted">AILIKES</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>1、选取最适用的字段属性   MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的 性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很</div> </li> <li><a href="/article/263.htm" title="JeeSite 企业信息化快速开发平台" target="_blank">JeeSite 企业信息化快速开发平台</a> <span class="text-muted">Kai_Ge</span> <a class="tag" taget="_blank" href="/search/JeeSite/1.htm">JeeSite</a> <div>JeeSite 企业信息化快速开发平台 平台简介 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java EE快速开发平台。 JeeSite本身是以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓存,Activit为工作流</div> </li> <li><a href="/article/390.htm" title="通过Spring Mail Api发送邮件" target="_blank">通过Spring Mail Api发送邮件</a> <span class="text-muted">120153216</span> <a class="tag" taget="_blank" href="/search/%E9%82%AE%E4%BB%B6/1.htm">邮件</a><a class="tag" taget="_blank" href="/search/main/1.htm">main</a> <div>原文地址:http://www.open-open.com/lib/view/open1346857871615.html 使用Java Mail API来发送邮件也很容易实现,但是最近公司一个同事封装的邮件API实在让我无法接受,于是便打算改用Spring Mail API来发送邮件,顺便记录下这篇文章。 【Spring Mail API】 Spring Mail API都在org.spri</div> </li> <li><a href="/article/517.htm" title="Pysvn 程序员使用指南" target="_blank">Pysvn 程序员使用指南</a> <span class="text-muted">2002wmj</span> <a class="tag" taget="_blank" href="/search/SVN/1.htm">SVN</a> <div>源文件:http://ju.outofmemory.cn/entry/35762 这是一篇关于pysvn模块的指南. 完整和详细的API请参考 http://pysvn.tigris.org/docs/pysvn_prog_ref.html. pysvn是操作Subversion版本控制的Python接口模块. 这个API接口可以管理一个工作副本, 查询档案库, 和同步两个. 该</div> </li> <li><a href="/article/644.htm" title="在SQLSERVER中查找被阻塞和正在被阻塞的SQL" target="_blank">在SQLSERVER中查找被阻塞和正在被阻塞的SQL</a> <span class="text-muted">357029540</span> <a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a> <div>SELECT  R.session_id AS BlockedSessionID ,          S.session_id AS BlockingSessionID ,          Q1.text AS Block</div> </li> <li><a href="/article/771.htm" title="Intent 常用的用法备忘" target="_blank">Intent 常用的用法备忘</a> <span class="text-muted">7454103</span> <a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a><a class="tag" taget="_blank" href="/search/Blog/1.htm">Blog</a><a class="tag" taget="_blank" href="/search/F%23/1.htm">F#</a> <div>Intent     应该算是Android中特有的东西。你可以在Intent中指定程序 要执行的动作(比如:view,edit,dial),以及程序执行到该动作时所需要的资料 。都指定好后,只要调用startActivity(),Android系统 会自动寻找最符合你指定要求的应用 程序,并执行该程序。 下面列出几种Intent 的用法 显示网页: </div> </li> <li><a href="/article/898.htm" title="Spring定时器时间配置" target="_blank">Spring定时器时间配置</a> <span class="text-muted">adminjun</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4%E9%85%8D%E7%BD%AE/1.htm">时间配置</a><a class="tag" taget="_blank" href="/search/%E5%AE%9A%E6%97%B6%E5%99%A8/1.htm">定时器</a> <div>红圈中的值由6个数字组成,中间用空格分隔。第一个数字表示定时任务执行时间的秒,第二个数字表示分钟,第三个数字表示小时,后面三个数字表示日,月,年,< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 测试的时候,由于是每天定时执行,所以后面三个数</div> </li> <li><a href="/article/1025.htm" title="POJ 2421 Constructing Roads 最小生成树" target="_blank">POJ 2421 Constructing Roads 最小生成树</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/%E6%9C%80%E5%B0%8F%E7%94%9F%E6%88%90%E6%A0%91/1.htm">最小生成树</a> <div>来源:http://poj.org/problem?id=2421 题意:还是给你n个点,然后求最小生成树。特殊之处在于有一些点之间已经连上了边。 思路:对于已经有边的点,特殊标记一下,加边的时候把这些边的权值赋值为0即可。这样就可以既保证这些边一定存在,又保证了所求的结果正确。 代码: #include <iostream> #include <cstdio></div> </li> <li><a href="/article/1152.htm" title="重构笔记——提取方法(Extract Method)" target="_blank">重构笔记——提取方法(Extract Method)</a> <span class="text-muted">ayaoxinchao</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%87%8D%E6%9E%84/1.htm">重构</a><a class="tag" taget="_blank" href="/search/%E6%8F%90%E7%82%BC%E5%87%BD%E6%95%B0/1.htm">提炼函数</a><a class="tag" taget="_blank" href="/search/%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F/1.htm">局部变量</a><a class="tag" taget="_blank" href="/search/%E6%8F%90%E5%8F%96%E6%96%B9%E6%B3%95/1.htm">提取方法</a> <div>提取方法(Extract Method)是最常用的重构手法之一。当看到一个方法过长或者方法很难让人理解其意图的时候,这时候就可以用提取方法这种重构手法。   下面是我学习这个重构手法的笔记:   提取方法看起来好像仅仅是将被提取方法中的一段代码,放到目标方法中。其实,当方法足够复杂的时候,提取方法也会变得复杂。当然,如果提取方法这种重构手法无法进行时,就可能需要选择其他</div> </li> <li><a href="/article/1279.htm" title="为UILabel添加点击事件" target="_blank">为UILabel添加点击事件</a> <span class="text-muted">bewithme</span> <a class="tag" taget="_blank" href="/search/UILabel/1.htm">UILabel</a> <div>    默认情况下UILabel是不支持点击事件的,网上查了查居然没有一个是完整的答案,现在我提供一个完整的代码。   UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, listV.frame.size.width - 60, listV.frame.size.height)]</div> </li> <li><a href="/article/1406.htm" title="NoSQL数据库之Redis数据库管理(PHP-REDIS实例)" target="_blank">NoSQL数据库之Redis数据库管理(PHP-REDIS实例)</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a> <div>一.redis.php <?php //实例化 $redis = new Redis(); //连接服务器 $redis->connect("localhost"); //授权 $redis->auth("lamplijie"); //相关操</div> </li> <li><a href="/article/1533.htm" title="SecureCRT使用备注" target="_blank">SecureCRT使用备注</a> <span class="text-muted">bingyingao</span> <a class="tag" taget="_blank" href="/search/secureCRT/1.htm">secureCRT</a><a class="tag" taget="_blank" href="/search/%E6%AF%8F%E9%A1%B5/1.htm">每页</a><a class="tag" taget="_blank" href="/search/%E8%A1%8C%E6%95%B0/1.htm">行数</a> <div>SecureCRT日志和卷屏行数设置 一、使用securecrt时,设置自动日志记录功能。 1、在C:\Program Files\SecureCRT\下新建一个文件夹(也就是你的CRT可执行文件的路径),命名为Logs; 2、点击Options -> Global Options -> Default Session -> Edite Default Sett</div> </li> <li><a href="/article/1660.htm" title="【Scala九】Scala核心三:泛型" target="_blank">【Scala九】Scala核心三:泛型</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/scala/1.htm">scala</a> <div>泛型类 package spark.examples.scala.generics class GenericClass[K, V](val k: K, val v: V) { def print() { println(k + "," + v) } } object GenericClass { def main(args: Arr</div> </li> <li><a href="/article/1787.htm" title="素数与音乐" target="_blank">素数与音乐</a> <span class="text-muted">bookjovi</span> <a class="tag" taget="_blank" href="/search/%E7%B4%A0%E6%95%B0/1.htm">素数</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%A6/1.htm">数学</a><a class="tag" taget="_blank" href="/search/haskell/1.htm">haskell</a> <div>    由于一直在看haskell,不可避免的接触到了很多数学知识,其中数论最多,如素数,斐波那契数列等,很多在学生时代无法理解的数学现在似乎也能领悟到那么一点。     闲暇之余,从图书馆找了<<The music of primes>>和<<世界数学通史>>读了几遍。其中素数的音乐这本书与软件界熟知的&l</div> </li> <li><a href="/article/1914.htm" title="Java-Collections Framework学习与总结-IdentityHashMap" target="_blank">Java-Collections Framework学习与总结-IdentityHashMap</a> <span class="text-muted">BrokenDreams</span> <a class="tag" taget="_blank" href="/search/Collections/1.htm">Collections</a> <div>        这篇总结一下java.util.IdentityHashMap。从类名上可以猜到,这个类本质应该还是一个散列表,只是前面有Identity修饰,是一种特殊的HashMap。         简单的说,IdentityHashMap和HashM</div> </li> <li><a href="/article/2041.htm" title="读《研磨设计模式》-代码笔记-享元模式-Flyweight" target="_blank">读《研磨设计模式》-代码笔记-享元模式-Flyweight</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java</div> </li> <li><a href="/article/2168.htm" title="PS人像润饰&调色教程集锦" target="_blank">PS人像润饰&调色教程集锦</a> <span class="text-muted">cherishLC</span> <a class="tag" taget="_blank" href="/search/PS/1.htm">PS</a> <div>  1、仿制图章沿轮廓润饰——柔化图像,凸显轮廓 http://www.howzhi.com/course/retouching/   新建一个透明图层,使用仿制图章不断Alt+鼠标左键选点,设置透明度为21%,大小为修饰区域的1/3左右(比如胳膊宽度的1/3),再沿纹理方向(比如胳膊方向)进行修饰。   所有修饰完成后,对该润饰图层添加噪声,噪声大小应该和</div> </li> <li><a href="/article/2295.htm" title="更新多个字段的UPDATE语句" target="_blank">更新多个字段的UPDATE语句</a> <span class="text-muted">crabdave</span> <a class="tag" taget="_blank" href="/search/update/1.htm">update</a> <div>更新多个字段的UPDATE语句                    update tableA a set (a.v1, a.v2, a.v3, a.v4) = --使用括号确定更新的字段范围 </div> </li> <li><a href="/article/2422.htm" title="hive实例讲解实现in和not in子句" target="_blank">hive实例讲解实现in和not in子句</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/not+in/1.htm">not in</a><a class="tag" taget="_blank" href="/search/in/1.htm">in</a> <div>本文转自:http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842855.html 当前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现。 假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注册用户,字段只有一个uid),这两个表都包含</div> </li> <li><a href="/article/2549.htm" title="一道24点的10+种非人类解法(2,3,10,10)" target="_blank">一道24点的10+种非人类解法(2,3,10,10)</a> <span class="text-muted">dsjt</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>这是人类算24点的方法?!!! 事件缘由:今天晚上突然看到一条24点状态,当时惊为天人,这NM叫人啊?以下是那条状态 朱明西 : 24点,算2 3 10 10,我LX炮狗等面对四张牌痛不欲生,结果跑跑同学扫了一眼说,算出来了,2的10次方减10的3次方。。我草这是人类的算24点啊。。 然后么。。。我就在深夜很得瑟的问室友求室友算 刚出完题,文哥的暴走之旅开始了 5秒后</div> </li> <li><a href="/article/2676.htm" title="关于YII的菜单插件 CMenu和面包末breadcrumbs路径管理插件的一些使用问题" target="_blank">关于YII的菜单插件 CMenu和面包末breadcrumbs路径管理插件的一些使用问题</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a><a class="tag" taget="_blank" href="/search/framework/1.htm">framework</a> <div>在使用 YIi的路径管理工具时,发现了一个问题。                    <?php         </div> </li> <li><a href="/article/2803.htm" title="对象与关系之间的矛盾:“阻抗失配”效应[转]" target="_blank">对象与关系之间的矛盾:“阻抗失配”效应[转]</a> <span class="text-muted">come_for_dream</span> <a class="tag" taget="_blank" href="/search/%E5%AF%B9%E8%B1%A1/1.htm">对象</a> <div>概述   “阻抗失配”这一词组通常用来描述面向对象应用向传统的关系数据库(RDBMS)存放数据时所遇到的数据表述不一致问题。C++程序员已经被这个问题困扰了好多年,而现在的Java程序员和其它面向对象开发人员也对这个问题深感头痛。   “阻抗失配”产生的原因是因为对象模型与关系模型之间缺乏固有的亲合力。“阻抗失配”所带来的问题包括:类的层次关系必须绑定为关系模式(将对象</div> </li> <li><a href="/article/2930.htm" title="学习编程那点事" target="_blank">学习编程那点事</a> <span class="text-muted">gcq511120594</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a> <div>一年前的夏天,我还在纠结要不要改行,要不要去学php?能学到真本事吗?改行能成功吗?太多的问题,我终于不顾一切,下定决心,辞去了工作,来到传说中的帝都。老师给的乘车方式还算有效,很顺利的就到了学校,赶巧了,正好学校搬到了新校区。先安顿了下来,过了个轻松的周末,第一次到帝都,逛逛吧! 接下来的周一,是我噩梦的开始,学习内容对我这个零基础的人来说,除了勉强完成老师布置的作业外,我已经没有时间和精力去</div> </li> <li><a href="/article/3057.htm" title="Reverse Linked List II" target="_blank">Reverse Linked List II</a> <span class="text-muted">hcx2013</span> <a class="tag" taget="_blank" href="/search/list/1.htm">list</a> <div>Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m = 2 and n = 4, return </div> </li> <li><a href="/article/3184.htm" title="Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介" target="_blank">Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/spring+4.1/1.htm">spring 4.1</a> <div>目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异常处理 Spring4.1新特性——数据库集成测试脚本初始化 Spring4.1新特性——Spring MVC增强 Spring4.1新特性——页面自动化测试框架Spring MVC T</div> </li> <li><a href="/article/3311.htm" title="Hadoop集群工具distcp" target="_blank">Hadoop集群工具distcp</a> <span class="text-muted">liyonghui160com</span> <div>    1. 环境描述 两个集群:rock 和 stone rock无kerberos权限认证,stone有要求认证。 1. 从rock复制到stone,采用hdfs Hadoop distcp -i hdfs://rock-nn:8020/user/cxz/input hdfs://stone-nn:8020/user/cxz/运行在rock端,即源端问题:报版本</div> </li> <li><a href="/article/3438.htm" title="一个备份MySQL数据库的简单Shell脚本" target="_blank">一个备份MySQL数据库的简单Shell脚本</a> <span class="text-muted">pda158</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E8%84%9A%E6%9C%AC/1.htm">脚本</a> <div>  主脚本(用于备份mysql数据库):   该Shell脚本可以自动备份 数据库。只要复制粘贴本脚本到文本编辑器中,输入数据库用户名、密码以及数据库名即可。我备份数据库使用的是mysqlump 命令。后面会对每行脚本命令进行说明。    1. 分别建立目录“backup”和“oldbackup”   #mkdir /backup   #mkdir /oldbackup  </div> </li> <li><a href="/article/3565.htm" title="300个涵盖IT各方面的免费资源(中)——设计与编码篇" target="_blank">300个涵盖IT各方面的免费资源(中)——设计与编码篇</a> <span class="text-muted">shoothao</span> <a class="tag" taget="_blank" href="/search/IT%E8%B5%84%E6%BA%90/1.htm">IT资源</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E6%A0%87%E5%BA%93/1.htm">图标库</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E7%89%87%E5%BA%93/1.htm">图片库</a><a class="tag" taget="_blank" href="/search/%E8%89%B2%E5%BD%A9%E6%9D%BF/1.htm">色彩板</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E4%BD%93/1.htm">字体</a> <div> A. 免费的设计资源 Freebbble:来自于Dribbble的免费的高质量作品。 Dribbble:Dribbble上“免费”的搜索结果——这是巨大的宝藏。 Graphic Burger:每个像素点都做得很细的绝佳的设计资源。 Pixel Buddha:免费和优质资源的专业社区。 Premium Pixels:为那些有创意的人提供免费的素材。 </div> </li> <li><a href="/article/3692.htm" title="thrift总结 - 跨语言服务开发" target="_blank">thrift总结 - 跨语言服务开发</a> <span class="text-muted">uule</span> <a class="tag" taget="_blank" href="/search/thrift/1.htm">thrift</a> <div>官网 官网JAVA例子 thrift入门介绍 IBM-Apache Thrift - 可伸缩的跨语言服务开发框架 Thrift入门及Java实例演示 thrift的使用介绍   RPC    POM: <dependency> <groupId>org.apache.thrift</groupId> </div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>