编程技术文章分享与教程

网站首页 > 技术文章 正文

Vue常见的面试知识点汇总(上)「附答案」

hmc789 2024-11-17 11:22:45 技术文章 2 ℃


作者:东起

转发链接:https://zhuanlan.zhihu.com/p/103763164

目录

Vue常见的面试知识点汇总(上)【附答案】本篇

Vue常见的面试知识点汇总(下)「附答案」

1. 页面中定义一个定时器,在哪个阶段清除?

答案:在 beforeDestroy 中销毁定时器。

①为什么销毁它:

在页面a中写了一个定时器,比如每隔一秒钟打印一次1,当我点击按钮进入页面b的时候,会发现定时器依然在执行,这是非常消耗性能的。

②解决方案1:

mounted(){
 this.timer = setInterval(()=>{
    console.log(1)
 },1000)
},
beforeDestroy(){
 clearInterval(this.timer)
}

方案1 有两点不好的地方,引用尤大的话来说就是:

它需要在这个组件实例中保存这个 timer,如果可以的话最好只有生命周期钩的可以访问到它。这并不算严重的问题,但是它可以被视为杂物。

我们的建立代码独立于我们的清理代码,这使得我们比较难于程序化的清理我们建立的所有东西。

方案2(推荐):该方法是通过$once这个事件侦听器在定义完定时器之后的位置来清除定时器

mounted(){
 const timer = setInterval(()=>{
    console.log(1)
 },1000)
 this.$once('hook:beforeDestroy',()=>{
  clearInterval(timer)
 })
}

官网参考链接:https://cn.vuejs.org/v2/guide/components-edge-cases.html


2. 附组件如何获取的组件的数据,子组件如何获取父组件的数据,父子组件如何传值?

① 先说,父组件如何主动获取子组件的数据?

方案1:$children

$children用来访问子组件实例,要知道一个组件的子组件可能是不唯一的,所以它的返回值是数组。

现在,我们定义Header,HelloWorld两个组件

<template>
  <div class="index">
    <Header></Header>
    <HelloWorld :message="message"></HelloWorld>
    <button @click="goPro">跳转</button>
  </div>
</template>
mounted(){
 console.log(this.$children)
}

打印的是一个数组,可以用foreach分别得到所需要的的数据

缺点:

无法确定子组件的顺序,也不是响应式的。如果你确切的知道要访问子组件建议使用$refs。

方案2 : $refs

<HelloWorld ref="hello" :message="message"></HelloWorld>

调用helloworld的组件的时候直接定义一个ref,这样就可以通过this.$refs获取所需要的的数据。

this.$refs.hello.属性
this.$refs.hello.方法

②子组件如何主动获取父组件中的数据?

通过 : $parent

$parent用来访问父组件实例,通常父组件都是唯一确定的,跟$children类似

this.$parent.属性
this.$parent.方法

父子组件通信除了以上三种,还有props 和$emit 这两种比较常用就不介绍了,除此之外,还有inheritAttrs $attrs

inheritAttrs

这是@2.4新增的属性和接口。inheritAttrs属性控制子组件html属性上是否显示父组件的提供的属性。

如果我们将父组件Index中的属性desc、keysword、message三个数据传递到子组件HelloWorld中的话,如下

父组件Index部分

<HelloWorld ref="hello" :desc="desc" :keysword="keysword" :message="message"></HelloWorld>

子组件:HelloWorld,props中只接受了message

props: {
    message: String
},

实际情况,我们只需要message,那其他两个属性则会被当做普通的html元素插在子组件的根元素上。

如图

这样做会使组件预期功能变得模糊不清,这个时候,在子组件中写入,inheritAttrs:false ,这些没用到的属性便会被去掉,true的话,就会显示。

如果,父组件中没被需要的属性,跟子组件本来的属性冲突的时候,则依据父组件

<HelloWorld ref="hello" type="text" :message="message"></HelloWorld>

子组件:HelloWorld

<template>
  <input type="number">
</template>

这个时候父组件中type=“text”,而子组件中type=”number”,而实际中最后显示的是type=”text”,这并不是我们想要的,所以只要设置:inheritAttrs:false,type便会成为number

上述这些没被用到的属性,如何被获取呢?这就用到了$attrs

$attrs

作用:可以获取到没有使用的注册属性,如果需要,我们在这也可以往下继续传递。

就上上述没有被用到的desc和keysword就能通过$attrs获取到。

通过$attrs的这个特性可以父组件传递到孙组件,免除父组件传递到子组件,再从子组件传递到孙组件的麻烦

