手记

Vue2 考点解析及入门教程

概述

本文详细介绍了Vue2的核心概念、语法基础、组件化开发及路由与状态管理等内容,旨在帮助开发者掌握Vue2的基本使用方法。此外,文章还深入解析了Vue2的一些常见考点,如深浅拷贝和生命周期钩子,帮助读者更好地理解Vue2的工作原理。文章最后还列举了一些常见的面试题及解析,并介绍了常用的第三方库,如axios、vue-router和vuex,为开发者提供了丰富的学习资源和实践指导。Vue2 考点涵盖了从基础概念到高级应用的各个方面,是学习Vue2不可或缺的内容。

Vue2 基础概念介绍
什么是Vue.js

Vue.js 是一个轻量级的前端 JavaScript 框架,主要用于构建用户界面及交互应用。Vue.js 与 React、Angular 等框架相比,具有学习曲线平缓、易于上手的特点。Vue.js 可以用在单一页面应用(SPA)中,通过其响应式系统和虚拟 DOM 来提高应用性能。

Vue2 主要特点和优势
  • 轻量级:Vue.js 的核心库只有 20kB 压缩后,包含了核心功能,如依赖追踪和变更传播。
  • 可组合性:Vue 可以与其它库或已有的代码无缝协作,不需要全部采用 Vue。
  • 响应式:Vue 的响应式数据绑定允许开发者声明式地定义数据和视图的关系,框架会自动追踪变更,实现高效更新。
  • 组件化:Vue 的组件化设计使代码更加模块化和复用性更强。
  • 虚拟 DOM:Vue 采用虚拟 DOM 来提高应用性能,通过比较前后两次的虚拟 DOM,最小化真实 DOM 操作。
Vue2 与Vue3 的差异
  • 性能优化:Vue 3 在渲染性能上有所提升,特别是在复杂列表和嵌套组件的情况下。
  • API 增强:Vue 3 提供了更强大和更一致的 API,包括 Composition API。
  • JavaScript 语言特性:Vue 3 更好地利用了现代 JavaScript 语言的特性,例如 TypeScript 和静态类型支持,提供了更好的类型推断和类型检查。
  • Tree-shaking:Vue 3 完全支持 Tree-shaking,以减少打包后应用的体积。
  • 打桩函数:Vue 3 引入了打桩函数,让测试更加方便。
  • 破坏性更改:Vue 3 中有许多向后不兼容的更改,例如引入了 Composition API,移除了 Vue 2 中的一些特性,如 v-bind.syncv-modellazy 模式。
Vue2 语法基础
数据绑定

Vue.js 中的数据绑定可以通过插值表达式实现,插值表达式是模板中的一个特殊语法,用于在页面上显示数据。在模板中,通过双大括号 {{ }} 将数据绑定到视图。

<div id="app">
    {{ message }} 
</div>
var app = new Vue({
    el: '#app',
    data: {
        message: 'Hello Vue!'
    }
});
计算属性与方法

计算属性是基于数据依赖关系的缓存属性,可以基于一个或多个其他属性计算得出。计算属性默认是惰性的,只有当依赖的数据发生变更时才会重新计算。

<div id="app">
    {{ message }}
    {{ fullName }}
</div>
var app = new Vue({
    el: '#app',
    data: {
        firstName: 'John',
        lastName: 'Doe'
    },
    computed: {
        message: function () {
            return `${this.firstName} ${this.lastName}`;
        },
        fullName: function () {
            return `${this.firstName} ${this.lastName}`;
        }
    }
});

方法是定义在 Vue 实例上的函数,用于处理事件等任务。

<div id="app">
    {{ message }}
    <button v-on:click="logMessage">点击显示日志</button>
</div>
var app = new Vue({
    el: '#app',
    data: {
        message: 'Hello Vue!'
    },
    methods: {
        logMessage: function () {
            console.log(this.message);
        }
    }
});
模板语法

Vue 的模板语法是基于 HTML 的,用一些特殊语法扩展了 HTML,以满足数据绑定和指令的需求。

插值表达式

插值表达式是模板中的一个特殊语法,用于在页面上显示数据。在模板中,通过双大括号 {{ }} 将数据绑定到视图。

<div id="app">
    {{ message }}
</div>
var app = new Vue({
    el: '#app',
    data: {
        message: 'Hello Vue!'
    }
});

v-on 指令

v-on 指令用于监听事件,如点击、鼠标悬停等。事件处理函数可以绑定在 Vue 实例的 methods 中。

<div id="app">
    <button v-on:click="increment">点击加一</button>
    <p>{{ count }}</p>
</div>
var app = new Vue({
    el: '#app',
    data: {
        count: 0
    },
    methods: {
        increment: function () {
            this.count++;
        }
    }
});
指令详解

Vue 中的指令是带有 v- 前缀的特殊属性,用于给 DOM 元素提供一些自定义行为。常见指令包括 v-ifv-forv-onv-bind

  • v-if: 根据表达式的值,条件性地渲染元素或组件。
  • v-for: 根据表达式的值,重复渲染某一元素或组件。
  • v-on: 绑定事件处理函数。
  • v-bind: 动态绑定一个或多个属性,如绑定一个对象的属性到 HTML 标签的属性。
  • v-model: 实现双向数据绑定。
