Vue3 简介知识点及案例代码

一、Vue3 简介

Vue3 是一款用于构建用户界面的渐进式 JavaScript 框架,采用 MVVM 模式,具有响应式、组件化等优点,可提高开发效率,优化应用性能。

二、Web 前端开发概述

Web 前端开发涉及 HTML、CSS、JavaScript 等技术,用于构建用户可直接交互的页面部分。随着技术发展,出现了多种前端框架,Vue3 是其中的优秀代表,基于前后端分离模式,使前后端开发解耦,提高开发效率与代码可维护性。

三、Web 开发简史

从静态页面到动态页面,再到单页应用(SPA),前端框架不断演进。Vue3 作为新一代框架,在响应式性能、组件化开发等方面有显著提升。

vue3的发展历史

四、Vue3 的发展历程

Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,由尤雨溪(Evan You)于 2014 年首次发布。Vue3 是 Vue.js 的第三个主要版本,带来了许多重大改进和新特性。以下是 Vue3 的详细发展历程:

1. Vue3 的起源与动机(2018 年 - 2019 年)
  • 2018 年 9 月: 尤雨溪首次公开讨论 Vue3 的计划。他提到,Vue3 的主要目标是解决 Vue2 在大型应用中的性能问题,并引入一些新特性以提高开发体验。
  • 动机:
    • 性能优化: Vue2 在处理大型应用时,性能表现不如预期。尤雨溪希望 Vue3 能够通过更高效的渲染机制和更小的包体积来提升性能。
    • TypeScript 支持: 随着 TypeScript 的普及,Vue3 需要更好地支持 TypeScript,以满足开发者对类型安全的需求。
    • 模块化: Vue2 的内部架构较为复杂,Vue3 希望通过模块化设计,使其更易于维护和扩展。
    • 新特性: 引入一些新特性,如 Composition API、Fragments、Teleport 等,以提升开发体验。
2. Vue3 的开发过程(2019 年 - 2020 年)
  • 2019 年 1 月: Vue3 的开发工作正式开始。尤雨溪在 GitHub 上创建了 vue-next 仓库,用于存放 Vue3 的源代码。
  • 2019 年 4 月: 尤雨溪发布了 Vue3 的第一个公开预览版本,展示了新的响应式系统、基于 Proxy 的实现以及 Composition API 的初步设计。
  • 2019 年 6 月: 尤雨溪在 VueConf Toronto 上发表了关于 Vue3 的主题演讲,详细介绍了 Vue3 的新特性和设计理念。
  • 2019 年 10 月: Vue3 的第二个预览版本发布,引入了 Teleport 组件、Suspense 组件等新特性。
  • 2020 年 4 月: Vue3 的第三个预览版本发布,API 趋于稳定,团队开始专注于性能优化和错误修复。
  • 2020 年 6 月: Vue3 的 Release Candidate (RC) 版本发布,标志着 Vue3 的开发工作接近完成。
3. Vue3 的正式发布(2020 年 9 月)
  • 2020 年 9 月 18 日: Vue3 正式发布,版本号为 3.0.0。主要特性包括:
    • 基于 Proxy 的响应式系统: 相比 Vue2 的基于 Object.defineProperty 的实现,Proxy 提供了更强大的响应式能力,支持更复杂的数据结构,如 Map、Set 等。
    • Composition API: 提供了一种更灵活的逻辑复用方式,解决了 Vue2 中 mixins 的诸多问题,如命名冲突、数据来源不明等。
    • 性能提升: 渲染速度更快,内存占用更少,包体积更小。
    • TypeScript 重写: 整个框架使用 TypeScript 重写,提供了更好的类型支持。
    • Fragments: 支持组件返回多个根节点。
    • Teleport: 允许将组件的子节点渲染到 DOM 树的其他位置。
    • Suspense: 提供了异步组件的更优雅的解决方案。
4. Vue3 的后续发展(2020 年 - 2025 年)
  • 2020 年 10 月: Vue3 发布了 3.0.1 版本,修复了一些 bug 并优化了性能。
  • 2021 年 2 月: Vue3 发布了 3.1.0 版本,引入了服务端渲染(SSR)支持。
  • 2021 年 8 月: Vue3 发布了 3.2.0 版本,引入了 <script setup> 语法糖,简化了 Composition API 的使用。
  • 2022 年 2 月: Vue3 发布了 3.2.37 版本,修复了大量 bug 并优化了性能。
  • 2022 年 7 月: Vue3 发布了 3.2.40 版本,引入了新的 <script> 语法糖,进一步简化了组件定义。
  • 2023 年 3 月: Vue3 发布了 3.3.0 版本,引入了新的性能优化和功能改进。
  • 2024 年 1 月: Vue3 发布了 3.3.4 版本,继续修复 bug 和优化性能。
