跳到主要内容位置

Vue.js 是什么样的框架?解决了传统前端开发中的哪些问题?

张旭乾

以前我们在开发网页的时候,无论是使用 jQuery 还是原生的 JavaScript,大体的步骤都是这样的:

  1. 编写 HTML 页面结构,并规划哪些元素有可能会有交互,并赋予它们 ID 属性,方便后续在 JavaScript 获取对应的实例。
  2. 编写 CSS 样式,对于拥有多个不同页面的网站,可能需要有多个 CSS 文件。
  3. 编写 JavaScript 处理交互。

而在 JavaScript 中处理交互的时候,需要这样的步骤:

  1. 获取 DOM 元素。
  2. 添加事件监听。
  3. 根据事件对 DOM 数据的修改,手动更新相关的 DOM 元素,例如添加新的元素,删除已有的元素等。

一个例子

来看一个例子,假设 HTML 页面中有一个 <ul/>列表元素,展示了一些列表项,下面有一个按钮和一个输入框,可以添加新的列表项到列表中,我们来看看它的代码实现。 首先看 HTML,很简单,就是一个 <ul/>列表嵌套了 3 个默认的<li/>列表项,下边一个 input 提示用户输入新的列表项内容,还有一个按钮把内容添加到列表项:

<ul>
<li>列表项1</li>
<li>列表项2</li>
<li>列表项3</li>
</ul>
<input type="text" placeholder="请输入内容" />
<button id="btn">添加</button>

为了实现按钮的功能,需要使用 JavaScript,给按钮添加事件处理:

const ul = document.querySelector("ul"); // 这个是使用选择器选择元素
const input = document.querySelector("input");
const btn = document.getElementById("btn");

btn.addEventListener("click", () => {
const content = input.value;
const newLi = document.createElement("li");
newLi.innerHTML = content;
ul.append(newLi);
});

可以看到,在每次按钮点击的时候,都需要手动创建一个新的 li 列表项,把 input 的内容设置进去,然后添加到 ul 中,并且为了实现这些操作,还需要把对应的 DOM 元素都先获取出来,代码十分繁琐。 另外,如果有新的需求,要把列表项的数据保存起来,方便传递给后台或者让其它页面元素使用,那么我们还需要手动维护一个数组:

const data = ["列表项1", "列表项2", "列表项3"]; // 默认数据

btn.addEventListener("click", () => {
const content = input.value;
const newLi = document.createElement("li");
newLi.innerHTML = content;
ul.append(newLi);
data.push(content);
console.log(data);
});

这个时候,数据需要和显示的视图进行同步,也就是说,当有新的列表项添加进来的时候,需要把内容添加到数组中;当删除数组中的元素时,对应的列表元素 li 也需要在 html 中删除,如果漏掉了任何一步,都会导致视图和数据不同步:

// 其它地方可能删除了数组中的元素,但是没有删除 HTML DOM 元素
document.addEventListener("dblclick", () => {
// 双击事件
data.pop();
console.log(data);
});

其它问题

除了示例中的问题之外,使用传统的网页开发方式还有这些问题:

  1. HTML 代码是静态的,不够灵活,如果多个页面有相同的页面元素,例如导航、底部、按钮等,还需要在每个页面复制代码。
  2. CSS 是全局共享的,如果不小心使用了相同的 class 名字,那么后定义的样式就会把先定义的覆盖。
  3. JavaScript 的全局变量也是共享的,引入多个 JavaScript 文件后,相同的变量名字也会互相覆盖。
  4. HTML 和 JavaScript 结合紧密,需要通过 id 等属性来获取 DOM 实例,如果 HTML 有修改,那么很可能还得修改对应的 JavaScript 代码。
  5. 如果多个 HTML 元素使用了同步联动的数据,例如一个单位换算的应用,需要两边的数据保持同步,那就要求我们开发者手动维护数据,非常容易出错。

这些问题,在 Vue.js 中都能够得到解决。

提示

