优秀的编程知识分享平台

网站首页 > 技术文章 正文

2020前端就业Vue框架篇「实践」(vue前端框架有哪些)

nanyue 2024-09-02 19:10:09 技术文章 8 ℃


作者:河畔一角

转发链接:https://mp.weixin.qq.com/s/002l3H_iWWu6w1ClubCYIg

前言

上次给大家整理了前端面试的基础篇,实际上基础篇有很多内容,我只挑选了其中的一部分梳理出来给大家。这一次,我将挑选一些框架篇的内容分享给大家。

更多的Vue实践知识点请见本篇文章底部

框架篇-Vue

以下Vue框架基于vue@2.6版本进行整理,初中高级知识贯穿始终

Vue指令

  • v-if/v-else-if/v-else(条件判断)
  • v-show(元素切换显示和隐藏)
  • v-bind(动态绑定属性,简写:)
  • v-on(绑定事件,简写@on)
  • v-for(列表循环)
  • v-model(表单控件创建双向绑定)
  • v-text(文本显示)
  • v-html(插入html代码)
  • v-slot(插槽,可动态接收模板片段)
<!-- 插槽定义 -->
<slot name="body"></slot>
<!-- 插槽引用 -->
<template v-slot:body>
  <p>动态插入代码</p>
</template>
  • v-once(只渲染元素或组件一次)
  • v-cloak

页面加载慢时,会把{{}}显示到网页中,影响体验,可通过v-cloak结合css来控制,不过我个人觉得换v-text即可

[v-cloak] {
  display: none;
}
<div v-cloak>
  {{ message }}
</div>
  • v-pre

元素和子元素中语法不进行编译,和html中<pre>标签类似

Vue修饰符

Vue内置了一些修饰符,可以快速实现一些小功能,好比小工具类,比如阻止默认事件、冒泡等。

  • .lazy

v-model输入框改变,数据就会改变,lazy修饰符会在光标离开input框才会更新数据,有点延迟的效果

<input type="text" v-model.lazy="name">
  • .trim(去掉首尾空白字符)
<input type="text" v-model.trim="name">
  • .number(自动转换为数值类型)
  • .stop(阻止事件冒泡)
// 类似event.stopPropagation()
<button @click.stop="get">前端未来</button>
  • .prevent(阻止默认行为)
// 类似event.preventDefault()
<a @click.prevent="get">前端未来</a>
  • .self(只有点击元素本身才会触发)
  • .once(只能点击一次)

剩下的就不做介绍了,用的也不多,面试官也不会让你全背下来

Vue生命周期

生命周期描述beforeCreate组件实例被创建之前created组件实例已创建,Dom未生成beforeMount在挂载之前被调用mounted实例已挂载到Dom上beforeUpdate组件数据更新之前调用update组件数据更新之后beforeDestory组件销毁前调用destoryed组件销毁后调用

此处给大家截一张Vue源码_init方法截图,就当小彩蛋

Vue内置组件

  • component
  • transition/transition-group
  • view-router
  • keep-alive
  • slot

以上组件是vue内置,不需要注册

元素加key的作用?

实际上,Vue建议在v-for循环列表上以及一些元素上添加key属性,它会基于key的变化重新排列元素顺序,并且会移除 key 不存在的元素。

简单理解就是在虚拟Dom对比的时候,有了key会更高效。

还是给大家上个彩蛋,大家自己掂量

v-for指令中,为什么不建议用index作为key?

根据上面key的介绍,说明key可以加快diff时间。但是index是一个动态索引,一旦发生元素新增/删除后,v-for会从新遍历,index从新生成,也就意味着key全部从新排列了,在VDom比对的时候,就发生错位的情况。

总结:如果有新增/删除就不要用index,如果是纯列表渲染可以用index

transition动画

一图胜千言

<transition name="fade">
  <p v-if="show">前端未来</p>
</transition>
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to{
  opacity: 0;
}

$nextTick作用是什么

Vue的data修改以后,会更新视图,当添加nextTick以后,会保证视图更新成功以后,才会回调回来。(有些场景需要这么处理)

// 修改数据
this.message = '前端未来'
// DOM 还没有更新
this.$nextTick(function () {
  // DOM 现在更新了
  // to-do
})

通过for循环修改data100次,视图会更新100次吗?

Vue肯定不会做这么低效率的事情。Vue的更新是异步的,更新视图的流程:setter -> Dep -> Watcher -> patch -> 视图,每个Watcher实例都会标记一个ID,而每个Watcher会在数据变化时push进队列中,等下一次tick时执行,而通过标记的ID即可对Watcher去重,所以最后只会执行一次更新从0到100.