代码如下附组件Index部分

<div class="index">
  <HelloWorld ref="hello" :desc="desc" :keysword="keysword" :message="message"></HelloWorld>
</div>
 data(){
  return{
   message:'首页',
   desc:'首页描述',
   keysword:'我是关键词key'
 }
},

子组件HelloWorld部分

<div class="hello">
   <sunzi v-bind="$attrs"></sunzi>
   <button @click="aa">获取父组件的数据</button>
</div>

孙子组件sunzi部分

<template>
  <div class="header">
    {{$attrs}}
    <br>
  </div>
</template>

可以看出通过 v-bind=”$attrs”将数据传到孙组件中

除了以上,provide / inject 也适用于 隔代组件通信,尤其是获取祖先组件的数据,非常方便。

简单的说,当组件的引入层次过多,我们的子孙组件想要获取祖先组件的资源,那么怎么办呢,总不能一直取父级往上吧,而且这样代码结构容易混乱。这个就是provide / inject要干的事情。

<template>
  <div>
<childOne></childOne>
  </div>
</template>

<script>
  import childOne from '../components/test/ChildOne'
  export default {
    name: "Parent",
    provide: {
      for: "demo"
    },
    components:{
      childOne
    }
  }

在这里我们在父组件中provide for这个变量,然后直接设置三个组件(childOne、childTwo 、childThird)并且一层层不断内嵌其中, 而在最深层的childThird组件中我们可以通过inject获取for这个变量

<template>
  <div>
    {{demo}}
  </div>
</template>

<script>
  export default {
    name: "",
    inject: ['for'],
    data() {
      return {
        demo: this.for
      }
    }
  }
</script>

3. 自定义指令如何定义,它的生命周期是什么?

通过Vue.directive() 来定义全局指令

有几个可用的钩子(生命周期), 每个钩子可以选择一些参数. 钩子如下:

bind: 一旦指令附加到元素时触发

inserted: 一旦元素被添加到父元素时触发

update: 每当元素本身更新(但是子元素还未更新)时触发

componentUpdate: 每当组件和子组件被更新时触发

unbind: 一旦指令被移除时触发。

bind和update也许是这五个里面最有用的两个钩子了

每个钩子都有el, binding, 和vnode参数可用.

update和componentUpdated钩子还暴露了oldVnode, 以区分传递的旧值和较新的值.

el就是所绑定的元素.

binding是一个保护传入钩子的参数的对象. 有很多可用的参数, 包括name, value, oldValue, expression, arguments, arg及修饰语.

vnode有一个更不寻常的用例, 它可用于你需要直接引用到虚拟DOM中的节点.

binding和vnode都应该被视为只读.

现在,自定义一个指令,添加一些样式,表示定位的距离

Vue.directive('tack',{
 bind(el,binding){
  el.style.position='fixed';
  el.style.top=binding.value + 'px'
 }
})
<div class="header" v-tack="10" >我是header</div>

假设我们想要区分从顶部或者左侧偏移70px, 我们可以通过传递一个参数来做到这一点

Vue.directive('tack', {
 bind(el, binding, vnode) {
  el.style.position = 'fixed';
  const s = (binding.arg === 'left' ? 'left' : 'top');
  el.style[s] = binding.value + 'px';
 }
})

也可以同时传入不止一个值

Vue.directive('tack', {
 bind(el, binding, vnode) {
 el.style.position = 'fixed';
 el.style.top = binding.value.top + 'px';
 el.style.left = binding.value.left + 'px';
 }
})
<div class="header" v-tack="{left:’20’,top:’20’}" >我是header</div>

4、vue生命周期,各个阶段简单讲一下?

breforeCreate():实例创建前,这个阶段实例的data和methods是读不到的。

created():实例创建后,这个阶段已经完成数据观测,属性方法的运算,watch/event事件回调,mount挂载阶段还没有开始。$el属性目前不可见,数据并没有在DOM元素上进行渲染。

created完成之后,进行template编译等操作,将template编译为render函数,有了render函数后才会执行beforeMount()

beforeMount():在挂载开始之前被调用:相关的 render 函数首次被调用

mounted():挂载之后调用,el选项的DOM节点被新创建的 vm.$el 替换,并挂载到实例上去之后调用此生命周期函数,此时实例的数据在DOM节点上进行渲染

后续的钩子函数执行的过程都是需要外部的触发才会执行