5. 现状与未来展望

截至 2025 年,Vue3 已经成为 Vue.js 的主流版本,拥有庞大的用户群体和活跃的社区。Vue3 的发展重点包括:

  • 持续的性能优化: 进一步提升框架的性能,特别是在大型应用中的表现。
  • 增强的 TypeScript 支持: 提供更完善的类型定义和类型检查工具。
  • 更强大的工具链: 改进 Vue CLI、Vite 等工具,提供更好的开发体验。
  • 新特性的引入: 根据社区需求和行业发展,引入更多新特性,如更好的 SSR 支持、更多的内置组件等。

五、基于前后端分离模式的 Web 开发

前后端分离模式下,前端负责页面展示与交互逻辑,后端提供数据接口。Vue3 通过 HTTP 请求获取后端数据,利用前端路由实现页面切换,提升用户体验。

六、Vue.js 与 MVVM 模式

MVVM 模式包括模型(Model)、视图(View)、视图模型(ViewModel)。Vue.js 中,Model 是数据,View 是页面展示,Vue 实例作为 ViewModel,连接 Model 与 View,实现数据双向绑定。

七、渐进式框架优点

1. **易学习** :语法简洁,上手快,适合初学者。
2. **灵活性高** :可按需引入组件、插件等,不强制使用特定技术栈。
3. **性能优化** :虚拟 DOM 提升渲染效率,响应式系统优化数据更新过程。

八、Vue3 的特点和优势

1. **响应式性能提升** :采用 Proxy 实现代替 Vue2 的 Object.defineProperty,响应式更高效。
2. **Composition API** :提供更灵活的组合式 API,方便代码复用与组织。
3. **更好的 TypeScript 支持** :与 TypeScript 深度融合,提升代码可维护性与类型安全性。

九、为什么使用 Vue3

相比 Vue2,Vue3 有诸多改进,如性能优化、新特性支持等,且社区活跃,生态丰富,适用于中大型项目开发,能提升开发效率与代码质量。

十、Vue.js 的响应式理解

Vue 通过响应式系统,将数据与页面元素关联,当数据变化时,自动更新页面。Vue3 的响应式基于 Proxy,可精确追踪数据变化。

案例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue3 响应式示例</title>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
    <div id="app">
        <p>{{ message }}</p>
        <button @click="updateMessage">更新消息</button>
    </div>
    <script>
        const { createApp, reactive, ref } = Vue;

        // 使用 ref 定义响应式数据
        const app = createApp({
            setup() {
                const message = ref('Hello Vue3!');
                const updateMessage = () => {
                    message.value = 'Message updated!';
                };
                return {
                    message,
                    updateMessage
                };
            }
        });

        app.mount('#app');
    </script>
</body>
</html>

十一、参考资料推荐

《Vue.js 实战宝典》、Vue 官方文档、《Vue3 项目实战》等。

  • 官方文档: https://v3.vuejs.org/
  • Vue Mastery: https://www.vuemastery.com/
  • Vue School: https://vueschool.io/
  • 《Vue.js 设计与实现》- 霍春阳
  • 《深入浅出 Vue.js》- 刘博文

综合性案例

案例一:待办事项列表

实现一个简单的待办事项列表应用,具备添加、删除、标记完成等功能,运用 Vue3 的响应式、组件化等知识点。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>待办事项列表</title>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 500px;
            margin: 0 auto;
            padding: 20px;
        }
        .todo-item {
            display: flex;
            justify-content: space-between;
            align-items: center;
            padding: 10px;
            border-bottom: 1px solid #ddd;
        }
        .todo-item.completed {
            text-decoration: line-through;
            color: #888;
        }
    </style>