说实话,这块源码我还没捋清楚,大概主线就是这样的。

keep-alive作用是什么?

<keep-alive>内置组件主要做组件缓存,防止销毁。

什么是虚拟Dom

虚拟Dom,在JS中叫VDom,看过源码的应该都知道。

VDom就是用对象属性来描述真实Html Dom节点。

<div id="app">
  <p class="text">前端未来</p>
</div>
// 通过VNode编译出来:
{
  tag: 'div',
  props: {
    id: 'app'
  },
  chidren: [
    {
      tag: 'p',
      props: {
        className: 'text'
      },
      text:'前端未来'
    }
  ]
}

上个彩蛋

为什么虚拟Dom比真实Dom快

虚拟Dom是通过JS对象构建的,所有的对象变化都通过js在内存中操作,读写速度快,这个只是前提条件。

  • VDom可以最大限度减少浏览器重绘和回流操作
  • 频繁修改,一次diff,VDom可以做到局部更新

Vue Diff过程

源码极其复杂,活着不好吗,我看不下去了

每次数据改变都会生成一个新的VDom,通过新旧VDom对比生成patch,最后深度遍历逐步更新到视图当中。Diff过程是同层对比,依次比较key、节点名称、注释节点、类型等,如果有差异,会根据是替换节点、删除节点、修改文本节点以及新增节点等做相应操作。over...

Vue双向绑定的原理

这个图画的非常完美

简单理解就是:

2.x版本通过Object.defineProperty()来实现数据劫持,通过data初始化获取来添加订阅,当模型发生变化后,触发setter,借助Dep(订阅器)来notify发布消息,进而执行Watcher的update方法来更新视图。

3.x版本主要通过Proxy实现数据代理,同样可以监听到数据变化,实现双向绑定。

下面简单描述几个源码主线,作为知识扩展

Vue整体的主线包括:

  • 初始化及挂载
  • 编译
  • 响应式
  • Virtual DOM
  • 更新视图

new Vue({})后会调用_init方法进行初始化,初始化生命周期、事件中心、渲染,初始化 data、props、computed、watcher 等等。

Compile阶段包含parse optimize generate

  • parse 会用正则等方式解析template模板中的指令、class、style等数据,形成AST
  • optimize的主要作用是标记static静态节点,这是Vue在编译过程中的优化.
  • generate是将AST转化成render function字符串的过程

响应式、VDOM、更新视图上面所有涉及,不讲了.

Vue3.0了解吗?

3.x版本目前仅发布beta版本,预计在六月份应该可以发布正式版。3.x版本兼容了2.x版本的大部分功能,但也增加了Composition API.

它主要通过Proxy实现双向绑定。通过Composition API新增了很多Hook能力,比如:reactive,ref等.

<template>
  <div id="app">
    <h1>{{title.name}}</h1>
  </div>
  <div>
    // 此处可并列多个div,不再要求一个根元素了
  </div>
</template>

<script>import { reactive } from 'vue'
export default {
  name: 'App',
  setup(){
    const title = reactive({
      name:'欢迎学习Vue3.0'
    })
    return { title }
  }
}</script>

大家可以参考我另一篇Vue3.0文章.

另外学习Vue框架,我们还需要掌握它的配置和脚手架,目前Vue项目大多可以通过@vue/cli来创建项目,基于最新4.0的脚手架我们可以初始化一套标准的项目,跟3.0不同的是,它隐藏了webpack相关的配置,暴露了一个vue.config.js配置。

vue.config配置介绍

  • devServer修改本地服务并添加代理
devServer:{
    host:'localhost',
    port:8080,
    proxy:{
      '/api':{
        target:'http://mi.futurefe.com',
        changeOrigin:true,
        pathRewrite:{
          '/api':''
        }
      }
    }
  },
  • publicPath 修改项目前缀

访问:http://mi.futurefe.com/app/#/ 带目录的访问是需要设置publicPath的

  • lintOnSave 可以开启关闭本地Eslint检查
  • productionSourceMap 开启关闭sourcemap
  • chainWebpack 可修改webpack配置

更多的配置介绍,大家可以直接参考官网文档:https://cli.vuejs.org/zh/config/#

以上是框架篇-Vue,大家如果觉得有很大帮助,可以关注我微信公众号:前端未来,我将继续为大家准备框架篇-React

推荐Vue学习资料文章:

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.js开发人员的12个技巧和窍门【实践】

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://mp.weixin.qq.com/s/002l3H_iWWu6w1ClubCYIg

Tags:

最近发表
标签列表