有数据的变化,会调用beforeUpdate,然后经过Virtual Dom,最后updated更新完毕,当组件被销毁的时候,会调用beforeDestory,以及destoryed

5、watch 和 computed的区别?

computed:

①有缓存机制;②不能接受参数;③可以依赖其他computed,甚至是其他组件的data;④不能与data中的属性重复

watch:

①可接受两个参数;②监听时可触发一个回调,并做一些事情;③监听的属性必须是存在的;④允许异步

watch配置:handler、deep(是否深度)、immeditate (是否立即执行)

总结:

当有一些数据需要随着另外一些数据变化时,建议使用computed

当有一个通用的响应数据变化的时候,要执行一些业务逻辑或异步操作的时候建议使用watch

6、请说一下computed中的getter和setter

① computed 中可以分成 getter(读取) 和 setter(设值)

② 一般情况下是没有 setter 的,computed 预设只有 getter ,也就是只能读取,不能改变设置。

一、默认只有 getter的写法

<div id="demo">{{ fullName }}</div>
var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})
//其实fullName的完整写法应该是如下:
fullName: {
 get(){
   return this.firstName + ' ' + this.lastName
 }
}

注意:不是说我们更改了getter里使用的变量,就会触发computed的更新,前提是computed里的值必须要在模板里使用才行。如果将{{fullName}}去掉,get()方法是不会触发的。

二、setter的写法,可以设置

<template>
   <div id="demo">
       <p> {{ fullName }} </p>
       <input type="text" v-model="fullName">
       <input type="text" v-model="firstName">
       <input type="text" v-model="lastName">
   </div>
</template>

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'zhang',
    lastName: 'san'
  },
  computed: {
    fullName: {
      //getter 方法
     get(){
       console.log('computed getter...')
        return this.firstName + ' ' + this.lastName
       },
   //setter 方法
    set(newValue){
      console.log('computed setter...')
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
      return this.firstName + ' ' + this.lastName
     }
      
    }
  }
})

在这里,我们修改fullName的值,就会触发setter,同时也会触发getter。

注意:并不是触发了setter也就会触发getter,他们两个是相互独立的。我们这里修改了fullName会触发getter是因为setter函数里有改变firstName 和 lastName 值的代码,这两个值改变了,fullName依赖于这两个值,所以便会自动改变。

7、导航钩子有哪几种,分别如何用, 如何将数据传入下一个点击的路由页面?

① 全局导航守卫

前置守卫

router.beforeEach((to, from, next) => {
  // do someting
});

后置钩子(没有next参数)

router.afterEach((to, from) => {
  // do someting
});

②路由独享守卫

cont router = new  VueRouter({
 routes: [
  {
    path: '/file',
    component: File,
    beforeEnter: (to, from ,next) => {
       // do someting
    }
   }
 ]
});

顺便看一下路由里面的参数配置:


③ 组件内的导航钩子

组件内的导航钩子主要有这三种:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave。他们是直接在路由组件内部直接进行定义的

beforeRouteEnter

data(){
 return{
   pro:'产品'
 }
},
beforeRouteEnter:(to,from,next)=>{
  console.log(to)
  next(vm => {
   console.log(vm.pro)
  })
}

注:beforeRouteEnter 不能获取组件实例 this,因为当守卫执行前,组件实例被没有被创建出来,我们可以通过给 next 传入一个回调来访问组件实例。在导航被确认时,会执行这个回调,这时就可以访问组件实例了

仅仅是 beforRouteEnter 支持给 next 传递回调,其他两个并不支持,因为剩下两个钩子可以正常获取组件实例 this

如何通过路由将数据传入下一个跳转的页面呢?

答: params 和 query

params

传参
this.$router.push({
 name:"detail",
 params:{
   name:'xiaoming',
 }
});
接受
this.$route.params.name

query

传参
this.$router.push({
  path:'/detail',
  query:{
    name:"xiaoming"
  }
 })
接受 //接收参数是this.$route
this.$route.query.id  

那query和params什么区别呢?

① params只能用name来引入路由,query既可以用name又可以用path(通常用path)

② params类似于post方法,参数不会在地址栏中显示

query类似于get请求,页面跳转的时候,可以在地址栏看到请求参数

那刚才提到的this.$router 和this.$route有何区别?

先打印出来看一下

$router为VueRouter实例,想要导航到不同URL,则使用$router.push方法

$route为当前router跳转对象,里面可以获取name、path、query、params等

8、es6 的特有的类型, 常用的操作数组的方法都有哪些?

es6新增的主要的特性:

① let const 两者都有块级作用域