</head>
<body>
    <div id="app">
        <h1>待办事项列表</h1>
        <input v-model="newTodo" placeholder="输入待办事项" />
        <button @click="addTodo">添加</button>
        <ul>
            <li class="todo-item" v-for="(todo, index) in todos" :key="index">
                <span :class="{ completed: todo.completed }">{{ todo.text }}</span>
                <div>
                    <button @click="toggleComplete(index)">标记完成</button>
                    <button @click="deleteTodo(index)">删除</button>
                </div>
            </li>
        </ul>
    </div>
    <script>
        const { createApp, reactive, ref } = Vue;

        const app = createApp({
            setup() {
                // 定义待办事项列表
                const todos = ref([]);
                // 定义新待办事项
                const newTodo = ref('');

                // 添加待办事项
                const addTodo = () => {
                    if (newTodo.value.trim()) {
                        todos.value.push({
                            text: newTodo.value.trim(),
                            completed: false
                        });
                        newTodo.value = '';
                    }
                };

                // 删除待办事项
                const deleteTodo = (index) => {
                    todos.value.splice(index, 1);
                };

                // 标记完成
                const toggleComplete = (index) => {
                    todos.value[index].completed = !todos.value[index].completed;
                };

                return {
                    todos,
                    newTodo,
                    addTodo,
                    deleteTodo,
                    toggleComplete
                };
            }
        });

        app.mount('#app');
    </script>
</body>
</html>

案例二:用户信息表单

创建一个用户信息表单,包含用户名、邮箱、密码等字段,运用 Vue3 的表单绑定、验证等功能。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>用户信息表单</title>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 500px;
            margin: 0 auto;
            padding: 20px;
        }
        .form-group {
            margin-bottom: 15px;
        }
        label {
            display: block;
            margin-bottom: 5px;
        }
        input[type="text"],
        input[type="email"],
        input[type="password"] {
            width: 100%;
            padding: 8px;
            box-sizing: border-box;
        }
        .error {
            color: red;
            font-size: 0.9em;
        }
    </style>
</head>
<body>
    <div id="app">
        <h1>用户信息表单</h1>
        <form @submit.prevent="submitForm">
            <div class="form-group">
                <label for="username">用户名</label>
                <input
                    type="text"
                    id="username"
                    v-model="user.username"
                    @blur="validateUsername"
                />
                <p v-if="usernameError" class="error">{{ usernameError }}</p>
            </div>
            <div class="form-group">
                <label for="email">邮箱</label>
                <input type="email" id="email" v-model="user.email" @blur="validateEmail" />
                <p v-if="emailError" class="error">{{ emailError }}</p>
            </div>
            <div class="form-group">
                <label for="password">密码</label>
                <input
                    type="password"
                    id="password"
                    v-model="user.password"
                    @blur="validatePassword"
                />
                <p v-if="passwordError" class="error">{{ passwordError }}</p>
            </div>
            <button type="submit" :disabled="!isValid">提交</button>
        </form>
    </div>
    <script>
        const { createApp, reactive, ref, computed } = Vue;

        const app = createApp({
            setup() {
                // 定义用户信息
                const user = reactive({
                    username: '',
                    email: '',
                    password: ''
                });

                // 定义验证错误信息
                const usernameError = ref('');
                const emailError = ref('');
                const passwordError = ref('');

                // 验证用户名
                const validateUsername = () => {
                    if (user.username.trim() === '') {
                        usernameError.value = '用户名不能为空';
                    } else if (user.username.length < 3) {
                        usernameError.value = '用户名至少 3 个字符';
                    } else {
                        usernameError.value = '';
                    }
                };

                // 验证邮箱
                const validateEmail = () => {
                    const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
                    if (user.email.trim() === '') {
                        emailError.value = '邮箱不能为空';
                    } else if (!emailPattern.test(user.email)) {
                        emailError.value = '邮箱格式不正确';
                    } else {
                        emailError.value = '';
                    }
                };

                // 验证密码
                const validatePassword = () => {
                    if (user.password.trim() === '') {
                        passwordError.value = '密码不能为空';
                    } else if (user.password.length < 6) {
                        passwordError.value = '密码至少 6 个字符';
                    } else {
                        passwordError.value = '';
                    }
                };

                // 表单提交
                const submitForm = () => {
                    validateUsername();
                    validateEmail();
                    validatePassword();

                    if (isValid.value) {
                        console.log('表单提交成功,用户信息:', user);
                    }
                };

                // 计算表单是否有效
                const isValid = computed(() => {
                    return (
                        usernameError.value === '' &&
                        emailError.value === '' &&
                        passwordError.value === ''
                    );
                });

                return {
                    user,
                    usernameError,
                    emailError,
                    passwordError,
                    validateUsername,
                    validateEmail,
                    validatePassword,
                    submitForm,
                    isValid
                };
            }
        });

        app.mount('#app');
    </script>
</body>
</html>
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