父传递子 在父组件中给子组件标签上绑定一个属性,属性上挂在需要传递的值 在子组件通过peops:[“自定义属性名”]来接收数据
子传递父
(1)在父组件中给子组件标签绑定一个自定义事件,给这个事件 挂载需要调用的方法
(2)在子组件的方法通过this.$emit(’自定义事件名‘)来调用这个方法
兄弟组件通信
(1)创建一个空的vue实例BUS
(2)通过BUS.$emit(‘事件名‘)传到空的vue实例中
(3)通过BUS.$on(‘事件名’,(参数)>{挂载从子1传来的数据})来接收
自定义指令分为:全局自定义指令,局部自定义指令。
Vue.directive('focus',{bind(el,binding){},inserted(){}})
进行全局自定义指令钩子函数
一个指令定义对象可以提供如下几个钩子函数 (均为可选):
inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
unbind:只调用一次,指令与元素解绑时调用。
请简单说一下vue路由的原理?
Vue的路由实现:hash模式 和 history模式
hash模式:在浏览器中符号“#”,#以及#后面的字符称之为hash,用window.location.hash读取;
特点:
history模式:history采用HTML5的新特性;且提供了两个新方法:pushState(),replaceState()可以对浏览器历史记录栈进行修改,以及popState事件的监听到状态变更。
特点:
2. 路由守卫的钩子函数都有哪些?分别是什么意思?
vue-router全局有三个守卫:
组件内的守卫:
3. 路由守卫钩子函数里面的三个参数分别是什么?
**作用:**当我们路由切换到一个组件里面,如果没有权限,不让进入,有权限可以进入
三种:
接收:
因为组件是用来复用的,且js里对象是引用关系,
如果组件中的data是一个对象,那么这样作用域没有隔离,子组件中的data属性值会互相影响,
如果组件中data选项是一个函数,那么每个实例可以维护一份被返回对象的独立的拷贝,组件实例之间的data属性值不会被互相影响;
而new Vue的实例是不会被复用的,因此不存在引用对象的问题
相同点:都可以动态控制着dom元素的显示隐藏
区别:v-if
: 控制DOM元素的显示隐藏是将DOM元素整个添加或删除
;
**`v-show`:** 控制DOM 的显示隐藏是为DOM元素添加css的样式`display`,设置`none`或者是`block`,`DOM元素是还存在的`
性能对比:v-if
有更高的切换消耗;
v-show
有更高的初始渲染消耗
使用场景:v-if
适合运营条件不大可能改变的场景下;
v-show
适合频繁切换;
beforeCreate( 创建前 )
此时组件的选项对象还未创建,el 和 data 并未初始化,
created(创建后)
Vue里的数据在内存中已经创建完毕,但是还没有渲染到页面上。
可做操作:从服务器获取一些初始化的数据,或者通过ajax向服务器发送一些数据
beforeMount(挂载前)
完成了 el 和 data 初始化
mounted(挂在后)
数据已经渲染在了浏览器的页面上。
可做操作:操作DOM节点)
beforeDestory(销毁前)
一般在这一步做一些重置的操作比如清除掉组件中的定时器
实例仍然完全可用,,和监听的dom
destory(销毁后)
此时移除定时器或者事件绑定
(此时状态:奄奄一息。。但是销毁的时候需要手动销毁:)
beforeupdated(更新前)
虚拟 DOM 重新渲染之前
,可以在该钩子中进一步地更改状态
updated(更新后)
页面发生变化的时候才触发此声明周期函数。
使用v-model来实现
vue双向数据绑定原理,又称vue响应式原理,双向数据绑定是通过数据劫持结合发布订阅模式的方式来实现的,
第一步:创建一个监听者,Observer,监听属性变化,当属性变化的时候,通知订阅者。
第二步:创建一个订阅者,watcher 用来接收属于变化的通知并且执行相对应的方法,然后更新视图view。
第三部,创建一个解析器,compile ,可以扫描和解析每一个节点相关指令,还可以,初始化模板数据,和初始化相关订阅者
Vuex 是一个专为 Vue.js 应用程序开发的**状态管理模式**。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一 种可预测的方式发生变化。
概念:MVVM
是 Model-View-ViewModel
的缩写,分别对应着:数据,视图,视图模型。Model是我们应用中的数据模型,View是我们的UI视图层,通过ViewModle,可以把我们Modle中的数据映射到View视图上,同时,在View层修改了一些数据,也会反应更新我们的Modle。简单理解就是双向数据绑定
,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。
以vue为例:
view
对应 template
,vm
对应 new Vue({…})
,model
对应 data
View:视图层;
Model:业务数据层;
Controller: 控制器。接收View层传递过来的指令,选取Model层对应的数据,进行相应操作。
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。
每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。
总结:
vue2 的双向数据绑定是利用ES5 的一个 API Object.definePropert()
对数据进行劫持 结合 发布订阅模式的方式来实现的。
vue3 中使用了 es6 的 Proxy
API 对数据代理。
相比于vue2.x,使用proxy的优势如下
- defineProperty只能监听某个属性,不能对全对象监听
- 可以省去for in、闭包等内容来提升效率(直接绑定整个对象即可)
- 可以监听数组,不用再去单独的对数组做特异性操作 vue3.x可以检测到数组内部数据的变化
在 2.x 版本里,不管数据多大,都会在一开始就为其创建观察者。当数据很大时,这可能会在页面载入时造成明显的性能压力。3.x 版本,只会对「被用于渲染初始可见部分的数据」创建观察者,而且 3.x 的观察者更高效。
比例来说:2.x 版本中,使用 Vue.set 来给对象新增一个属性时,这个对象的所有 watcher 都会重新运行;3.x 版本中,只有依赖那个属性的 watcher 才会重新运行。
应用场景?
被keep-alive包裹的动态组件会缓存不活动的实例,再次被调用这些被缓存的实例会被再次复用,对于我们的某些不是需要实时更新的页面来说减少了性能上的消耗
虚拟DOM
它是一个Object对象模型,用来模拟真实dom节点的结构
作用:用来高效的渲染页面,减少不必要的DOM操作 提高渲染效率
diff 算法 :
diff算法会从根节点开始,一层层的向下比较,如果在某一层的某个节点发现不同了,他就会直接替换这个节点下面的所有子树。
作用:用来做比对两次vdom结构,
localStorage 生命周期是永久,这意味着除非用户显示在浏览器提供的UI 上清除 localStorage 信息,否则这些信息将永远存在。
sessionStorage 仅在当前会话下有效,关闭页面或浏览器后被清除
Cookie就是我们所理解的缓存,本地缓存;
简单来说,为了让服务器记住客户端,服务器会给客户端一串字符串,这串字符串就是cookie。 用于登录时记住密码
npm install axios; // 安装axios复制代码
目录创建
一般我会在项目的src目录中,新建一个network文件夹,作为我们的网络请求模块,然后在里面新建一个http.js和一个api.js文件和一个reques.js。http.js文件用来封装我们的axios,api.js用来统一管理我们的接口url, request.js对外暴露我们放在的api方法
环境的切换
我们的项目环境可能有开发环境、测试环境和生产环境。我们通过node的环境变量来匹配我们的默认的接口url前缀。axios.defaults.baseURL可以设置axios的默认请求地址
设置请求超时
通过axios.defaults.timeout设置默认的请求超时时间。例如超过了10s,就会告知用户当前请求超时,请刷新等。
我们在发送请求前可以进行一个请求的拦截,
这里说一下token,一般是在登录完成之后,将用户的token通过localStorage或者cookie存在本地,然后用户每次在进入页面的时候(即在main.js中),会首先从本地存储中读取token,如果token存在说明用户已经登陆过,则更新vuex中的token状态。然后,在每次请求接口的时候,都会在请求的header中携带token,后台人员就可以根据你携带的token来判断你的登录是否过期,如果没有携带,则说明没有登录过。
响应的拦截
响应拦截器很好理解,就是服务器返回给我们的数据,我们在拿到之前可以对他进行一些处理
1,require是CommonJS规范的模块化语法,import是ECMAScript 6规范的模块化语法;
2,require是运行时加载,import是编译时加载;
3,require可以写在代码的任意位置,import只能写在文件的最顶端且不可在条件语句或函数作用域中使用;
4,require通过module.exports导出的值就不能再变化,import通过export导出的值可以改变;
5;require通过module.exports导出的是exports对象,import通过export导出是指定输出的代码;
6,require运行时才引入模块的属性所以性能相对较低,import编译时引入模块的属性所所以性能稍高。
require的使用
定义模块:module变量代表当前模块,它的exports属性是对外的接口。通过exports可以将模块从模块中导出,其他文件加载该模块实际上就是读取module.exports变量,他们可以是变量、函数、对象等。在node中如果用exports进行导出的话系统会系统帮您转成module.exports的,只是导出需要定义导出名。
import的使用
定义模块:在模块中可以使用export关键字可以将变量、对象、函数、类等从模块中导出,再通过import语句就可以使用它们。一个模块中只能有一个默认导出export defaultX,但是可以有多个export导出。
methods 中都是封装好的函数,无论是否有变化只要触发就会执行
适用场景:组件中功能的封装,逻辑处理
computed: 是 vue 的计算属性,可以对 data 中的依赖项再重新计算得到一个新值应用到视图中
适用场景: 购物车商品结算的时候
Watch 是监听 data 和计算属性中的新旧变化
适用场景:当一条数据影响多条数据的时候就需要用watch搜索数据
、、、、、、
① 200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
② 404:(客户端问题)请求的资源没有找到 400: 语义有误,当前请求无法被服务器理解。401: 当前请求需要用户验证 403: 服务器已经理解请求,但是拒绝执行它。
③ 500:(服务端问题)请求资源找到了,但服务器内部发生了不可预期的错误;
④ 301/302/303:(网站搬家了,跳转)重定向
⑤ 304: Not Modified,代表上次的文档已经被缓存了,还可以继续使用。如果你不想使用本地缓存可以用Ctrl+F5 强制刷新页面
1、HTTP是超文本传输协议,信息是明文传输,HTTPS是具有安全性的SSL加密传输协议。
2、HTTPS协议需要ca申请证书,一般免费证书少,因而需要一定费用。
3、HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样。前者是80,后者是443。
4、HTTP连接是无状态的,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,安全性高于HTTP协议。