<div id="app">
    <button v-if="show">显示按钮</button>
    <ul>
        <li v-for="item in items">{{ item }}</li>
    </ul>
    <input v-model="message" placeholder="输入提示" />
</div>
var app = new Vue({
    el: '#app',
    data: {
        show: true,
        items: ["苹果", "香蕉", "橙子"],
        message: ''
    }
});
Vue2 组件化开发
组件基础

组件是 Vue 框架的核心概念,代表了可复用的 Vue 实例。一个组件可以包含 HTML 模板、CSS 样式和 JavaScript 逻辑。

<div id="app">
    <my-component></my-component>
</div>
Vue.component('my-component', {
    template: '<p>这是我的组件</p>'
});

var app = new Vue({
    el: '#app'
});
组件间通信

组件间可以通过 props 和事件来传递数据。

父向子通信(父组件向子组件传递数据)

父组件通过 props 将数据传递给子组件。

<div id="app">
    <my-component v-bind:message="parentMessage"></my-component>
</div>
Vue.component('my-component', {
    props: ['message'],
    template: '<p>{{ message }}</p>'
});

var app = new Vue({
    el: '#app',
    data: {
        parentMessage: '从父组件传来的数据'
    }
});

子向父通信(子组件向父组件传递数据)

子组件通过 $emit 事件向父组件传递数据。

<div id="app">
    <my-component v-on:child-event="handleChildEvent"></my-component>
</div>
Vue.component('my-component', {
    template: '<button v-on:click="sendToParent">触发事件</button>',
    methods: {
        sendToParent: function () {
            this.$emit('child-event', '事件的参数');
        }
    }
});

var app = new Vue({
    el: '#app',
    methods: {
        handleChildEvent: function (msg) {
            console.log('来自子组件的数据: ' + msg);
        }
    }
});
插槽和作用域插槽

插槽允许父组件向子组件注入内容,实现内容的复用和灵活性。作用域插槽允许父组件接收子组件的数据,从而定制子组件的内容。

<div id="app">
    <my-component>
        <template v-slot:default="slotProps">
            <p>{{ slotProps.text }}</p>
        </template>
    </my-component>
</div>
Vue.component('my-component', {
    props: ['text'],
    template: `
        <div>
            <slot v-bind:text="text"></slot>
        </div>
    `
});

var app = new Vue({
    el: '#app',
    data: {
        text: '文本内容'
    }
});
动态组件与异步组件

动态组件允许组件在运行时动态地切换。

<div id="app">
    <component v-bind:is="currentComponent"></component>
</div>
Vue.component('component-a', {
    template: '<p>组件A的内容</p>'
});
Vue.component('component-b', {
    template: '<p>组件B的内容</p>'
});

var app = new Vue({
    el: '#app',
    data: {
        currentComponent: 'component-a'
    }
});
异步组件

异步组件允许按需加载组件,提高应用性能。

Vue.component('async-component', () => ({
    template: '<p>这是异步加载的组件</p>',
    async: true,
    // 指定异步组件的来源
    resolve: () => import('./path/to/async-component')
}));
Vue2 路由与状态管理
Vue Router 简介

Vue Router 是 Vue.js 的官方路由库,用于构建单页面应用。它允许开发者定义不同的路径,每个路径对应一个视图组件。

路由模式及配置

Vue Router 支持不同的路由模式,如 history 模式和 hash 模式。hash 模式下,URL 中会包含 # 符号;history 模式下,URL 更加友好,没有 # 符号。

import Vue from 'vue';
import Router from 'vue-router';

Vue.use(Router);

const routes = [
    { path: '/', component: Home },
    { path: '/about', component: About }
];

const router = new Router({
    mode: 'history',
    routes: routes
});

new Vue({
    router: router,
    render: h => h(App)
}).$mount('#app');
  • mode: 'history' 使用 HTML5 History 模式,URL 更加友好。
  • routes 配置了路由路径和对应的组件。
Vuex 使用指南

Vuex 是 Vue.js 的状态管理库,用于管理应用中所有组件共享的状态,提供了一种集中化的状态管理方式。

安装 Vuex

首先通过 npm 安装 Vuex。

npm install vuex --save

创建 Vuex Store

创建一个 Vuex store 对象,该对象包含 statemutationsactionsgetters 等属性。

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({
    state: {
        count: 0
    },
    mutations: {
        increment(state) {
            state.count++;
        }
    },
    actions: {
        increment({ commit }) {
            commit('increment');
        }
    },
    getters: {
        count: state => state.count
    }
});

new Vue({
    store,
    render: h => h(App)
}).$mount('#app');

使用 Vuex Store

在组件中使用 Vuex store。

<div id="app">
    <p>{{ $store.getters.count }}</p>
    <button v-on:click="$store.dispatch('increment')">点击加一</button>
</div>
状态管理的基本概念

