vue.js学习
1. 插值操作
:Mustache语法:可以直接写变量,也可以书写简单的表达式1 | <div id="app"> |
v-once: (后面不用跟表达式)表示元素和组件只渲染一次,不会随着数据的改变而改变
1 | <h1 v-once>{{message}}</h1> |
v-html: 后面跟一个string类型,会将string的html解析出来并且进行渲染
1 | <h1 v-html="url"></h1> |
v-text: 作用与Mustache比较相似,都是用于将数据显示在界面中,接收一个string类型
1 | <h1>{{message}}</h1> |
v-pre: 用于跳过这个元素和它子元素的编译过程,用于显示原本的Mustache语法
1 | <h1 v-pre>{{message}} </h1> |
v-cloak:解决页面显示未编译的Mustache标签
1 | <style> |
2. V-bind
用于绑定一个或多个属性值,或者向另一个组件传递props值(动态绑定)
1 | <!-- 两种写法 --> |
1.v-bind动态绑定class(对象语法)
1 | <style> |
2.v-bind绑定class(数组语法)
1 | <div id="app"> |
3.v-bind绑定style
对象语法
:style=”{key(css属性名):value(属性值)}” :属性名中不能有“-”
数组语法
:style=”[style,style2]”
1 | <div id="app"> |
3. 计算属性
某些情况,需要对数据进行转化在显示,或者需要将多个数据结合起来进行显示
1 | <div id="app"> |
计算属性getter和setter方法:
1 | // 完整写法 |
多次调用,且内容不发生改变时,使用计算属性性能更高;内部有缓存,多次使用时只调用一次;当数据发生改变时才重新计算
4. 事件监听
v-on:
作用:绑定事件监听器
缩写:@
1 | <div id="app"> |
v-on参数:
1.方法不需要额外参数,方法后的()可以不添加(如果方法本身中有一个参数,会默认将原生事件event参数传递进去)@click=”handle”
2.方法需要传入某个参数,同时需要event时,可以通过$event传入事件 @click=”handle(参数, $event)”
1 | <div id="app"> |
v-on修饰符
vue提供修饰符来方便处理一些时间:
.stop:调用event.stopPropagation() 停止冒泡
.prevent 调用event.preventDefault() 阻止默认行为
.{keyCode | keyAlias} 只当事件是从特定键触发时才触发回调 键修饰符
.native 监听组件根元素的原生事件
.once 只触发一次回调
1 | <div id="app"> |
5. 条件判断
v-if后面条件为false时,对应的元素及其子元素不会渲染,不会有对应的标签出现在DOM中
1 | <div id="app"> |
v-show:用法与v-if相似,决定一个元素是否渲染
v-if当条件为false时,不会有对应的元素在DOM中。
v-show当条件为false时,将元素的display属性设为none。
选择:
如果只有一次切换时,使用v-if
当需要频繁的在显示和隐藏之间切换时,使用v-show
1 | <div id="app"> |

