详细总结流行前端框架Vue重难点概念

详细总结流行前端框架Vue重难点概念

  • 1 什么是Vue?
  • 2 Vue基本属性
  • 3 Vue基本指令
  • 4 组件化
    • 4.1 创建组件
      • 4.1.1 注册全局组件
      • 4.1.2 注册局部组件
    • 4.2 组件通信
  • 5 Vue底层原理
    • 5.1 虚拟DOM
    • 5.2 Vue运行流程
    • 5.3 生命周期钩子
  • 6 Vue-cli脚手架
    • 6.1 Webpack工具
      • 6.1.1 基本配置
      • 6.1.2 转换器Loader
      • 6.1.3 插件Plugin
      • 6.1.4 搭建本地服务器
    • 6.2 vue-cli
    • 6.3 Vue-router
    • 6.4 Vuex

1 什么是Vue?

Vue是一套用于构建用户界面的渐进式框架,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

2 Vue基本属性

基本属性 含义 解释
el DOM元素 该属性决定了该Vue实例被挂载到哪个DOM元素上,今后该DOM元素由此Vue实例直接管理
data 数据 该属性用于存储数据,既可以由开发者直接定义,也可以从网络或服务器动态加载
methods 方法 该属性用于在Vue对象中定义方法
computed 计算属性 计算属性是封装了复杂逻辑函数的属性,用于简化属性使用,增强可读性和可维护性
components 局部组件 该属性用于声明该Vue实例可以使用的局部组件
template HTML模板 该属性决定该实例渲染的HTML结构,模板将会替换挂载的元素,挂载元素的内容都将被忽略,除非模板内容有分发插槽
props 配置 该属性用于接收来自父组件的数据
表2.1

注:
计算属性与方法的区别:前者基于缓存的。只在相关响应式发生改变时计算属性才会重新求值,即只要响应式不变,多次访问计算属性会立即返回之前缓存的计算结果,而不必再次执行函数;而每次访问方法都会重新执行函数,从效率来看,计算属性优于方法。

3 Vue基本指令

基本指令 含义 举例
v-once 声明元素仅渲染一次,而不随着数据动态加载

{{cnt}}

v-html 声明以html格式解析渲染字符串

v-text 声明以纯文本形式解析字符串,该指令与mustache语法{{}}作用相似,但后者内部可书写简单JS表达式,应用更灵活

v-pre 跳过该元素及其子元素的Vue编译过程,跳过大量无指令节点会加快编译

{{url}}

v-bind 声明标签中某些属性动态绑定到Vue实例的属性、对象 百度百度
v-on @ 绑定事件监听器
v-if v-else-if v-else 条件渲染(不符合条件的元素及其子代脱离当前HTML文档不渲染)

=90”>优

=80”>良

合格