状态管理的基本概念包括 statemutationactiongetter

  • state:应用的状态,所有组件可以通过 getters 访问到这些状态。
  • mutation:用于改变 state 的状态,必须是同步函数。
  • action:是异步的,用于处理异步操作。
  • getter:用于过滤或计算 state 中的状态,可以视为 state 的计算属性。
Vue2 常见考点解析
深浅拷贝

浅拷贝仅复制顶层数据,改变拷贝后的数据不会影响原数据,而深拷贝则会拷贝所有的嵌套对象。

// 浅拷贝
let obj1 = { a: 1 };
let obj2 = { ...obj1 };
obj1.a = 2;
console.log(obj2.a); // 输出 1

// 深拷贝
let obj3 = JSON.parse(JSON.stringify(obj1));
obj1.a = 3;
console.log(obj3.a); // 输出 2
生命周期钩子

Vue 组件的生命周期包括创建、挂载、更新和销毁四个阶段,每个阶段都有对应的生命周期钩子。

Vue.component('my-component', {
    data: function () {
        return {
            message: 'Hello, Vue!'
        }
    },
    beforeCreate: function () {
        console.log('beforeCreate');
    },
    created: function () {
        console.log('created');
    },
    beforeMount: function () {
        console.log('beforeMount');
    },
    mounted: function () {
        console.log('mounted');
    },
    beforeUpdate: function () {
        console.log('beforeUpdate');
    },
    updated: function () {
        console.log('updated');
    },
    beforeDestroy: function () {
        console.log('beforeDestroy');
    },
    destroyed: function () {
        console.log('destroyed');
    }
});
常见面试题及解析

面试题一:Vue 的响应式原理是什么?

Vue 的响应式系统通过 Object.defineProperty 实现了数据的 getter 和 setter,当数据发生变化时,Vue 会触发相应的视图更新。

let obj = {};
Object.defineProperty(obj, 'name', {
    get() {
        return this._name;
    },
    set(value) {
        this._name = value;
    }
});
obj.name = 'John';
console.log(obj.name); // 输出 'John'

面试题二:Vue 的模板语法有哪些特点?

Vue 的模板语法是基于 HTML 的,使用了一些特殊语法扩展了 HTML,如插值表达式、指令和过滤器。它允许开发者声明式地定义数据和视图的关系。

面试题三:Vue 的组件化开发有哪些好处?

组件化开发使代码更加模块化和复用性更强,每个组件只关注自身逻辑,有助于构建复杂的用户界面。

常用第三方库介绍

axios

axios 是一个基于 promise 的 HTTP 库,用于进行异步 HTTP 请求,支持浏览器和 Node.js。

import axios from 'axios';

axios.get('https://api.example.com/data')
    .then(function (response) {
        console.log(response);
    })
    .catch(function (error) {
        console.log(error);
    });

vue-router

vue-router 提供了丰富的路由功能,如嵌套的视图、参数传递等,是构建单页面应用的必备工具。

import Vue from 'vue';
import Router from 'vue-router';

Vue.use(Router);

const routes = [
    { path: '/', component: Home },
    { path: '/about', component: About }
];

const router = new Router({
    mode: 'history',
    routes: routes
});

new Vue({
    router: router,
    render: h => h(App)
}).$mount('#app');

vuex

vuex 用于管理全局状态,通过集中化管理应用中的数据,使得组件间的通信更加简单和高效。

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({
    state: {
        count: 0
    },
    mutations: {
        increment(state) {
            state.count++;
        }
    },
    actions: {
        increment({ commit }) {
            commit('increment');
        }
    },
    getters: {
        count: state => state.count
    }
});

new Vue({
    store,
    render: h => h(App)
}).$mount('#app');
Vue2 实践项目开发
创建一个简单的Vue2 项目

创建一个简单的 Vue2 项目,项目结构如下:

my-project/
    node_modules/
    public/
        index.html
    src/
        main.js
        App.vue
        components/
            HelloWorld.vue
    package.json
    .babelrc

初始化项目

使用 Vue CLI 创建一个新的 Vue 项目。

vue create my-project
cd my-project
npm run serve

项目结构规划

  • public/:存放静态文件,如 index.html
  • src/:存放源代码,包括 main.jsApp.vue 和组件目录。
  • components/:存放组件文件,如 HelloWorld.vue

功能实现与调试

实现简单的功能,如显示文本、按钮等。

<!-- HelloWorld.vue -->
<template>
    <div>
        <p>{{ message }}</p>
        <button @click="handleClick">按钮</button>
    </div>
</template>

<script>
export default {
    data: function () {
        return {
            message: '你好,Vue!'
        };
    },
    methods: {
        handleClick: function () {
            this.message = '点击按钮';
        }
    }
};
</script>
<!-- App.vue -->
<template>
    <div id="app">
        <HelloWorld />
    </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue';

export default {
    components: {
        HelloWorld
    }
};
</script>

项目打包与部署

打包项目并部署到线上。

npm run build

打包后,会在 dist/ 目录下生成项目静态文件,可以将这些文件部署到任何静态文件服务器上。

0人推荐
随时随地看视频
慕课网APP