Vue超级知识点

Vue

生命周期

beforeCreate 创建前     找不到dom元素 data中的数据没有初始化

created 创建完成 找不到dom元素 可以找到data中的数据

beforeMount 渲染到页面(挂载)前 找不到dom元素

mounted 挂载完成 可以找到dom元素

beforeUpdate 更新前 在更新前可以做一些逻辑处理

updated 更新完成 更新后可以做一些逻辑处理

beforeDestroy卸载前 可以解绑window上的事件 或着清空sessionStorage数据

destroyed 卸完完成

vue获得事件对象 $event

@click="add" add(event){ } 此时默认第一个参数就是 event

@click ="add(index,$event)" add(index,e){ } 当有参数列表时 最后一个参数是事件对象

事件修饰符

prevent 取消默认事件

stop 取消冒泡

self 只触发自身事件

按键修饰符

.enter => enter键 .13

.tab => tab键

.delete (捕获“删除”和“退格”按键) => 删除键

.esc => 取消键

.space => 空格键

.up => 上

.down => 下

.left => 左

.right => 右

表单修饰符

v-model.trim 去掉前后空格

v-model.number 将input输入的数字值转化为number类型

v-model.lazy 失去焦点的时候 在获取绑定的值

watch

什么是watch?

watch是用来响应data中的数据的变化,一般用于异步或者开销较大的操作

- 当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听

computed

- 什么是计算属性?

计算属性是基于它们的响应式依赖进行缓存的

意思就是 (计算属性依赖的值发生变化时,会重新计算,如果依赖的值不发生变化,计算属性会使用之前缓存的值)

- computed 使用场景多用于

对多个变量或者对象进行处理后返回一个结果值,也就是多个变量中的某一个值发生了变化,则我们监控的这个值也就会发生变化

computed 和watch的区别

- 两者都能达到根据data中数据变化,就触发函数的结果。

- 计算属性是基于他们的依赖进行缓存的,只有在相关依赖发生改变时,他们才会重新求值,也就是说,只要他的依赖没有发生变化,那么每次访问的时候计算属性都会立即返回之前的计算结果,不再执行函数

- computed 多用于处理多个变量返回一个值,watch多用于异步处理或者逻辑比较复杂的处理。比如实时搜索效果

vue自定义指令

什么是自定义指令?

可以自己定义指令,在自定义指令中可以实现使用原生js方法操作dom,比如自定义拖拽功能

怎么写?

分两种全局和局部

1.全局自定义指令在Vue.directive上声明

2.局部自定义指令在组件内部 directives对象声明

3.函数 inserted 代表指令所在的dom渲染后调用

4.函数 bind 指令绑定后,dom渲染前调用

5.这两个函数都有两个参数 参数1代表 指令所在的dom节点 参数2是一个对象.value

可以找到指令接收到的参数

全局

Vue.derictive('指令名称',{
•    bind: 元素被插入文档调用,只调用一次
   inserted: 元素被渲染到页面
•           (el,binding,vnode)
•            el:      dom元素  
             binding: 自定义指令的相关信息 binding.value就是接收自定义指令传递的值
•            vnode :  虚拟dom
             update: (VNODE) 虚拟dom 更新时,或者 自定义指令 接收的值 发生变化 都会调用update
})

局部

derictives:{
• fn(){     // 函数名 时指令名
•           bind(){}
•           inserted(){}
•           update(){}
•   }
}

vue 过滤器

可以将模版语法中的数据的值进行二次处理,比如 数字取两位小数

全局

Vue.filter('过滤器名称',function(val){
  • val 参数就是 要处理的数据    {{n|filter}}
  • return  最终返回值
})

局部

        filters: {
•        capitalize: function (value) {
•            if (!value) return ''
•            value = value.toString()
•            return value.charAt(0).toUpperCase() + value.slice(1)
•        },
•        moneyFormData(val){
•            return val.toFixed(2);
•        }
•    }

vue数组的变异方法

说说什么vue中 数组的变异操作方法

当我们直接操作数组比如 this.arr[0]=1 视图是不会更新的

只有我们使用数组的变异方法视图才能更新,vue中已经把数组的大部分常用方法都进行了扩展。

$set 、$delete

不使用数组的变异方法去操作数组时,视图默认不会更新,

或者给一个对象添加新的属或删除属性时,视图也不会更新,

这是使用$set $delete 可以强制更新视图。

比如:this.$set(this.arr,0,3) 或者删除使用 this.$delete(this.arr,0); 这样就更新视图了

在比如 this.$set(this.obj,'age',20); 或者删除属性 this.$delete(this.obj,'name');

$nextTick

因为vue数据变化更新视图是异步的,所有有的时候,更新数据后获取的不是最新的dom

在修改数据之后立即使用$nextTick,可以获取更新后的 DOM。

组件通信

父子通信-父传子

在父组件中使用子组件时 ,在自组件的标签上 使用v-bind:传递的字段名=要传递的值

在自组件中 使用 props:['传递的字段名']

父子通信-子传父