v-show 切换元素CSS样式的display属性
v-for 遍历数组或对象
  • {{index}}.{{key}}:{{value}}
  • v-model 在表单控件(value属性)或组件上创建双向绑定
    v-slot # 设置作用域插槽或具名插槽
    表3.1

    注:
    1、黄色标记的是对应指令的语法糖

    2、使用v-on指令时,若监听器无参数时可省略();若监听器有参数但省略()则默认第一个形参为事件对象;若监听器有多个参数且包含事件对象,需要用$修饰符,例如:

    <button @click="test(123,$event)">测试button>
    test(num,e){
    	console.log(num,e);
    }
    

    v-on指令主要修饰符如表3.2所示,示例代码:

    <button @click.stop.once="test(123,$event)">测试button>
    <button @keypress.enter="test">测试button>
    
    序号 修饰符 含义
    1 stop 停止冒泡
    2 prevent 阻止默认行为
    3 once 只触发一次
    4 keycode || keyAlias 键值或键别名,声明该事件仅由特定键触发
    表3.2

    3、使用v-for指令遍历数组时,数组的部分方法可以触发响应式渲染,例如push()、pop()、shift()、unshift()、splice()、sort()、reverse()

    4、v-model指令主要修饰符如表3.3所示。

    序号 修饰符 含义
    1 lazy v-model默认在每次input事件触发后同步输入框的值与数据。该修饰符修改触发事件为change
    2 number 将输入转换为数值类型
    3 trim 过滤输入字符串的首末空白字符
    表3.3

    4 组件化

    Vue组件化提供了一种抽象,可以开发出一个个独立可复用的组件来构造复杂的整体应用,这个角度下,任何应用都会被抽象成一棵组件树。组件分为全局组件——可以在所有Vue实例下使用;局部组件——仅在声明局部组件的Vue实例下使用。一个组件可以理解为一个Vue实例,享有Vue实例的所有属性。
    详细总结流行前端框架Vue重难点概念_第1张图片

    图4.1

    4.1 创建组件

    4.1.1 注册全局组件

    Vue.component('m_cpn',{
        template: '#cpn',
        data(){
            return {
                title: '我是标题',
                text: '我是内容'
            }
        }
    });
    

    4.1.2 注册局部组件

    components:{
        m_cpn: {
            template: '#cpn',
            data(){
                return {
                    title: '我是标题',
                    text: '我是内容'
                }
            }
        }
    }
    

    注册组件时即将组件名(上面示例中为m_cpn)与HTML模板(上面示例中为cpn)绑定。必须指出,若在组件内部注册局部组件,则此局部组件为该组件的子组件。组件必须挂载在某个Vue实例下,否则无法生效

    4.2 组件通信

    组件对象自身的固有数据存储在data属性中,与Vue对象不同在于,组件的data属性必须是函数,且该函数返回一个存储数据的对象,以使每个组件使用独立的内存空间,防止组件间数据的相互影响与耦合

    详细总结流行前端框架Vue重难点概念_第2张图片

    图4.2

    (1) 父组件传递数据给子组件——props属性

    props属性通常是一个对象,内部包含数据对象,数据对象则支持一系列属性:① type:接收数据类型验证。可以指定type为JS内置类型,如String、Number等,也可为自定义数据结构;② default:未接收传参时的默认数据。当type为Array或Object类型时,default必须为函数;③ required:为true时强制从父组件接收参数,否则报错。

    父组件还可以通过两个属性访问子组件的数据:① $children:返回所有子组件对象组成的数组,但实际应用中子组件下标值不恒定,故一般不使用该属性;② $refs:通过$ref.x返回ref属性为x的子组件对象。

    (2) 子组件传递数据给父组件——自定义事件

    ① 子组件中自定义事件,并在需要的时候将数据嵌入该事件发射到父组件

    this.$emit('add-info',this.mBooks[index],index);
    

    其中add-info即为子组件的自定义事件,后续参数为绑定事件的各个数据。

    ② 使用子组件的v-on指令,绑定自定义事件到父组件接收函数

    <m_cpn :m-books="books" :m-msg="msg" @add-info="addClick"></m_cpn>
    

    其中addClick即为父组件接收函数,缺省()时按顺序传入add-info发射的数据,接收函数内部访问子组件数据时,亦要求按发射顺序接收。类似地,子组件可通过$parent属性访问父组件,但会增强代际耦合,不建议使用。

    5 Vue底层原理

    5.1 虚拟DOM

    如图5.1所示,浏览器渲染引擎工作流程大致分以下步骤:

    (1) 使用HTML分析器分析HTML元素,构建DOM树;
    (2) 使用CSS分析器分析CSS文件和元素行内样式,生成页面的样式表;
    (3) 将DOM树和页面样式表关联起来,构建渲染树(Render树)。由于每个DOM节点都有attach方法——接受样式信息,返回渲染对象,因此该过程又称为Attachment;
    (4) 浏览器根据Render树布局,为Render树上每个节点确定在显示屏上的精确坐标;
    (5) 调用每个DOM节点的Paint方法,绘制页面。

    详细总结流行前端框架Vue重难点概念_第3张图片

    图5.1 浏览器渲染引擎渲染流程

    用原生JS或JQ操作DOM时,浏览器会从构建DOM树开始从头到尾执行一遍渲染流程,因此操作DOM的代价仍旧是昂贵的,频繁操作还是会出现页面卡顿,影响用户体验。虚拟DOM是渲染真实DOM之前,在内存中的JS对象,其设计是为了改善浏览器性能,因为操作JS对象比DOM节点速度快,这样可以避免无谓的重复渲染,而只将最终效果反映到网页。在网页数据更新时会先对虚拟DOM进行打补丁(patch)和重渲染,再一次性渲染到真实DOM。

    详细总结流行前端框架Vue重难点概念_第4张图片

    (a) 插入节点

    详细总结流行前端框架Vue重难点概念_第5张图片

    (b) 遍历插入

    详细总结流行前端框架Vue重难点概念_第6张图片

    (c) 链表式插入
    图5.2 DOM Diff算法示例

    网页的变化本质上是DOM节点的变化,因此虚拟DOM的核心之一在于新旧DOM树的比较,称为DOM Diff算法。DOM Diff算法只对DOM树的变化部分进行渲染,而对其余部分不作改动,避免遍历,从而大大提高渲染效率。如图5.2所示,DOM Diff只需变化新插入的节点,这意味着虚拟DOM树并非数组类型的顺序数据结构,而是链表型的无序数据结构,因此要高效应用虚拟DOM,需要为DOM节点指定key属性。

    5.2 Vue运行流程

    详细总结流行前端框架Vue重难点概念_第7张图片

    图5.3 Vue运行流程

    可以看出在Vue架构中,最终渲染都由渲染函数完成。运行Vue框架有两种模式:
    (1) runtime-only:不包含模板编译阶段;
    (2) runtime-compiler:包含模板编译阶段。

    // runtime-only
    new Vue({
      el: '#app',
      render: h => h(App)
    })
    
    // runtime-compiler
    new Vue({
      el: '#app',
      components: { App },
      template: ''
    })
    

    runtime-only运行时不包含模板编译阶段,所有模板只能在.Vue文件中借助Vue插件vue-template-compiler完成开发时编译,在项目打包时模板只已render函数形式存在于工程中,运行时不会二次编译,因此runtime-only运行更快、项目更轻,但该模式下不能存在于非.Vue文件中,否则无法渲染。

    runtime-compiler函数不限制模板存在的文件形式,但模板仅在运行时编译,性能低于runtime-only模式。

    5.3 生命周期钩子

    Vue中生命周期指一个Vue实例从创建到销毁的全部过程,如图5.4所示。在Vue实例的生命周期中有很多特殊的时间节点,且往往需要在这些时间节点执行一定的逻辑。封装了这些逻辑的函数称为钩子函数。钩子函数不同于回调函数,前者在事件发生的第一时间激活,后者在事件发生后激活。

    常见的生命周期钩子函数如表5.1所示。

    详细总结流行前端框架Vue重难点概念_第8张图片

    图5.4
    序号 生命周期钩子 含义
    1 beforeCreate() 实例初始化之后,数据观测和事件配置之前调用,此时组件的options还未初始化
    2 created() 实例初始化且完成options配置后,挂载开始前调用,$el属性还未初始化
    3 beforeMount() 挂载阶段开始后,渲染网页前调用,实例已完成模板编译,生成虚拟DOM树(此时$el为VDOM属性)
    4 mounted() 实例挂载完成,渲染到网页后调用
    5 beforeUpdate() 数据更新前调用,由于VDOM还未打补丁,此时进一步更改状态不会触发重渲染
    6 updated() 数据更新后使用
    7 beforeDestroy() 实例销毁前调用,此时仍可访问实例及其子代的各属性
    8 destroyed() 实例销毁后调用
    9 activated() 被keep-alive缓存的组件激活时调用
    10 deactivated() 被keep-alive缓存的组件停用时调用
    表5.1

    6 Vue-cli脚手架

    6.1 Webpack工具

    6.1.1 基本配置

    在大型前端工程中,模块化有助于降低代码耦合性,防止功能冲突。前端模块化的方案有AMDCMDCommonJSES6等,其中除ES6外的模块化开发方案都需要特定的运行环境。webpack是一个基于Node.js的现代JS应用的静态模块打包工具,统一了各模块化方案,并且可以自动处理模块间的相互依赖。

    对于新工程,webpack打包的流程如下:

    npm init
    // 安装本地webpack包(@指定版本)
    
    npm install webpack@3.5 --save-dev
    
    // 安装全局webpack包
    // npm install webpack -g
    npm install
    

    为便于不同项目的管理,通常在每个工程下安装局部webpack包,防止版本冲突。但终端执行webpack却会使用全局webpack包,因此要在产生的package.json中配置webpack启动项:

      "scripts": {
        "build": "webpack --config ./build/prod.config.js",
        "dev": "webpack-dev-server --config ./build/dev.config.js --open "
      },
    

    此时运行npm run build即可进行生产模式下项目的打包。

    6.1.2 转换器Loader

    原生webpack只能处理JS文件及其依赖,但前端开发中还有CSS、Vue文件等,此时需要webpack转化器loader对其他格式的文件进行扩展,大部分文件的转化器可在webpack官网查询。以安装CSS、Vue扩展转换器为例:

    // 安装CSS loader
    cnpm install style-loader --save-dev
    cnpm install css-loader --save-dev
    // 安装Vue(运行时依赖,不加-dev)
    cnpm install vue@2.6.14 –save
    // 安装Vue loader
    cnpm install vue-loader vue-template-compiler --save-dev
    

    在配置文件.config.js中作如下配置:

    module: {
        rules: [
          {
            test: /\.css$/,                                 // 使能CSS打包
            // 使用多个loader时,从右向左读
            // css-loader: 加载CSS文件
            // style-loader: 将样式加载到DOM
            use: ['style-loader', 'css-loader' ]
          },
          {
            test: /\.vue$/,                                 // 使能vue打包
            use: ['vue-loader']
          }
        ]
      },
    resolve: {
        alias: {
          // 引入vue
          'vue$': 'vue/dist/vue.esm.js'
        }
      }
    

    6.1.3 插件Plugin

    webpack插件是对webpack现有功能的各种扩展,使webpack使用更方便,常用插件如表6.1所示。

    名称 功能
    HtmlWebpackPlugin 自动生成项目html文件(可指定生成模板),并将打包的js文件以

    你可能感兴趣的:(前端开发,vue.js,javascript,html,前端,css)