② 箭头函数

③ 模板字符串

④ 结构赋值

⑤ for of循环

⑥ import 、export 导入导出

⑦ set数据结构

⑧ ...展开运算符

⑨ 修饰器 @

⑩ class类继承

? async、await

? promise

? Symbol

? Proxy代理

操作数组常用的方法:

es5:concat 、join 、push、pop、shift、unshift、slice、splice、substring和substr 、sort、 reverse、indexOf和lastIndexOf 、every、some、filter、map、forEach、reduce

es6:find、findIndex、fill、copyWithin、Array.from、Array.of、entries、values、key、includes

9、vue双向绑定原理?

通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调

10、vue-router的实现原理,history和hash模式有什么区别?

vue-router有两种模式,hash模式和history模式

hash模式

url中带有#的便是hash模式,#后面是hash值,它的变化会触发hashchange 这个事件。

通过这个事件我们就可以知道 hash 值发生了哪些变化。然后我们便可以监听hashchange来实现更新页面部分内容的操作:

window.onhashchange = function(event){
  console.log(event.oldURL, event.newURL);
  let hash = location.hash.slice(1);
  document.body.style.color = hash;
}

另外,hash 值的变化,并不会导致浏览器向服务器发出请求,浏览器不发出请求,也就不会刷新页面。

history模式

history api可以分为两大部分,切换和修改

① 切换历史状态

包括back,forward,go三个方法,对应浏览器的前进,后退,跳转操作

history.go(-2);//后退两次
history.go(2);//前进两次
history.back(); //后退
hsitory.forward(); //前进

② 修改历史状态

包括了pushState,replaceState两个方法,这两个方法接收三个参数:stateObj,title,url

history.pushState({color:'red'}, 'red', 'red'})
window.onpopstate = function(event){
  console.log(event.state)
  if(event.state && event.state.color === 'red'){
    document.body.style.color = 'red';
  }
}
history.back();
history.forward();

通过pushstate把页面的状态保存在state对象中,当页面的url再变回这个url时,可以通过event.state取到这个state对象,从而可以对页面状态进行还原,这里的页面状态就是页面字体颜色,其实滚动条的位置,阅读进度,组件的开关的这些页面状态都可以存储到state的里面。

history缺点:

1:hash 模式下,仅hash符号之前的内容会被包含在请求中,如http://www.a12c.com,因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回404错误。

2:history模式下,前端的URL必须和实际向后端发起请求的URL一致。如http://www.a12c.com/book/a。如果后端缺少对/book/a 的路由处理,将返回404错误

11、怎么在vue中点击别的区域输入框不会失去焦点?

答:阻止事件的默认行为

具体操作:监听你想点击后不会丢失 input 焦点的那个元素的 mousedown 事件,回调里面调用 event.preventDefault(),会阻止使当前焦点丢失这一默认行为。

12、vue中data的属性可以和methods中的方法同名吗?为什么?

答:不可以

因为,Vue会把methods和data的东西,全部代理到Vue生成的对象中,会产生覆盖所以最好不要同名

13、怎么给vue定义全局的方法?

Vue.prototype.方法名称

14、Vue 2.0 不再支持在 v-html 中使用过滤器怎么办?

解决方法:

①全局方法(推荐)

Vue.prototype.msg = function(msg){ 
  return msg.replace("\n","<br>")
 }
 <div v-html="msg(content)"></div>

②computed方法

computed:{ 
 content:function(msg){
  return msg.replace("\n","<br>")
 }
}
<div>{{content}}</div>

③$options.filters(推荐)

filters:{ 
 msg:function(msg){
  return msg.replace(/\n/g,"<br>")
 }
},    
data:{ 
 content:"XXXX"
}
<div v-html="$options.filters.msg(content)"></div>

14、怎么解决vue打包后静态资源图片失效的问题?

答:将静态资源的存放位置放在src目录下

16、怎么解决vue动态设置img的src不生效的问题?

<img class="logo" :src="logo" alt="公司logo">
data() {
  return {
    logo:require("./../assets/images/logo.png"),
  };
}

因为动态添加src被当做静态资源处理了,没有进行编译,所以要加上require

17、跟keep-alive有关的生命周期是哪些?描述下这些生命周期

activated和deactivated两个生命周期函数

1.activated:当组件激活时,钩子触发的顺序是created->mounted->activated

2.deactivated: 组件停用时会触发deactivated,当再次前进或者后退的时候只触发activated

18、你知道vue中key的原理吗?说说你对它的理解