在子组件中 使用$emit(‘事件名’,'要传递的参数')

在父组件中使用子组件标签时 使用 v-on:事件名 = 处理函数fn 在methods中声明 fn 形参 就是传递的参数

兄弟组件通信(事件中心 bus Vue实例)

  1. 创建bus.js文件 在里面导出vue实例

  2. 在组件中 引入bus.js

  3. 传数据的组件 使用bus.$emit(事件名,值)

  4. 接收数据的组件 使用 bus.$on(事件名,回调函数) 回调函数 的形参就是 接收到的值

Vue 路由

路由跳转两种方式

1.<router-link tag='li' to='路径' / >

  1. 编程式跳转 this.$router.push({path:路径) 注意 跳转自路由 /shop/goods

    this.$router.push('/b');

    this.$router.push({name:'路由name名称'})

路由传参 query和params的区别

区别1.

params 必须使用name跳转, 接受参数使用this.$route.params.属性名

query 跳转可以使用 path 或 name 接受参数使用this.$route.query.属性名

区别2.

query 地址栏会显示传递的参数

params 地址栏不会显示传递过来的参数

区别3.

query 刷新页面 参数不会丢失

params 刷新页面参数丢失

子路由(嵌套路由)

1.

{
•   path:'/a',
•    component:{A},
•    children:[
•       {path:xx,component:xxx}
•   ]
}
  1. 在A 组件中配置 router-view

  2. 子路由的默认路由

路由重定向

redirect:'/b1',

路由懒加载(动态路由)

写法:

const A = ()=> import('@/routerdemo/A')

const A = resolve => require(['@/routerdemo/A'],resolve) ;

原理 :

就是在webpack打包时(npm run build),会按照路模块进行打包。

优点:

路由懒加载,是在进入某个路由的时候,再去加载这个路由对应页面所需要的点静态资源。

这样的好处是项目在启动的时候,加载更快,首页显示的时间更短。

路由导航守卫 (路由钩子函数)

一、全局

1.全局前置守卫

router.beforeEach((to,from,next)=>{
•    to: 路由去的地址
•    from: 路由从哪里来的
•    next()  :默认true 是允许跳转
•    next(true);
})

2.全局后置守卫

router.afterEach((to, from)=>{}) 注意:只有两个参数 没有next

二、组件内路由守卫

beforeRouteEnter : 路由进入之前

beforeRouteUpdate : 子路由变化,或者路由参数更新

beforeRouteLeave :路由离开之前

三、独享守卫

beforeEnter: (to, from, next) => {

next();

}

四、路由守卫 结合 vuex相关问题

因为在 某些路由守卫中 无法访问 this 所以也就无法访问 this.$store

解决: 可以在使用vuex时 引入store/index.js 之后就可以使用了

路由模式

mode:'history' 地址栏没有# 需要后端配置访问路径之后才可以使用

HTML5新特性history pushState

mode:'hash' 默认模式 地址栏有#

路由元信息

meta:{key:val} 在访问这个路由时,那就可以访问 $route.meta 数据

vue过渡(动画)

< transition name="前缀名称">

  1. v-enter:在元素被插入之前的开始状态

  2. v-enter-active:定义进入时的过渡状态。

  3. v-enter-to2.1.8 版及以上定义进入过渡的结束状态。

  4. v-leave:定义即将离开时的状态。

  5. v-leave-active:定义离开时的过渡状态。

  6. v-leave-to2.1.8 版及以上定义已经离开的状态。

动态组件

component is='组件名称'

keep-alive

  1. 缓存(不会销毁,会复用)组件 。

  2. 缓存路由视图组件

keep-alive 缓存指定路由

1.在路由配置中 设置路由元信息

{

path:'/a'

component:A,

meta:{key:true}

}

2.在路由视图上设置

<!-- 当我们访问 /fenlei $route.meta.keepAlive= true -->

<keep-alive>

<router-view v-if="$route.meta.keepAlive">

</router-view>

</keep-alive>

<!-- 当我们访问 /keepalive $route.meta.keepAlive= false -->

<router-view v-if="!$route.meta.keepAlive">

**</router-view>**

vuex

state 声明vuex的数据

mutations 修改state中的数据的方法

actions 不能直接修改state中的数据,需要

                         1. 在组件中 this.$store.dispatch('actions中的方法名',参数)        
                         2. 在actions中的方法 里面进行异步处理后,使用commit() 再提交给 mutations中的方法去修改数据         

getters 相当于state的计算属性

modules 可以引入其他 vu e x 模块

plugins 使用插件 ,比如说 vuex长久储存 vuex-persist

mutations 中的方法需要 commit 触发

actions 中的方法需要 dispatch 触发

项目环境判断

process.env.NODE_ENV 是webpack中的一个变量

process.env.NODE_ENV 有两个值

development 开发环境 npm run dev

production 生产环境 nom run build

有时我们需要在代码中判断目前项目是处于开发环境、还是生产环境,然后根据不同环境执行不同的逻辑代码。比如切换接口地址

if (process.env.NODE_ENV === "development") {

// 开发环境配置

}else {

//生产环境配置

}

axios

axios({
  method: 请求方式,      
  url: 接口地址,
  data: {} post请求的参数
  params:{} get请求的参数
  baseURL: 设置接口地址前缀
  headers: {}, 修改请求头设置 content-type:
  timeout: 1000, 允许请求超时时间
  withCredentials: 默认false, 表示跨域请求时是否需要使用凭证(cookie)
  responseType: 'json', // default
  onUploadProgress: 上传进度
  onDownloadProgress:下载进度
  proxy:设置代理
  
});



{
  // `data` 由服务器提供的响应
  data: {},
  // `status` 来自服务器响应的 HTTP 状态码
  status: 200,
  // `statusText` 来自服务器响应的 HTTP 状态信息
  statusText: 'OK',
  // `headers` 服务器响应的头
  headers: {},
   // `config` 是为请求提供的配置信息
  config: {},
 // 'request'
  // `request` is the request that generated this response
  // It is the last ClientRequest instance in node.js (in redirects)
  // and an XMLHttpRequest instance the browser
  request: {}
}

请求方式有:
axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.options(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])


