Vue 技术探索: Vue 基础

176 阅读4分钟

文章主题: 掌握 Vue 框架基本概念与基础应用

一、理论基础

语义化模板(HTML模板) → MVC (Model、View、Controller) → MVVM (Model View ModelView)

什么是 MVVM?

视图发生变化 => ViewModel => 更新数据

数据发生变化 => ViewModel => 更新视图

MVVM 是 Model-View-ViewModel 的缩写,是一种软件架构模式,旨在简化用户界面的开发和测试。它通常用于构建基于用户界面的应用程序,特别是在 Web 和移动应用开发中。

MVVM 包含以下三个主要组件:

  1. Model(模型) :负责表示应用程序的数据和业务逻辑。Model 通常是一个简单的 JavaScript 对象,它包含应用程序的数据结构和操作方法。
  2. View(视图) :负责将数据模型转换为用户界面的可视化展示。View 是用户界面的呈现层,通常由 HTML、CSS 和其他 UI 组件组成。
  3. ViewModel(视图模型) :是连接 View 和 Model 的中间层,负责管理视图的状态和行为,并将视图中的操作映射到数据模型上。ViewModel 提供了一种抽象的方式来表示视图的状态和行为,并通过数据绑定机制实现视图和模型之间的同步更新。

MVVM 的核心特性是数据绑定,它通过建立视图和数据模型之间的双向绑定关系,使得视图的状态能够自动同步到数据模型,而数据模型的变化也能够自动反映到视图上。这种双向绑定可以大大简化开发人员的工作,减少了手动操作 DOM 的复杂性,提高了代码的可维护性和可测试性。MVVM 模式广泛应用于诸如 Vue.js、AngularJS 等现代 JavaScript 框架中。

二、写法统一

如何利用 MVVM 进行写法统一和前端开发?

Vue.js利用MVVM架构实现了前端开发的写法统一和简化。通过数据驱动视图、声明式编程、组件化开发、双向数据绑定和生命周期钩子等特性,Vue.js使得开发者能够更专注于业务逻辑的实现,而不必过多关注底层的DOM操作和数据更新机制,从而提高了开发效率、降低了出错的可能性,并使得代码更加清晰和可维护。

数据双向绑定 => buildTemplate => compiler => defineReactive => tick

compiler | defineReactive | tick

  1. 利用花括号(mustache, {{}}) 构筑了数据与VM的绑定关系
  2. 通过视图绑定事件来处理数据 → v-model → :value @input

vue2 & vue3 数据双向绑定写法

<!--app.vue-->
<template>
    <div @click="()=> message++">{{message}}</div>
    <a-component v-model="data1"/>
</template>
<!--选项式写法-->
<script>
export default{
    data(){
        return{
            msg: "hello",
            state:{text:"Hello Options"}
        }
    },
    methods(){}
}
</script>

<!--组合式 api-->
<script setup>
        import {ref, reactive} from "vue"
        const message = ref("Hello Vue3")
        const state = reactive({
            text:"Hello Vue3 Reactive"
        })
</script>

buildTemplate

构建模板有两种方式

  1. template 写法
  2. render 写法 JSX 写法

template 方式会触发 domdiff 算法进行性能优化, 而 render 函数会整体更新。

大数据长列表, 可以改变顺序的列表尽量不要使用 render

$set

对象新增的属性(动态实时更新), 需要补充响应式监听, 增加 getter 和 setter。调用 defineReactive。

tick 的概念

render => vnode => 更新 dom

一组数据更新之后再进行DOM更新, 比如一个函数中会触发多个数据更新, 此时所有数据更新完成之后触发 render 然后生成 Vnode 然后全量的进行 dom 更新操作, 即一个 tick 完成。

三、生命周期

面试官: vue 的生命周期是什么?

实例、数据操作、 VDom、 真实 DOM

Vue2.x

  1. 创建阶段: setup 阶段(beforeCreate & created) => beforeMount => mounted
  2. 更新阶段: beforeUpdate => updated
  3. 销毁阶段: beforeDestory => destoryed

Vue3.x

setup (beforeCreate / created / beforeMount)

onMounted()

onBeforeUpdate() onUpdated()

onBeforeUnmount()

onUnmounted()

哪个阶段可以赋值? 什么时候数据绑定可以实现?

  • beforeCreate 和 created 对比 beforeCreate: 实例创建阶段, 创建 vue 实例, 任何操作 vue 实例的都要在该钩子之后 created: 才能对 data | props | methods | computed - 数据操作 vue3 进行了setup归一化
  • beforeMount 和 mounted 的区别 beforeMount:Vdom, 数据操作可以进行, 此时有虚拟节点 VNode, 但是不能操作DOM mounted: Dom, 任何操作
  • beforeUpdate & updated 的区别 beforeUpdate: Vdom 完成更新 updated: dom 完成更新
  • beforeDestory & destoryed 的区别 beforeDestory: 实例销毁之前, 全局定时器销毁, dom 绑定的事件进行销毁 destoryed: 完全被销毁

父子组件生命周期的区别

父组件 setup + beforeMount => 子组件全周期 (setup + beforeMounted + mounted) => 父组件 mounted

四、vue3 simple coding

<template>
{{ state.number }}
{{ msg }}
<div @click="handleAdd">加油</div>
</template>
<script setup>
  import {ref, reactive, computed} from "vue"
// 响应式hook reactive / ref
const state = reactive({
        number: 0
})
const number = ref(0)


// 函数
const handleAdd = () => state.number++
// 计算类型
const msg = "hello"
const addMsg = () => msg + number.value

</script>

五、面试题

面试官: reactive 与 ref 的区别?

面试官: mustache ({{}}) 对浮点数、整型操作、函数加工支持吗?