暂时没弄明白,等会儿写

19、vue中怎么重置data?

答:Object.assign()

Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };
var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, 注意目标对象自身也会改变。

注意,具有相同属性的对象,同名属性,后边的会覆盖前边的。

由于Object.assign()有上述特性,所以我们在Vue中可以这样使用:

Vue组件可能会有这样的需求:在某种情况下,需要重置Vue组件的data数据。此时,我们可以通过this.$data获取当前状态下的data,通过this.$options.data()获取该组件初始状态下的data。

然后只要使用Object.assign(this.$data, this.$options.data())就可以将当前状态的data重置为初始状态。

20、vue怎么实现强制刷新组件?

答:① v-if ② this.$forceUpdate

v-if

当v-if的值发生变化时,组件都会被重新渲染一遍。因此,利用v-if指令的特性,可以达到强制
<comp v-if="update"></comp>
<button @click="reload()">刷新comp组件</button>
data() {
 return {
   update: true
  }
 },
 methods: {
  reload() {
     // 移除组件
    this.update = false
      // 在组件移除后,重新渲染组件
      // this.$nextTick可实现在DOM 状态更新后,执行传入的方法。
    this.$nextTick(() => {
      this.update = true
    })
  }
 }

this.$forceUpdate

<button @click="reload()">刷新当前组件</button>
methods: {
  reload() {
    this.$forceUpdate()
  }
}

21、vue如何优化首页的加载速度?

① 第三方js库按CDN引入(一、cdn引入 二、去掉第三方库引入的import 三、把第三方库的js文件从打包文件里去掉)

② vue-router路由懒加载

③ 压缩图片资源

④ 静态文件本地缓存

http缓存:推荐网站:https://www.cnblogs.com/chinajava/p/5705169.html

service worker离线缓存:,缺点:需要在HTTPS站点下,推荐:http://lzw.me/a/pwa-service-worker.html

本篇未完结,请见更精彩的下一篇

推荐Vue学习资料文章:

Kbone原理详解与小程序技术选型

为什么我不再用Vue,改用React?

让Jenkins自动部署你的Vue项目「实践」

20个免费的设计资源 UI套件背景图标CSS框架

Deno将停止使用TypeScript,并公布五项具体理由

前端骨架屏都是如何生成的

Vue原来可以这样写开发效率杠杠的

用vue简单写一个音乐播放组件「附源码」

为什么Vue3.0不再使用defineProperty实现数据监听?

「干货」学会这些Vue小技巧,可以早点下班和女神约会

探索 Vue-Multiselect

细品30张脑图带你从零开始学Vue

Vue后台项目中遇到的技术难点以及解决方案

手把手教你Electron + Vue实战教程(五)

手把手教你Electron + Vue实战教程(四)

手把手教你Electron + Vue实战教程(三)

手把手教你Electron + Vue实战教程(二)

手把手教你Electron + Vue实战教程(一)

收集22种开源Vue模板和主题框架「干货」

如何写出优秀后台管理系统?11个经典模版拿去不谢「干货」

手把手教你实现一个Vue自定义指令懒加载

基于 Vue 和高德地图实现地图组件「实践」

一个由 Vue 作者尤雨溪开发的 web 开发工具—vite

是什么让我爱上了Vue.js

1.1万字深入细品Vue3.0源码响应式系统笔记「上」

1.1万字深入细品Vue3.0源码响应式系统笔记「下」

「实践」Vue 数据更新7 种情况汇总及延伸解决总结

尤大大细说Vue3 的诞生之路「译」

提高10倍打包速度工具Snowpack 2.0正式发布,再也不需要打包器

大厂Code Review总结Vue开发规范经验「值得学习」

Vue3 插件开发详解尝鲜版「值得收藏」

带你五步学会Vue SSR

记一次Vue3.0技术干货分享会

Vue 3.x 如何有惊无险地快速入门「进阶篇」

「干货」微信支付前后端流程整理(Vue+Node)

带你了解 vue-next(Vue 3.0)之 炉火纯青「实践」

「干货」Vue+高德地图实现页面点击绘制多边形及多边形切割拆分

「干货」Vue+Element前端导入导出Excel

「实践」Deno bytes 模块全解析

细品pdf.js实践解决含水印、电子签章问题「Vue篇」

基于vue + element的后台管理系统解决方案

Vue仿蘑菇街商城项目(vue+koa+mongodb)

基于 electron-vue 开发的音乐播放器「实践」

「实践」Vue项目中标配编辑器插件Vue-Quill-Editor

