跳到主要内容位置

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.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 框架,通过模板语法、组件化、数据同步等能够让我们快速、高效的开发大型前端应用。

提示

一系列的课程让你成为高级前端工程师。课程覆盖工作中所有常用的知识点和背后的使用逻辑,示例全部都为工作项目简化而来,学完即可直接上手开发!

即使你已经是高级前端工程师,在课程里也可能会发现新的知识点和技巧,让你的工作更加轻松!

《React 完全指南》课程,连载中现只需 48 元(领取优惠券)点击查看详情。

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

《React即时通信UI实战》课程,利用 Storybook、Styled-components、React-Spring 打造属于自己的组件库。

《JavaScript 基础语法详解》本人所著图书,包含 JavaScript 全面的语法知识和新特性, 可在京东、当当、淘宝等各大电商购买