《Vue 3.x 全家桶完全指南与实战》课程已上线,包括 Vue 3.x、Vue Router 4.x、Vuex 4.x 所有初级到高级的语法特性详解,让你完全胜任 Vue 前端开发的工作。点击查看详情

Vue.js 是什么样的框架?

Vue.js 是一个渐进式的 UI 框架。渐进式是说,我们可以逐步采用 Vue.js 框架所提供的功能,方便从传统的网页项目一点一点迁移到 Vue 上来,例如可以先把页面的某一个元素,或者某个部分改造成使用 Vue 的方式。

Vue.js 解决了什么问题?

Vue.js 解决了这样的一些问题:

  1. 通过模板语法,让 HTML 能够动态的展示数据,减少代码量。这里边的语法先不用理解,后面都会讲到,先重点关注以下 Vue 能解决的问题:
<a href="url"> {{ text }} </a>
  1. 可以实现数据和视图的同步,例如之前使用传统方式开发的示例,可以用 Vue 这样来实现,这里列表的数据完全交由 vue 来管理,按钮的点击事件修改它里边的内容后,就能实时的反应到页面上,这样就避免了手动维护列表项数组和 li 元素的展示了,另外也可以看到利用 Vue 的模板语法,让渲染列表的代码更少了:
<ul>
<li v-for="item in items">{{ item }}</li>
</ul>
<input type="text" placeholder="请输入内容" v-model="content" />
<button @click="items.push(content)">添加</button>

Vue.createApp({
data() {
return {
content: "",
items: ["列表项1", "列表项2","列表项3"]
}
}
}).mount('app')
  1. 通过组件化的方式,复用 HTML 元素,这样无论哪个页面有同样的元素,可以直接拿来用,后面在讲到 props(属性)的时候,还能对组件进行配置,让组件复用更灵活,提高开发效率:
// 组件

app.component("my-button", {
template: `<button>按钮</button>`,
}); // 使用
<div>
<my-button></my-button>
</div>;
  1. Vue 中的每个组件数据都是独立的,不会互相影响,重复使用同一组件的时候,其中一个组件的数据变化,不会影响其它组件,避免了数据冲突的问题:
app.component('my-counter', { 
data() {
return { count: 0 }
},
template: `<button @click="count++">+1</button>`
});

<!-- 两个不会互相影响 -->
<my-counter></my-counter>
<my-counter></my-counter>
  1. 使用 Vue 单一组件特性,可以让 CSS 只针对本组件生效,其它组件中同名的 CSS 选择器不会影响当前组件:
// RedCard.vue
<template>
<div class="card"></div>
</template>
<style scoped>
.card {
background: red;
}
</style>

// BlueCard.vue
<template>
<div class="card"></div>
</template>
<style scoped>
.card {
background: blue;
}
</style>

Vue.js 框架的应用

Vue.js 除了可以增强传统网页的发开之外,还可以用于开发大型的单页应用。单页应用可以认为是桌面应用程序的网页版,例如聊天软件,管理系统,作图软件等等,这些软件的特点就是只有一个页面,根据导航的不同,切换不同的 UI 组件。而借助 vue-router 还能方便的开发传统的多页应用。

Vue.js 还有衍生的 UniApp 等框架,用于开发移动端、H5、小程序和桌面端的应用,可以说是能够用于各式各样的开发了。

另外,使用 Vue.js 开发的网页应用都是纯客户端的,就是说所有的代码都运行在用户的浏览器上,而不是像传统的 Web 项目一样,页面是由后端服务发送过来的。不过借助 Server Side Rendering(SSR,服务端渲染),Vue.js 的代码也可以通过后端服务发送到用户浏览器上。

小结

好了,这个就是 Vue.js 的介绍和它能解决的问题,Vue.js 是一个渐进式的 UI 框架,通过模板语法、组件化、数据同步等能够让我们快速、高效的开发大型前端应用。

提示

《Vue 3.x 全家桶完全指南与实战》课程已上线,包括 Vue 3.x、Vue Router 4.x、Vuex 4.x 所有初级到高级的语法特性详解,让你完全胜任 Vue 前端开发的工作。点击查看详情