基于 Vue 技术栈的微前端方案实践

消息队列助你成为高薪 Node.js 工程师

Node.js 中的 stream 模块详解

「干货」Deno TCP Echo Server 是怎么运行的?

「干货」了不起的 Deno 实战教程

「干货」通俗易懂的Deno 入门教程

Deno 正式发布,彻底弄明白和 node 的区别

「实践」基于Apify+node+react/vue搭建一个有点意思的爬虫平台

「实践」深入对比 Vue 3.0 Composition API 和 React Hooks

前端网红框架的插件机制全梳理(axios、koa、redux、vuex)

深入Vue 必学高阶组件 HOC「进阶篇」

深入学习Vue的data、computed、watch来实现最精简响应式系统

10个实例小练习,快速入门熟练 Vue3 核心新特性(一)

10个实例小练习,快速入门熟练 Vue3 核心新特性(二)

教你部署搭建一个Vue-cli4+Webpack移动端框架「实践」

2020前端就业Vue框架篇「实践」

详解Vue3中 router 带来了哪些变化?

Vue项目部署及性能优化指导篇「实践」

Vue高性能渲染大数据Tree组件「实践」

尤大大细品VuePress搭建技术网站与个人博客「实践」

10个Vue开发技巧「实践」

是什么导致尤大大选择放弃Webpack?【vite 原理解析】

带你了解 vue-next(Vue 3.0)之 小试牛刀【实践】

带你了解 vue-next(Vue 3.0)之 初入茅庐【实践】

实践Vue 3.0做JSX(TSX)风格的组件开发

一篇文章教你并列比较React.js和Vue.js的语法【实践】

手拉手带你开启Vue3世界的鬼斧神工【实践】

深入浅出通过vue-cli3构建一个SSR应用程序【实践】

怎样为你的 Vue.js 单页应用提速

聊聊昨晚尤雨溪现场针对Vue3.0 Beta版本新特性知识点汇总

【新消息】Vue 3.0 Beta 版本发布,你还学的动么?

Vue真是太好了 壹万多字的Vue知识点 超详细!

Vue + Koa从零打造一个H5页面可视化编辑器——Quark-h5

深入浅出Vue3 跟着尤雨溪学 TypeScript 之 Ref 【实践】

手把手教你深入浅出vue-cli3升级vue-cli4的方法

Vue 3.0 Beta 和React 开发者分别杠上了

手把手教你用vue drag chart 实现一个可以拖动 / 缩放的图表组件

Vue3 尝鲜

总结Vue组件的通信

Vue 开源项目 TOP45

2020 年,Vue 受欢迎程度是否会超过 React?

尤雨溪:Vue 3.0的设计原则

使用vue实现HTML页面生成图片

实现全栈收银系统(Node+Vue)(上)

实现全栈收银系统(Node+Vue)(下)

vue引入原生高德地图

Vue合理配置WebSocket并实现群聊

多年vue项目实战经验汇总

vue之将echart封装为组件

基于 Vue 的两层吸顶踩坑总结

Vue插件总结【前端开发必备】

Vue 开发必须知道的 36 个技巧【近1W字】

构建大型 Vue.js 项目的10条建议

深入理解vue中的slot与slot-scope

手把手教你Vue解析pdf(base64)转图片【实践】

使用vue+node搭建前端异常监控系统

推荐 8 个漂亮的 vue.js 进度条组件

基于Vue实现拖拽升级(九宫格拖拽)

手摸手,带你用vue撸后台 系列二(登录权限篇)

手摸手,带你用vue撸后台 系列三(实战篇)

前端框架用vue还是react?清晰对比两者差异

Vue组件间通信几种方式,你用哪种?【实践】

浅析 React / Vue 跨端渲染原理与实现

10个Vue开发技巧助力成为更好的工程师

手把手教你Vue之父子组件间通信实践讲解【props、$ref 、$emit】

1W字长文+多图,带你了解vue的双向数据绑定源码实现

深入浅出Vue3 的响应式和以前的区别到底在哪里?【实践】

干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)

基于Vue/VueRouter/Vuex/Axios登录路由和接口级拦截原理与实现

手把手教你D3.js 实现数据可视化极速上手到Vue应用

吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧【上】

吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧【中】

吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧【下】

Vue3.0权限管理实现流程【实践】

后台管理系统,前端Vue根据角色动态设置菜单栏和路由

作者:东起

转发链接:https://zhuanlan.zhihu.com/p/103763164

标签列表
最新留言