6. 循环遍历
遍历数组:
1 | <div id="app"> |
遍历对象:
1 | <div id="app"> |
:key属性:使用v-for,给对应的元素和组件添加:key属性(需要保证唯一性),给每个节点做一个唯一标识,与Vue的虚拟DOM的Diff算法有关,有了标识可以正确的识别节点,可以找到正确的位置区插入新的节点。作用就是为了高效的更新虚拟DOM。https://www.bilibili.com/video/BV15741177Eh?p=37
7. JavaScript高阶函数使用
1 | const nums = [10, 20, 101, 200, 40, 300, 50] |
filter、map、reduce
1 | // 取出小于100的数字 |
8. v-model使用
Vue中使用v-model指定实现表单元素和数据的双向绑定
1 | <div id="app"> |
原理:v-model其实是一个语法糖,包含v-bind绑定一个value属性和v-on给当前元素绑定input事件
1 | <div id="app"> |
1 | <!-- input radio使用 v-model --> |
修饰符:
lazy修饰符:
默认情况下,v-model默认是在input事件中同步输入框数据,一旦数据发生改变,data中的数据就会自动发生改变;lazy修饰符可以让数据在失去焦点或者回车时才更新
number修饰符:
默认情况下,输入框中输入的字母或者数字都会当做字符串类型进行处理,number修饰符可以让输入框中输入的内容自动转为数字类型
trim修饰符:
如果输入的内容首尾有很多空格,trim修饰符可以过滤内容左右两边的空格
1 | <!-- 修饰符 --> |
9. 组件
将一个完整的页面分成多个组件,每个组件用于实现页面的一个功能块,每个组件又可以细分多个组件。
vue.js组件化思想:
使用步骤:
创建组件构造器 (调用Vue.extend()方法创建组件构造器)
注册组件 (调用Vue.component()方法注册组件)
使用组件 (在Vue实例的作用范围内使用组件)
1 | <div id="app"> |
9.1 全局组件和局部组件
1 | // 1.创建组件构造器 |
9.2 父组件与子组件
1 | // 子组件 |
9.3 组件注册语法糖
1 | // 全局组件注册 |
9.4 组件模板分离
1 | <!-- 使用script标签 --> |
9.5 组件数据存放
组件对象也有一个data属性(也有methods等属性),但必须是一个函数,这个函数返回一个对象,对象内部保存数据。
1 | Vue.component('my-cpn', { |
组件中的data为什么必须是个函数?
避免共用一个对象,造成相互影响,每个实例可以维护一份被返回对象的拷贝
9.6 父子组件的通信
通过props向子组件传递数据
方式一:字符串数组,数组中的字符串就是传递时的名称
1 | <!-- 组件通信 --> |
方式二:对象,对象可以设置传递时的类型,也可以设置默认值等;使用对象写法可以进行数据验证
支持类型:
String、Number、Boolean、Array、Object、Date、Function、Symbol
当有自定义构造函数时,验证也支持自定义的类型
1 | const cpn ={ |
通过事件向父组件发送消息
自定义事件流程:
在子组件中,通过$emit()来触发事件;在父组件中,通过v-on来监听子组件事件 (使用this.$emit(‘事件名’, 参数),给父组件添加v-on:事件名进行绑定)
1 | <!-- 组件通信 --> |
9.7 父子组件的访问
父组件访问子组件:使用$children或$refs
1 | <div id="app"> |
子组件访问父组件:使用$parent访问父组件,使用$root访问根组件
1 | <div id="app"> |
10. slot插槽
组件插槽:为了让封装的组件更加具有扩展性,让使用者可以决定组件内部展示的内容
10.1 基本使用
1 | <!-- 插槽基本使用 --> |
10.2 具名插槽
添加替换内容时必须要给标签添加solt=’’属性才能使用。
1 | <!-- 具名插槽使用 --> |
10.3 编译作用域
1 | <!-- 编译作用域 --> |
10.4 作用域插槽
父组件替换插槽的标签,内容由子组件提供
1 | <!-- 作用域插槽 --> |
模块化开发
ES6模块化实现
export基本使用:(用于导出变量)导出模块对外提供的接口
1 | // 导出 1 |
import导出:加载模块 引入js文件,类型设置为module import {} from “”
1 | // 导入{}中定义的变量 |
Vue CLI
安装 cnpm install -g @vue/cli
拉取2.x模板:cnpm install -g @vue/cli-init
初始化项目:
2.x:vue init webpack my-project
3.x:vue create my-project
runtime-compiler
template -> ast(抽象语法树) -> render -> vdom(虚拟dom) -> UI
runtime-only(性能更高,代码量更少)
render -> vdom -> UI
vue cli 4创建项目:vue create 项目名
1 | new Vue({ |
Vue-Router
核心:改变URL页面不进行整体的刷新
单页面富应用阶段(SPA):前后端分离的基础上加上一层前端路由
路由index.js
1 | // 配置路由相关的信息 |
1. 安装vue-router
安装:npm install vue-router –save
模块化工程中使用(通过Vue.use(插件)使用)
导入路由对象,并且调用Vue.use(VueRouter)
创建路由实例,并且传入路由映射配置
在vue实例中挂载创建的路由实例
1 | import Vue from "vue"; |
2. 使用vue-router
1.创建路由组件
2.配置路由映射:组件和路径映射关系
3.使用路由:通过<router-link>和<router-view>
1 | // 3.配置路由和组件之间的应用关系 |
1 | <!-- App.vue中使用router-link和router-view --> |
通过代码方式修改路由:this.$router.push(“path”) 、this.$router.replace(“path”)
1 | <button @click="btnHome">首页</button> |
3. 动态路由
1 | <!-- user.vue --> |
1 | // 导入User组件 |
4. 路由懒加载
打包构建应用时,JavaScript包变得非常大,影响页面的加载;将不同路由对应的组件分割成不同的代码块,然后当路由被访问时在加载对应组件,就会更加高效
懒加载方式:
1.结合Vue的异步组件和webpack的代码
1 | const Home = |
2.AMD写法
1 | const About = resolve => require(['../components/About.vue'],resolve); |
3.ES6中,更简单的写法组织Vue异步组件和webpack的代码分割
1 | const Home = () => import('../components/Home.vue') |
1 | // router/index.js |
5. 嵌套路由
一个路径映射一个组件,访问这两个路径也会分别渲染两个组件
实现步骤:
创建对应的子组件,并且在路由映射中配置对应的子路由
在组件内部使用route-view标签
1 | <!-- 1.创建组件 --> |
1 | // es6配置懒加载 |
6. 传递参数
两种类型:params和query
params类型:
配置路由格式:/router/:id
传递方式:path后面跟上对应的值
传递后形成的路径:/router/xxx
取值: $route.params.id
1 | { |
query类型:
配置路由格式:/router
传递方式:对象中使用query的key作为传递方式
传递后形成的路径:/router?xxx=xxx
取值:$route.query.xxx
1 | //配置路径 |
*. 导航守卫
前置守卫:beforeEach(guard: NavigationGuard): Function
beforeEach((to, from, next) => {next()})
后置钩子:afterEach(hook: (to: Route, from: Route) => any): Function
https://router.vuejs.org/zh/guide/advanced/navigation-guards.html
动态修改标题
1 | // 全局守卫 |
*.keep-alive
keep-alive是Vue内置组件,可以使被包含的组件保留状态,或避免重新渲染
include属性:字符或正在表达式,只有匹配的组件会被缓存
exclude属性:字符或正在表达式,匹配的组件不会被缓存
include=”name,name…”
router-view也是组件,如果直接被包在keep-alive中,所有路径匹配到的视图组件都会被缓存
1 | <keep-alive> |
*当点击其他组件后,再次点击当前组件后,返回的是跳转前的状态
1 | // Home.vue |
*解决重复点击菜单跳转报错
1 | // router/index.js |
Vuex
为Vue.js应用程序开发的状态管理模式,采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化
多个组件共享时需要:用户登录状态、用户名称、商品收藏等把这些状态信息,放在统一的地方进行保存和管理(响应式)
单向数据流

state单一状态树,单一数据源https://vuex.vuejs.org/zh/guide/state.html一个项目中使用一个store,存放数据
getters类似计算属性
Mutation状态更新(同步函数):vuex的store状态的更新唯一方式,提交Mutation,Mutation主要包括两部分:字符串的事件类型,回调函数(handler),该回调函数的第一个参数就是state;事件类型:increment,回调函数(state) {};mutation更新数据时,携带参数(载荷Payload)(state,参数);使用时在组件中使用this.$store.commit(“事件类型”)进行提交封装
提交风格:
普通提交:方法中使用this.$store.commit(“事件类型”)进行提交封装
特殊提交封装:使用this.$store.commit({
type: ‘事件类型’,
参数// mutation中拿到的是个对象,payload.属性
})
Mutation响应规则:Vuex的store中的state是响应式的,当state中的数据发生改变时,Vue组件会自动更新,但必须要遵守一些Vuex对应的规则:
提前在store中初始化好所需要的属性
当给state中的对象添加新属性时,使用Vue.set(obj,key|Number,值)或者用新对象给旧对象重新赋值
1 | // store/index.js |
actions:类似Mutation,代替Mutation进行异步操作
modules:解决store对象变得臃肿,可以将store分割成模块,每个模块拥有自己的state、mutations、actions、getters等
axios
基本使用: npm install axios
1 | import Vue from "vue"; |
并发请求:
1 | // axios发送并发请求 |
全局配置:
axios.defaults.baseURL = ‘’请求根路径
axios.defaults.timeout = 超时时间(毫秒)
常见配置:
url:请求地址
method:请求类型
baseURL:请求根路径
transformRequest:[function(data)]:请求前的数据处理
transformResponse:[function(data)]:请求后的数据处理
headers:{‘x-Requested-With’:’XMLHttpRequest’}自定义请求头
params:URL查询对象
paramsSerializer:function(params){}查询对象序列化函数
data:{key:’’}:request body请求体
timeout:超时设置
withCredentials:false:跨域是否带Token
adapter:funtion(resolve, reject, config){}:自定义请求处理
auth:{}身份验证信息
responseType:’’:响应的数据格式json、blob、document、arraybuffer、text、stream
创建对应axios实例:
1 | // 创建对应axios实例 |
拦截:
请求拦截:
全局:axios.interceptors.request.use(config => {
进行操作后必须return config
}, err => {})
局部:创建的axios实例.intercetors.request.use()
响应拦截:
全局:axios.interceptors.response.use(result => {result.data}, err => {})
局部:创建的axios实例.intercetors.response.use()
webpack
安装:npm install webpack webpack-cli -g
打包:webpack [file]
使用webpack.config.js配置文件: