Vue 开发必须知道的 36 个技巧【近1W字】,2024年最新前端面试宝典pdf

2.6.0 新增 1.slot,slot-cope,scope 在 2.6.0 中都被废弃,但未被移除 2.作用就是将父组件的 template 传入子组件 3.插槽分类: A.匿名插槽(也叫默认插槽): 没有命名,有且只有一个;

// 父组件

任意内容

我是匿名插槽

// 子组件

我是默认值

//v-slot:default写上感觉和具名写法比较统一,容易理解,也可以不用写

复制代码

B.具名插槽: 相对匿名插槽组件slot标签带name命名的;

// 父组件

任意内容

我是匿名插槽

//子组件

我是默认值

复制代码

C.作用域插槽: 子组件内数据可以被父页面拿到(解决了数据只能从父页面传递给子组件)

// 父组件

{{slotProps.user.firstName}}

//slotProps 可以随意命名

//slotProps 接取的是子组件标签slot上属性数据的集合所有v-bind:user=“user”

// 子组件

{{ user.lastName }}

data() {

return {

user:{

lastName:“Zhang”,

firstName:“yue”

},

test:[1,2,3,4]

}

},

// {{ user.lastName }}是默认数据 v-slot:todo 当父页面没有(=“slotProps”)

复制代码

3.11 EventBus


1.就是声明一个全局Vue实例变量 EventBus , 把所有的通信数据,事件监听都存储到这个变量上; 2.类似于 Vuex。但这种方式只适用于极小的项目 3.原理就是利用emit 并实例化一个全局 vue 实现数据共享

// 在 main.js

Vue.prototype.$eventBus=new Vue()

// 传值组件

this. e v e n t B u s . eventBus. eventBus.emit(‘eventTarget’,‘这是eventTarget传过来的值’)

// 接收组件

this. e v e n t B u s . eventBus. eventBus.on(“eventTarget”,v=>{

console.log(‘eventTarget’,v);//这是eventTarget传过来的值

})

复制代码

4.可以实现平级,嵌套组件传值,但是对应的事件名eventTarget必须是全局唯一的

3.12 broadcast和dispatch


vue 1.x 有这两个方法,事件广播和派发,但是 vue 2.x 删除了 下面是对两个方法进行的封装

function broadcast(componentName, eventName, params) {

this.$children.forEach(child => {

var name = child.$options.componentName;

if (name === componentName) {

child.$emit.apply(child, [eventName].concat(params));

} else {

broadcast.apply(child, [componentName, eventName].concat(params));

}

});

}

export default {

methods: {

dispatch(componentName, eventName, params) {

var parent = this.$parent;

var name = parent.$options.componentName;

while (parent && (!name || name !== componentName)) {

parent = parent.$parent;

if (parent) {

name = parent.$options.componentName;

}

}

if (parent) {

parent.$emit.apply(parent, [eventName].concat(params));

}

},

broadcast(componentName, eventName, params) {

broadcast.call(this, componentName, eventName, params);

}

}

}

复制代码

3.13 路由传参


1.方案一

// 路由定义

{

path: ‘/describe/:id’,

name: ‘Describe’,

component: Describe

}

// 页面传参

this.$router.push({

path: /describe/${id},

})

// 页面获取

this.$route.params.id

复制代码

2.方案二

// 路由定义

{

path: ‘/describe’,

name: ‘Describe’,

omponent: Describe

}

// 页面传参

this.$router.push({

name: ‘Describe’,

params: {

id: id

}

})

// 页面获取

this.$route.params.id

复制代码

3.方案三

// 路由定义

{

path: ‘/describe’,

name: ‘Describe’,

component: Describe

}

// 页面传参

this.$router.push({

path: ‘/describe’,

query: {

id: id

`}

)

// 页面获取

this.$route.query.id

复制代码

4.三种方案对比 方案二后面参数页面刷新会丢失 方案一参数拼接在后面,丑,而且暴露了信息 方案三不会在后面拼接参数,刷新参数也不会丢失

3.14 Vue.observable


2.6.0 新增 用法:让一个对象可响应。Vue 内部会用它来处理 data 函数返回的对象; 返回的对象可以直接用于渲染函数和计算属性内,并且会在发生改变时触发相应的更新; 也可以作为最小化的跨组件状态存储器,用于简单的场景。 通讯原理实质上是利用Vue.observable实现一个简易的 vuex

// 文件路径 - /store/store.js

import Vue from ‘vue’

export const store = Vue.observable({ count: 0 })

export const mutations = {

setCount (count) {

store.count = count

}

}

//使用

<button @click=“setCount(count+1)”>+

{{count}}

<button @click=“setCount(count-1)”>-

复制代码

4.render 函数

===========

1.场景:有些代码在 template 里面写会重复很多,所以这个时候 render 函数就有作用啦

// 根据 props 生成标签

// 初级

// 优化版,利用 render 函数减小了代码重复率

Hello world!

复制代码

2.render 和 template 的对比 前者适合复杂逻辑,后者适合逻辑简单; 后者属于声明是渲染,前者属于自定Render函数; 前者的性能较高,后者性能较低。

5.异步组件

======

场景:项目过大就会导致加载缓慢,所以异步组件实现按需加载就是必须要做的事啦 1.异步注册组件 3种方法

// 工厂函数执行 resolve 回调

Vue.component(‘async-webpack-example’, function (resolve) {

// 这个特殊的 require 语法将会告诉 webpack

// 自动将你的构建代码切割成多个包, 这些包

// 会通过 Ajax 请求加载

require([‘./my-async-component’], resolve)

})

// 工厂函数返回 Promise

Vue.component(

‘async-webpack-example’,

// 这个 import 函数会返回一个 Promise 对象。

() => import(‘./my-async-component’)

)

// 工厂函数返回一个配置化组件对象

const AsyncComponent = () => ({

// 需要加载的组件 (应该是一个 Promise 对象)

component: import(‘./MyComponent.vue’),

// 异步组件加载时使用的组件

loading: LoadingComponent,

// 加载失败时使用的组件

error: ErrorComponent,

// 展示加载时组件的延时时间。默认值是 200 (毫秒)

delay: 200,

// 如果提供了超时时间且组件加载也超时了,

// 则使用加载失败时使用的组件。默认值是:Infinity

timeout: 3000

})

复制代码

异步组件的渲染本质上其实就是执行2次或者2次以上的渲染, 先把当前组件渲染为注释节点, 当组件加载成功后, 通过 forceRender 执行重新渲染。或者是渲染为注释节点, 然后再渲染为loading节点, 在渲染为请求完成的组件

2.路由的按需加载

webpack< 2.4 时

{

path:‘/’,

name:‘home’,

components:resolve=>require([‘@/components/home’],resolve)

}

webpack> 2.4 时

{

path:‘/’,

name:‘home’,

components:()=>import(‘@/components/home’)

}

import()方法由es6提出,import()方法是动态加载,返回一个Promise对象,then方法的参数是加载到的模块。类似于Node.js的require方法,主要import()方法是异步加载的。

复制代码

6.动态组件

======

场景:做一个 tab 切换时就会涉及到组件动态加载

复制代码

但是这样每次组件都会重新加载,会消耗大量性能,所以 就起到了作用

复制代码

这样切换效果没有动画效果,这个也不用着急,可以利用内置的

复制代码

7.递归组件

======

场景:如果开发一个 tree 组件,里面层级是根据后台数据决定的,这个时候就需要用到动态组件

// 递归组件: 组件在它的模板内可以递归的调用自己,只要给组件设置name组件就可以了。

// 设置那么House在组件模板内就可以递归使用了,不过需要注意的是,

// 必须给一个条件来限制数量,否则会抛出错误: max stack size exceeded

// 组件递归用来开发一些具体有未知层级关系的独立组件。比如:

// 联级选择器和树形控件

子组件,当前层级值: {{index}}

复制代码

递归组件必须设置name 和结束的阀值

8.函数式组件

=======

定义:无状态,无法实例化,内部没有任何生命周期处理方法 规则:在 2.3.0 之前的版本中,如果一个函数式组件想要接收 prop,则 props 选项是必须的。 在 2.3.0 或以上的版本中,你可以省略 props 选项,所有组件上的特性都会被自动隐式解析为 prop 在 2.5.0 及以上版本中,如果你使用了单文件组件(就是普通的.vue 文件),可以直接在 template 上声明functional 组件需要的一切都是通过 context 参数传递

context 属性有: 1.props:提供所有 prop 的对象 2.children: VNode 子节点的数组 3.slots: 一个函数,返回了包含所有插槽的对象 4.scopedSlots: (2.6.0+) 一个暴露传入的作用域插槽的对象。也以函数形式暴露普通插槽。 5.data:传递给组件的整个数据对象,作为 createElement 的第二个参数传入组件 6.parent:对父组件的引用 7.listeners: (2.3.0+) 一个包含了所有父组件为当前组件注册的事件监听器的对象。这是 data.on 的一个别名。 8.injections: (2.3.0+) 如果使用了 inject 选项,则该对象包含了应当被注入的属性

{{item}}

复制代码

9.components和 Vue.component

===========================

components:局部注册组件

export default{

components:{home}

}

复制代码

Vue.component:全局注册组件

Vue.component(‘home’,home)

复制代码

10.Vue.extend

=============

场景:vue 组件中有些需要将一些元素挂载到元素上,这个时候 extend 就起到作用了 是构造一个组件的语法器 写法:

// 创建构造器

var Profile = Vue.extend({

template: ‘

{{extendData}}实例传入的数据为:{{propsExtend}}

’,//template对应的标签最外层必须只有一个标签

data: function () {

return {

extendData: ‘这是extend扩展的数据’,

}

},

props:[‘propsExtend’]

})

// 创建的构造器可以挂载到元素上,也可以通过 components 或 Vue.component()注册使用

// 挂载到一个元素上。可以通过propsData传参.

new Profile({propsData:{propsExtend:‘我是实例传入的数据’}}).$mount(‘#app-extend’)

// 通过 components 或 Vue.component()注册

Vue.component(‘Profile’,Profile)

复制代码

11.mixins

=========

场景:有些组件有些重复的 js 逻辑,如校验手机验证码,解析时间等,mixins 就可以实现这种混入 mixins 值是一个数组

const mixin={

created(){

this.dealTime()

},

methods:{

dealTime(){

console.log(‘这是mixin的dealTime里面的方法’);

}

}

}

export default{

mixins:[mixin]

}

复制代码

12.extends

==========

extends用法和mixins很相似,只不过接收的参数是简单的选项对象或构造函数,所以extends只能单次扩展一个组件

const extend={

created(){

this.dealTime()

},

methods:{

dealTime(){

console.log(‘这是mixin的dealTime里面的方法’);

}

}

}

export default{

extends:extend

}

复制代码

13.Vue.use()

============

场景:我们使用 element时会先 import,再 Vue.use()一下,实际上就是注册组件,触发 install 方法; 这个在组件调用会经常使用到; 会自动组织多次注册相同的插件.

14.install

==========

场景:在 Vue.use()说到,执行该方法会触发 install 是开发vue的插件,这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象(可选)

var MyPlugin = {};

MyPlugin.install = function (Vue, options) {

// 2. 添加全局资源,第二个参数传一个值默认是update对应的值

Vue.directive(‘click’, {

bind(el, binding, vnode, oldVnode) {

//做绑定的准备工作,添加时间监听

console.log(‘指令my-directive的bind执行啦’);

},

inserted: function(el){

//获取绑定的元素

console.log(‘指令my-directive的inserted执行啦’);

},

update: function(){

//根据获得的新值执行对应的更新

//对于初始值也会调用一次

console.log(‘指令my-directive的update执行啦’);

},

componentUpdated: function(){

console.log(‘指令my-directive的componentUpdated执行啦’);

},

unbind: function(){

//做清理操作

//比如移除bind时绑定的事件监听器

console.log(‘指令my-directive的unbind执行啦’);

}

})

// 3. 注入组件

Vue.mixin({

created: function () {

console.log(‘注入组件的created被调用啦’);

console.log(‘options的值为’,options)

}

})

// 4. 添加实例方法

Vue.prototype.$myMethod = function (methodOptions) {

console.log(‘实例方法myMethod被调用啦’);

}

}

//调用MyPlugin

Vue.use(MyPlugin,{someOption: true })

//3.挂载

new Vue({

el: ‘#app’

});

复制代码

更多请戳 vue中extend,mixins,extends,components,install的几个操作

15. Vue.nextTick

=================

2.1.0 新增 场景:页面加载时需要让文本框获取焦点 用法:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM

mounted(){ //因为 mounted 阶段 dom 并未渲染完毕,所以需要$nextTick

this.$nextTick(() => {

this.$refs.inputs.focus() //通过 $refs 获取dom 并绑定 focus 方法

})

}

复制代码

16.Vue.directive

================

16.1 使用


场景:官方给我们提供了很多指令,但是我们如果想将文字变成指定的颜色定义成指令使用,这个时候就需要用到Vue.directive

// 全局定义

Vue.directive(“change-color”,function(el,binding,vnode){

el.style[“color”]= binding.value;

})

// 使用

{{message}}

复制代码

16.2 生命周期


1.bind 只调用一次,指令第一次绑定到元素时候调用,用这个钩子可以定义一个绑定时执行一次的初始化动作。 2.inserted:被绑定的元素插入父节点的时候调用(父节点存在即可调用,不必存在document中) 3.update: 被绑定与元素所在模板更新时调用,而且无论绑定值是否有变化,通过比较更新前后的绑定值,忽略不必要的模板更新 4.componentUpdate :被绑定的元素所在模板完成一次更新更新周期的时候调用 5.unbind: 只调用一次,指令月元素解绑的时候调用

17. Vue.filter

===============

场景:时间戳转化成年月日这是一个公共方法,所以可以抽离成过滤器使用

// 使用

// 在双花括号中

{{ message | capitalize }}

// 在 v-bind

// 全局注册

Vue.filter(‘stampToYYMMDD’, (value) =>{

// 处理逻辑

})

// 局部注册

filters: {

stampToYYMMDD: (value)=> {

// 处理逻辑

}

}

// 多个过滤器全局注册

// /src/common/filters.js

let dateServer = value => value.replace(/(\d{4})(\d{2})(\d{2})/g, ‘$1-$2-$3’)

export { dateServer }

// /src/main.js

import * as custom from ‘./common/filters/custom’

Object.keys(custom).forEach(key => Vue.filter(key, custom[key]))

复制代码

18.Vue.compile

==============

场景:在 render 函数中编译模板字符串。只在独立构建时有效

var res = Vue.compile(‘

{{ msg }}
’)

new Vue({

data: {

msg: ‘hello’

},

render: res.render,

staticRenderFns: res.staticRenderFns

})

复制代码

19.Vue.version

==============

场景:有些开发插件需要针对不同 vue 版本做兼容,所以就会用到 Vue.version 用法:Vue.version()可以获取 vue 版本

var version = Number(Vue.version.split(‘.’)[0])

if (version === 2) {

// Vue v2.x.x

} else if (version === 1) {

// Vue v1.x.x

} else {

// Unsupported versions of Vue

}

复制代码

20.Vue.set()

============

场景:当你利用索引直接设置一个数组项时或你修改数组的长度时,由于 Object.defineprototype()方法限制,数据不响应式更新 不过vue.3.x 将利用 proxy 这个问题将得到解决 解决方案:

// 利用 set

this.$set(arr,index,item)

// 利用数组 push(),splice()

复制代码

21.Vue.config.keyCodes

======================

场景:自定义按键修饰符别名

// 将键码为 113 定义为 f2

Vue.config.keyCodes.f2 = 113;

<input type=“text” @keyup.f2=“add”/>

复制代码

22.Vue.config.performance

=========================

场景:监听性能

Vue.config.performance = true

复制代码

只适用于开发模式和支持 performance.mark API 的浏览器上

23.Vue.config.errorHandler

==========================

1.场景:指定组件的渲染和观察期间未捕获错误的处理函数 2.规则: 从 2.2.0 起,这个钩子也会捕获组件生命周期钩子里的错误。同样的,当这个钩子是 undefined 时,被捕获的错误会通过 console.error 输出而避免应用崩溃 从 2.4.0 起,这个钩子也会捕获 Vue 自定义事件处理函数内部的错误了 从 2.6.0 起,这个钩子也会捕获 v-on DOM 监听器内部抛出的错误。另外,如果任何被覆盖的钩子或处理函数返回一个 Promise 链 (例如 async 函数),则来自其 Promise 链的错误也会被处理 3.使用

Vue.config.errorHandler = function (err, vm, info) {

// handle error

// info 是 Vue 特定的错误信息,比如错误所在的生命周期钩子

// 只在 2.2.0+ 可用

}

复制代码

24.Vue.config.warnHandler

=========================

2.4.0 新增 1.场景:为 Vue 的运行时警告赋予一个自定义处理函数,只会在开发者环境下生效 2.用法:

Vue.config.warnHandler = function (msg, vm, trace) {

// trace 是组件的继承关系追踪

}

复制代码

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

最后

面试一面会问很多基础问题,而这些基础问题基本上在网上搜索,面试题都会很多很多。最好把准备一下常见的面试问题,毕竟面试也相当与一次考试,所以找工作面试的准备千万别偷懒。面试就跟考试一样的,时间长了不复习,现场表现肯定不会太好。表现的不好面试官不可能说,我猜他没发挥好,我录用他吧。

96道前端面试题:

常用算法面试题:

前端基础面试题:
内容主要包括HTML,CSS,JavaScript,浏览器,性能优化

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

info 是 Vue 特定的错误信息,比如错误所在的生命周期钩子

// 只在 2.2.0+ 可用

}

复制代码

24.Vue.config.warnHandler

=========================

2.4.0 新增 1.场景:为 Vue 的运行时警告赋予一个自定义处理函数,只会在开发者环境下生效 2.用法:

Vue.config.warnHandler = function (msg, vm, trace) {

// trace 是组件的继承关系追踪

}

复制代码

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-rd4G4leO-1712772196507)]
[外链图片转存中…(img-zFfIsddE-1712772196508)]
[外链图片转存中…(img-Q9k2vcAe-1712772196508)]
[外链图片转存中…(img-SN1uq9kB-1712772196509)]
[外链图片转存中…(img-zJQ7goAQ-1712772196509)]
[外链图片转存中…(img-0TkvH3af-1712772196509)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-o97RPmTh-1712772196510)]

最后

面试一面会问很多基础问题,而这些基础问题基本上在网上搜索,面试题都会很多很多。最好把准备一下常见的面试问题,毕竟面试也相当与一次考试,所以找工作面试的准备千万别偷懒。面试就跟考试一样的,时间长了不复习,现场表现肯定不会太好。表现的不好面试官不可能说,我猜他没发挥好,我录用他吧。

96道前端面试题:

  • [外链图片转存中…(img-HFoNgTaZ-1712772196510)]

常用算法面试题:

  • [外链图片转存中…(img-JOEf1Il6-1712772196510)]

前端基础面试题:
内容主要包括HTML,CSS,JavaScript,浏览器,性能优化

  • [外链图片转存中…(img-5tur9OWW-1712772196511)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-dxXMU3KI-1712772196511)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值