Vue3.x 全家桶 | 04 - Vue 的声明式编程

166 阅读4分钟

iShot_2023-12-21_18.33.21.png

一、Vue 的声明式编程

前面提到 Vue 是一个采用 声明式 编程范式的 JavaScript 框架,那么除了 声明式 编程范式外还有一种就是 命令式 编程范式;当然 声明式 编程和 命令式 编程也不只在 Vue 框架中。

声明式 编程关注描述问题的本质,而不是解决问题的步骤。程序员声明(描述)期望的结果,而不是详细说明如何达到这个结果;声明式 编程的特点就是 简洁、抽象,更加关注 做什么 而不是 怎么做,使用 声明式 编程的代码通常更容易理解、维护和重用;因为他们更接近问题的表达方式。

命令式 编程关注解决问题的步骤和过程。程序员编写详细的指令,指导计算机执行特定的任务。典型的面向过程和面向对象编程语言(如C、Java)属于命令式编程。你需要明确指定每个步骤,从而改变程序的状态;命令式 编程更注重问题的"如何",程序员需要指导计算机执行确切的操作。

回到上篇文章中的计数器的案例,如果使用 JavaScript 代码的命令式编程来实现 响应式 特性,可以分为以下几个步骤:

  1. 定义 counter 变量
  2. 获取加减按钮元素
  3. 渲染 counter 变量
  4. 监听加减按钮的点击

首先从创建一个 HTML 页面,包括两个加减的按钮:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h2>计数器 0</h2>
  <button class="increment">+1</button>
  <button class="decrement">-1</button>
  <script></script>
</body>
</html>

使用 LiverServer 打开 HTML 页面:

image.png

具体命令式 JS 代码可以写成如下的形式:

// 1. 定义变量
let counter = 0

// 2. 获取加减按钮元素
const sEl = document.querySelector('.counter')
const inEl = document.querySelector('.increment')
const deEl = document.querySelector('.decrement')

// 3. 渲染变量
sEl.textContent = counter

// 4. 监听点击
inEl.onclick = function(){
  counter++
  sEl.textContent = counter
}
deEl.onclick = function(){
  counter--
  sEl.textContent = counter
}

而在上篇文章中我们使用 Vue 声明式编程实现同样的功能,代码如下:

const app = Vue.createApp({
  template: `
    <h2>计数器 {{counter}}</h2>
    <button v-on:click="increment">+1</button>
    <button v-on:click="decrement">-1</button>
  `,
  data: function(){
    return {
      counter: 0
    }
  },
  methods: {
    increment: function(){
      this.counter++
    },
    decrement: function(){
      this.counter--
    }
  },
})

app.mount('#app')

使用 Vue 声明式编程实现计数器功能的步骤如下:

  1. 模板语法: Vue 使用模板语法,允许你将数据绑定到HTML模板中,通过双大括号{{}}进行插值,将数据动态显示在页面上。

    <h2>计数器 {{counter}}</h2>
    
  2. 指令: Vue 提供了一系列的指令,允许你在 HTML 模板中添加特定的行为。例如,v-on 绑定事件

    <button v-on:click="increment">+1</button>
    

    在这个例子中,v-model实现了一个输入框与message数据的双向绑定。

  3. Vue 对象 data 和 methods 属性: Vue 允许你声明 data 和 methods 属性,这些属性的用户定义变量或者定义一些操作方法

    const app = Vue.createApp({
      template: `
        <h2>计数器 {{counter}}</h2>
        <button v-on:click="increment">+1</button>
        <button v-on:click="decrement">-1</button>
      `,
      data: function(){
        return {
          counter: 0
        }
      },
      methods: {
        increment: function(){
          this.counter++
        },
        decrement: function(){
          this.counter--
        }
      },
    })
    
    app.mount('#app')
    

通过这些 声明式 的特性,Vue 使得开发者能够更关注问题的本质,而不必过多关注底层的 DOM 操作和数据更新。这种声明式的编程风格有助于提高代码的可读性、可维护性,并减少了手动 DOM 操作的复杂性。

二、MVVM 模型

MVVM 模型是一种软件架构,是 Model-View-ViewModel 的简称,是非常流行的软件架构模式,用于将用户界面的开发和业务逻辑的处理分离,使得代码更易于理解、维护和扩展。Vue 是一个基于 MVVM 架构的框架。

在 MVVM 架构中,整个应用被划分为三个主要部分:

  1. Model(模型):

    • 定义: 模型是应用程序的数据和业务逻辑。它包含了应用程序的数据结构和处理数据的方法。
    • 在Vue中: Vue 中的数据对象就是模型,通过 Vue 实例的 data 选项来定义。模型负责存储应用程序的数据。
  2. View(视图):

    • 定义: 视图是用户界面的表示。它包括了用户看到和与之交互的所有内容。
    • 在Vue中: Vue 中的模板和 HTML 就是视图的一部分。视图通过模板语法和指令与模型进行绑定,以展示和响应模型的变化。
  3. ViewModel(视图模型):

    • 定义: 视图模型是连接模型和视图的桥梁,负责处理业务逻辑,将模型的数据转化为视图所需的格式。
    • 在Vue中: Vue实例就是视图模型,它通过Vue的响应式数据绑定系统实现了模型和视图的双向绑定。Vue实例中的 methodscomputed 等选项负责处理业务逻辑。

MVVM 架构的关键特点是数据绑定,即模型的变化会自动反映在视图上,用户对视图的操作也会影响到模型。这种双向绑定使得开发者能够更方便地处理用户界面的变化和用户输入。