拦截器 
请求拦截   1.设置headers比如token验证 携带cookie  2.接口请求的loading动画

axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么   比如token验证 携带cookie  
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });
  
响应拦截  1.比如对某种返回结果进行统一处理,比如错网络误提示 2.接口请求的loading动画

// 添加响应拦截器  
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么   比如对某种返回结果进行统一处理
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

axios.all( [ axios.get('/user/12345'), axios.get('/user/12345'), axios请求] ).then(res=>{

// res=> [结果1,结果2]

})

HTTP协议

什么是http协议

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

HTTP 请求/响应的步骤:

客户端连接到Web服务器->发送Http请求->服务器接受请求并返回HTTP响应->释放连接TCP连接->客户端浏览器解析HTML内容

HTTPS的默认端口为80

请求方式

1、OPTIONS

返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性

2、HEAD

向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。

3、GET

向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url

4、POST

向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form

5、PUT

向指定资源位置上传其最新内容

6、DELETE

请求服务器删除Request-URL所标识的资源

7、TRACE

回显服务器收到的请求,主要用于测试或诊断

8、CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

request

第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.

第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息如 请求的目的地(域名)浏览器信息

第三部分:空行,请求头部后面的空行是必须的

第四部分:请求数据也叫主体,可以添加任意的其他数据。

http状态码

200 OK 当您的操作将在响应正文中返回数据时,出现此结果。

204 No Content 当您的操作成功,但不在响应正文中返回数据时,出现此结果。

304 Not Modified(重定向) 上次访问服务器之后没有变化(缓存),出现此结果。

413 Payload Too Large(客户端错误) 当请求长度过长时,出现此结果。

400 BadRequest(客户端错误) 当参数无效时,出现此结果。

404 Not Found(客户端错误) 当资源不存在时,出现此结果。

500 服务端错误

HTTPS协议

HTTPS的默认端口为443

HTTPS可以将数据加密传输,也就是传输的是密文,即便黑客在传输过程中拦截到数据也无法破译,这就保证了网络通信的安全。

promise 见全栈面试宝典

接口封装

  1. 写一个url.js文件来确定 开发环境和上线环境使用的 接口地址

  2. 基于axios进行二次封装,处理get post等请求方式,

    在axios的请求拦截中 处理token验证,loading加载动画,headers的配置处理接口地址的baseURL

    携带cookie;在axios的响应拦截中 对接口返回的数据进行统一处理,比如网络错误提示,loading处理等

  3. 使用promise 在进行封装,目的就是将异步代码同步化( promise+ await +async)

  4. 在封装一个 api.js 里面是针对业务逻辑的接口进行处理。

跨域

当浏览器和服务器存在

不同的域名,不同的协议,不同的ip地址,不同的端口号 时,进行【ajax访问】会产生【跨域】

vue在webpack中设置反响代理

可以解决跨域,原来就是浏览器访问服务器的时候会有跨域问题,可以使用反向代理搭建本地虚拟服务器

,因为服务器和服务器之间的通信没有跨域问题,所以反向代理可以解决跨域。

    `proxyTable: {`
​      `'/api': {`
​        `target: "https://elm.cangdu.org", // API服务所在IP及端口号`
​        `changeOrigin: true, // 如果设置为true,那么本地会虚拟一个服务器接收你的请求并代你发送该请求,这样就不会有跨域问题(只适合开发环境)`
​        `pathRewrite: {`
​          `'^/api': '' // 重写路径`
​        `}`
​      `}`
  `},

cookie

什么是cookie

Cookie就是浏览器端的一种存储方式,主要用于浏览器和服务器之间的数据传输。

用途 1.本地存数据,比如7天免登录。2.向服务器提交数据 requset headers => <= response headers

语法:

vue开发遇到的问题

qu er y 传参数,传对象刷新会丢失

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值