📒《vue.js 实战》读书笔记 & vue2 官方文档
五: 内置指令
…书接上篇
数组更新
修改数组
- 无法以
.属性
的方式直接修改数组或数组长度 - 使用
Vue.set()
或是this.$set()
, 或是用数组的splice
来做替换
原生事件访问参数
$event
- Vue 在事件函数中为我们提供了可以访问原生dom事件的参数
$event
- 写法:```@click=“handleCllick(‘1’,$event)”
- 同时它也是一个vue提供的特殊变量,在组件通信中中,它被用作接收事件触发的传值。
修饰符
前置复习01 — 事件冒泡和事件捕获
- 事件流的完整触发顺序:“先捕获后冒泡”
- 事件冒泡(event bubbling):触发顺序 — 自目标元素向外层父节点冒泡
- 事件捕获(event capturing):触发顺序 — 自根节点往里层目标节点去捕获
前置复习02 — 原生event API
- event.stopPropagation(); — 阻止事件冒泡和事件捕获
- event.stopImmediatePropagation(); — 阻止同一节点的同一事件的其它事件处理程序,例如:阻止某个节点定义的其余多个点击事件。
- event.preventDefault(); — 阻止默认行为
前置复习03 — 事件委托(也叫 事件代理)
- 概念:把原需绑定在子元素的事件(click、keydown…)委托给父元素,让父元素担当事件监听的职务。其原理是事件冒泡。
- 比如:在ul上代理所有li的click事件。
- 优点:
- 减少事件注册,大量节省内存占用。
- 实现了动态绑定事件,即新增子节点时无需再次对其作事件绑定。
写法
@click.stop=“handle”
- 可以串联:
@click.stop.prevent=“handle”
归纳
- .stop :阻止事件冒泡
- .capture:设置事件捕获(一般在父级去添加)
- .prevent:阻止默认行为
- .self:只在事件目标元素本身执行,即event.target 是当前元素自身(冒泡和捕获均不会执行)
- .once:只触发一次
- .passive:立即触发默认行为
- .keyup: 键盘按键事件 (比如 .keyup.enter 、.keyup.13),修饰键(即组合键,比如:.keyup.shift.83)
- .exact: 精确控制的按键组合(比如:.ctrl.exact ,有且只有ctrl被按下的时候触发)
- 鼠标按钮修饰符:.left .right .middle(仅响应指定的鼠标行为)
实战:购物车
需求分析
基础需求
- 展示一个已加入购物车的商品列表
- 每行列表包含商品的 名称、单价、数量、操作
- 实时显示商品总价
- 数量列 可以 +和-
- 操作列 删除按钮
- data层面:数据从接口动态获取、每个数据对象包含唯一ID
迭代需求
- 增加选中和全选
- 商品总价是选中商品的总价
- data 变为二维数组
六:表单与 v-model
v-model
作用:
- 该指令用于在表单类元素上实现双向绑定
- 用于自定义组件的值的双向绑定
原理:v-bind(绑定属性) 与 v-on(触发事件) 的语法糖
修饰符:
- .lazy:在“change” 而非“input” 时候触发
- . number:将输入值转为数值类型
- . trim:去掉输入值收尾的空格
.sync 修饰符
- 在Vue2中,由于一个组件只支持一个v-model,当我们还有另外的值也想要实现双向绑定更新时,往往用.sync修饰符来实现,而在Vue3中该修饰符已被废弃,因为v-model可以支持多个,所以.sync也就没有存在的必要了。
七:组件
组件注册
- 全局注册:通过
Vue.component()
- 局部注册:通过实例的component选项
组件传值
父传子 (props)
子传父
- 触发事件:子组件使用$emit来触发事件,父组件则通过v-on来监听接收这个事件
- 抛出参数:
- 子组件`$emit('enlarge-text', 0.1))`
- 接收参数:
- 父组件通过$event取到这个参数值 `v-on:enlarge-text="postFontSize += $event"`
- 更多时候,父组件监听的是一个方法,那么在方法体的第一个参数就是接受的该参数值
单文件组件 (.vue 文件)
极简写法: html: pug(jade) + css: unocss/stylus
is 与 动态组件
插槽slot
vue2 技术栈面试题
vue 2.0 核心
响应式原理
答案
- 通过 Object.defineProperty 对每个属性进行监听,当对属性进行读取的时候,就会触发 getter,对属性进行设置的时候,就会触发 setter。
- 为了可以监测对象 ,Vue2 创建了一个 Observer 类
- Vue2 对数组的监测,是通过重写数组原型上的 7 个方法来实现
- 实际上 Object.defineProperty 可以做到通过下标的形式可以监听数组,但却无法监听到所有数组的操作。
- vue3 使用 proxy API 对数据实现 getter/setter 代理 ,原生支持对于数组和对象的监听。
vue 生命周期
答案
8个阶段:创建前/后,载入前/后,更新前/后,销毁前/后。
- beforeCreate:vue实例的挂载el未定义,data未定义
- created:data已经定义,但未初始化。通常在这个阶段进行一些数据、资源的请求。
- beforeMounted:
- mounted: 实例挂载完毕。可以进行一些DOM操作。
- beforeUpdate: 在数据发生改变后,DOM 被更新之前被调用。
- updated: DOM重新渲染完毕之后被调用
- beforeDestroy:组件实例销毁之前调用。
- destroyed:实例销毁后调用。可以执行一些性能优化操作,清空计时器,解除绑定事件
activated:被 keep-alive 缓存的组件激活时调用。 deactivated: 被 keep-alive 缓存的组件失活时调用。
data为什么只能是函数
答案
如果是对象,由于是引用类型,每个组件的data都指向内存的同一个地址,一个数据改变 其他的也都被影响
组件通信
答案
- 父传子:props 接受传值
- 子传父:$emit 事件发送
- 兄弟组件: 中央总线 event bus,
on接受
$nextTick 的作用
答案
保证整个视图都被渲染之后才会运行其中的代码
刷新页面后vuex值丢失
答案
原因:因为store里的数据是保存在运行内存中的,当页面刷新会重载vue实例,store里面的数据就会被初始化 解决:将state的数据保存在localstorage、sessionstorage或cookie中
vue router
权限控制
接口权限 采用 JWT(Json Web Token)做接口权限校验。没有通过就返回401,路由挑转至登陆页做登陆鉴权, 登录完拿到token存起来。通过axios请求拦截器进行拦截,每次请求时候头部携带token。
jsaxios.interceptors.request.use(config => { config.headers['token'] = cookie.get('token') return config }) axios.interceptors.response.use(res=>{},{response}=>{ if (response.data.code === 40099 || response.data.code === 40098) { //token过期或者错误 router.push('/login') } })
按钮权限
- 通过自定义指令的方式 通过路由权限去动态渲染按钮
路由菜单权限
- 前端定义路由、做路由守卫,与后端返回的菜单信息做比对
- 两种方式:
- 动态生成路由表(addRoutes)
- 路由元信息(meta)里添加roles
怎么重定向页面
答案
在路由配置里添加redirect跳转url
const router = new VueRouter({ routes: [ { path: '/a', redirect: '/b' } ] })
实战技巧
局部刷新
- 用key属性来刷新组件,将key存储到vuex,每次刷新页面,只需要更新key进行+1