一文速通 Vue 基础

131,992次阅读
没有评论

共计 19263 个字符,预计需要花费 49 分钟才能阅读完成。

1、Vue 概述

官方文档中文:https://staging-cn.vuejs.org/

英文:Vue.js – The Progressive JavaScript Framework | Vue.js

1.1、什么是 MVVM

MVVM(Model-View-ViewModel)是一种软件设计模式,由微软 WPF(用于替代 WinForm,以前就是用这个技术开发桌面应用程序的)和 Silverlight(类似于 Java Applet,简单点说就是在浏览器上运行 WPF)的架构师 Ken Cooper 和 Ted Peters 开发,是一种简化用户界面的事件驱动编程方式。由 John Gossman(同样也是 WPF 和 Sliverlight 的架构师)与 2005 年在他的博客上发表。

MVVM 源自于经典的 MVC(Model-View-Controller)模式。MVVM 的核心是 ViewModel 层,负责转换 Model 中的数据对象来让数据变得更容易管理和使用。其作用如下:

  • 该层向上与视图层进行双向数据绑定
  • 向下与 Model 层通过接口请求进行数据交互

一文速通 Vue 基础

MVVM 已经相当成熟了,主要运用但不仅仅在网络应用程序开发中。

当下流行的 MVVM 框架有 Vue.js,Anfular JS

1.2 为什么要使用 MVVM

MVVM 模式和 MVC 模式一样,主要目的是分离视图(View)和模型(Model),有几大好处

  • 低耦合:视图(View)可以独立于 Model 变化和修改,一个 ViewModel 可以绑定到不同的 View 上,当 View 变化的时候 Model 可以不变,当 Model 变化的时候 View 也可以不变。
  • 可复用:可以把一些视图逻辑放在一个 ViewModel 里面,让很多 View 重用这段视图逻辑。
  • 独立开发:开发人员可以专注于业务逻辑和数据的开发(ViewMode),设计人员可以专注于页面设计。
  • 可测试:界面素来是比较难以测试的,而现在测试可以针对 ViewModel 来写。

MVVM 组成部分

一文速通 Vue 基础

(1)View

View 是视图层,也就是用户界面。前端主要由 HTH L 和 csS 来构建,为了更方便地展现 vi eu to del 或者 Hodel 层的数据,已经产生了各种各样的前后端模板语言,比如 FreeMarker,Thyme leaf 等等,各大 MV VM 框架如 Vue.js.Angular JS,EJS 等也都有自己用来构建用户界面的内置模板语言。

(2)Model

Model 是指数据模型,泛指后端进行的各种业务逻辑处理和数据操控,主要围绕数据库系统展开。这里的难点主要在于需要和前端约定统一的接口规则

(3)ViewModel

ViewModel 是由前端开发人员组织生成和维护的视图数据层。在这一层,前端开发者对从后端获取的 Model 数据进行转换处理,做二次封装,以生成符合 View 层使用预期的视图数据模型。

需要注意的是 View Model 所封装出来的数据模型包括视图的状态和行为两部分,而 Model 层的数据模型是只包含状态的

  • 比如页面的这一块展示什么,那一块展示什么这些都属于视图状态(展示)
  • 页面加载进来时发生什么,点击这一块发生什么,这一块滚动时发生什么这些都属于视图行为(交互)

视图状态和行为都封装在了 View Model 里。这样的封装使得 View Model 可以完整地去描述 View 层。由于实现了双向绑定,View Model 的内容会实时展现在 View 层,这是激动人心的,因为前端开发者再也不必低效又麻烦地通过操纵 DOM 去更新视图。

MVVM 框架已经把最脏最累的一块做好了,我们开发者只需要处理和维护 View Model,更新数据视图就会自动得到相应更新,真正实现事件驱动编程。

View 层展现的不是 Model 层的数据,而是 ViewModel 的数据,由 ViewModel 负责与 Model 层交互,这就 完全解耦了 View 层和 Model 层,这个解耦是至关重要的,它是前后端分离方案实施的重要一环。

1.3 Vue

Vue(读音 /vju/,类似于 view) 是一套用于构建用户界面的渐进式框架,发布于 2014 年 2 月。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库(如:vue-router,vue-resource,vue x) 或既有项目整合。

(1)MVVM 模式的实现者

  • Model:模型层,在这里表示 JavaScript 对象
  • View:视图层,在这里表示 DOM(HTML 操作的元素)
  • ViewModel:连接视图和数据的中间件,Vue.js 就是 MVVM 中的 View Model 层的实现者

在 MVVM 架构中,是不允许数据和视图直接通信的,只能通过 ViewModel 来通信,而 View Model 就是定义了一个 Observer 观察者

ViewModel 能够观察到数据的变化,并对视图对应的内容进行更新

ViewModel 能够监听到视图的变化,并能够通知数据发生改变

至此,我们可以大致了解,Vue.js 就是一个 MV VM 的实现者,他的核心就是实现了 DOM 监听与数据绑定

(2)为什么使用 Vue.js

  • 轻量级,体积小是一个重要指标。Vue.js 压缩后有只有 20 多 kb(Angular 压缩后 56kb+,React 压缩后 44kb+)
  • 移动优先。更适合移动端,比如移动端的 Touch 事件
  • 易上手,学习曲线平稳,文档齐全
  • 吸取了 Angular(模块化) 和 React(虚拟 DOM) 的长处,并拥有自己独特的功能,如:计算属性
  • 开源,社区活跃度高

1.4 第一个 Vue 程序

开发环境:IDEA(因为 IDEA 可以安装 Vue 的插件)

一文速通 Vue 基础

下载地址

    • 包含完整的警告和调试模式:https://vuejs.org/js/vue.js
    • 删除了警告,30.96KB min + gzip:https://vuejs.org/js/vue.min.js
  • CDN(通常使用导入方法)

代码编写

Vue.js 的核心是实现了 MVVM 模式,它扮演的角色就是 ViewModel 层,那么所谓的第一个应用程序就是展示的它的数据绑定功能,操作流程如下:

1、创建一个 HTML 文件、引入 Vue.js、创建一个 Vue 实例、将数据绑定到页面元素




    
    Title




{{message}}

说明:只需要在绑定的元素中使用双花括号将 Vue 创建的名为 message 属性包裹起来,即可实现数据绑定功能,也就实现了 ViewModel 层所需的效果,是不是和 EL 表达式非常像?

2、测试

为了能够更直观的体验 Vue 带来的数据绑定功能,我们需要在浏览器测试一番,操作流程如下:

1、在浏览器上运行第一个 Vue 应用程序,进入开发者工具

2、在控制台输入 vm.message=”hello,word”,然后回车,你会发现浏览器中显示的内容会直接变成 hello,world

一文速通 Vue 基础

一文速通 Vue 基础

此时就可以在控制台直接输入 vm.message 来修改值,中间是可以省略 data 的,在这个操作中,我并没有主动操作 DOM,就让页面的内容发生了变化,这就是借助了 Vue 的数据绑定功能实现的;MVVM 模式中要求 ViewModel 层就是使用观察者模式来实现数据的监听与绑定,以做到数据与视图的快速响应。

2、Vue 基本语法

2.1、v-bind(给组件绑定参数,简写:)

(鼠标悬浮提示)

可以使用 v-bind 来绑定元素特性!


鼠标悬停几秒钟查看此处动态绑定的提示信息!

一文速通 Vue 基础

像这种 v-bind 等被称为指令。指令带有前缀 v-,以表示它们是 Vue 提供的特殊特性,可能你已经猜到了,它们会在渲染的 DOM 上应用特殊的响应式行为,在这里,该指令的意思是:“将这个元素节点的 title 特性和 Vue 实例的 message 属性保持一致”。

如果你再次打开浏览器的 JavaScript 控制台,输入 vm.message = “ 新消息 ”,就会再一次看到这个绑定了 title 特性的 HTML 已经进行了更新。

2.2、v-if、v-else(判断)


A

B

C

D

一文速通 Vue 基础

2.3、v-for(循环)

  • {{item.message}}--{{index}}
  • 一文速通 Vue 基础

    2.4、v-on(绑定事件,简写 @)

    事件有 Vue 的事件,和前端页面本身的一些事件!我们这里的 click 是 vue 的事件,可以绑定到 Vue 中的 methods 中的方法事件!

    一文速通 Vue 基础

    2.5、v-model(数据双向绑定)

    可以用 v-model 指令在表单

    注意:v-model 会忽略所有表单元素的 value、checked、selected 特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组建的 data 选项中声明初始值!

    
    
    输入的文本 : {{message}}
    性别 :

    选中了 : {{xingbie}}


    下拉框: value : {{xialakuang}}

    一文速通 Vue 基础

    注意:如果 v-model 表达式的初始值未能匹配任何选项,

    3、Vue 组件

    什么是组件

    组件是可复用的 Vue 实例,说白了就是一组可以重复使用的模板,跟 JSTL 的自定义标签、Thymeleaf 的 th:fragement 等框架有着异曲同工之妙。通常一个应用会以一棵嵌套的组件树的形式来组织:

    一文速通 Vue 基础

    例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件

    
    

    说明:

    • Vue.component():注册组件
    • ydd:自定义组件的名字
    • template:组件的模板
    • 使用 props 属性传递参数
    • v-for=”item in items”:遍历 Vue 实例中定义的名为 items 的数组,并创建同等数量的组件
    • v-bind:qin=”item”:将遍历的 item 项绑定到组件中 props 定义名为 qin 属性上;= 号左边的 qin 为 props 定义的属性名,右边的为 item in items 中遍历的 item 项的值

    4、Axios 异步通信

    4.1、什么是 Axios

    Axios 是一个开源的可以用在浏览器端和 Node JS 的异步通信框架,她的主要作用就是实现 AJAX 异步通信,其功能特点如下:

    • 从浏览器中创建 XMLHttpRequests
    • 从 node.js 创建 http 请求
    • 支持 Promise API [JS 中链式编程]
    • 拦截请求和响应
    • 转换请求数据和响应数据
    • 取消请求
    • 自动转换 JSON 数据
    • 客户端支持防御 XSRF (跨站请求伪造)

    GitHub:https://github.com/axios/axios

    中文文档 : http://www.axios-js.com/

    为什么要使用 Axios

    由于 Vue.js 是一个视图层框架并且作者 (尤雨溪) 严格准守 SoC (关注度分离原则) 所以 Vue.js 并不包含 AJAX 的通信功能,为了解决通信问题,作者单独开发了一个名为 vue-resource 的插件,不过在进入 2.0 版本以后停止了对该插件的维护并推荐了 Axios 框架。少用 jQuery,因为它操作 Dom 太频繁!

    一文速通 Vue 基础

    4.2、Vue 生命周期

    官方文档:https://cn.vuejs.org/v2/guide/instance.html# 生命周期图示

    Vue 实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载 DOM、渲染 → 更新 → 渲染、卸载等一系列过程,我们称这是 Vue 的生命周期。通俗说就是 Vue 实例从创建到销毁的过程,就是生命周期。

    在 Vue 的整个生命周期中,它提供了一系列的事件,可以让我们在事件触发时注册 JS 方法,可以让我们用自己注册的 JS 方法控制整个大局,在这些事件响应方法中的 this 直接指向的是 Vue 的实例。

    4.3、Axios 测试

    (1)先准备伪数据 data.json

    {
      "name": "博客园",
      "url": "https://www.cnblogs.com/",
      "page": 1,
      "isNonProfit": true,
      "address": {
        "street": "含光门",
        "city": "陕西西安",
        "country": "中国"
      },
      "links": [
        {
          "name": "bilibili",
          "url": "https://bilibili.com"
        },
        {
          "name": "博客园",
          "url": "https://www.cnblogs.com/"
        },
        {
          "name": "百度",
          "url": "https://www.baidu.com/"
        }
      ]
    }

    (2)测试代码

    
    
    
        
        Title
        
        
    
    
    
    {{info.name}}
    {{info.address.street}}
    {{info.name}}链接

    说明:

    1、在这里使用了 v-bind 将 a:href 的属性值与 Vue 实例中的数据进行绑定;

    2、使用 axios 框架的 get 方法请求 AJAX 并自动将数据封装进了 Vue 实例的数据对象中;

    3、我们在 data 中的数据结构必须和 Ajax 响应回来的数据个是匹配;

    (3)测试

    一文速通 Vue 基础

    5、Vue 计算属性

    计算属性:计算出来的结果,保存在属性中,内存中运行:虚拟 Dom

    计算属性的重点突出在属性两个字上(属性是名词),首先它是个属性其次这个属性有计算的能力(计算是动词),这里的计算就是个函数:简单点说,它就是一个能够将计算结果缓存起来的属性(将行为转化成了静态的属性),仅此而已;可以想象为缓存!

    
    

    currentTime1:{{currentTime1()}}

    currentTime2:{{currentTime2}}

    一文速通 Vue 基础

    注意:methods 和 computed 里的东西不能重名

    说明:

    • methods : 定义方法,调用方法使用 currentTime1(),需要带括号
    • computed:定义计算属性,调用属性使用 currentTime2,不需要带括号;this.message 是为了能够让 currentTime2 观察到数据变化而变化
    • 如何在方法中的值发生了变化,则缓存就会刷新!可以在控制台使用 vm.message=’4’,改变下数据的值,再次测试观察效果!

    结论:

    调用方法时,每次都需要讲行计算,既然有计算过程则必定产生系统开销,那如果这个结果是不经常变化的呢? 此时就可以考虑将这个结果缓存起来,采用计算属性可以很方便的做到这点,计算属性的主要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销;

    6、内容分发(插槽)

    在 Vue.js 中我们使用 元素作为承载分发内容的出口,可以称其为插槽,可以应用在组合组件的场景中

    测试

    比如准备一个代办事项组件(todo),该组件由待办标题(todo-title)和待办内容(todo-items)组成,但这三个组件又是相互独立的,该如何操作呢?

    第一步:定义一个待办事项的组件

    • Study Java


    });

    第二步:我们需要让待办事项的标题和值实现动态绑定,怎么做呢?我们可以留出一个插槽!

    1、将上面的代码留出一个插槽,即 slot

     Vue.component('todo',{template:'
    ' });

    2、定义一个名为 todo-title 的待办标题组件和 todo-items 的待办内容组件

    Vue.component('todo-title',{props:['title'],
            template:'
    {{title}}
    ' }); // 这里的 index,就是数组的下标,使用 for 循环遍历的时候,可以循环出来!Vue.component("todo-items",{props:["item","index"], template:"
  • {{index+1}},{{item}}
  • " });

    3、slot 通过 name 和组件绑定

     Vue.component('todo',{template:'
    ' });

    4、实例化 Vue 并初始化数据

     var vm = new Vue({
            el:"#vue",
            data:{todoItems:['test1','test2','test3']
            }
        });

    5、将数据通过插槽插入预留出来的位置

    
        
        
    

    完整代码

    
    
        
            
            Title
        
        
            
            

    一文速通 Vue 基础

    注意:v-for=”item in todoItems” :item,“:”后不能有空格,否则页面无内容控制台也不会报错。并且方法需要使用 methods 而不是 method。

    7、自定义事件内容分发

    通过上诉代码我们可以发现一个问题,如果删除操作要在组件中完成,那么组件如何删除 Vue 实例中的数据?

    删除按钮是在组件中的,点击删除按钮删除对应的数据。

    阅读 Vue 教程可知,此时就涉及到参数传递与事件分发了,Vue 为我们提供了自定义事件的功能很好的帮助我们解决了这个问题;组件中使用 this.$emit(‘自定义事件名’,参数),而在视图层通过自定义事件绑定 Vue 中的删除操作的方法

    步骤:

    • 在 Vue 实例中定义一个删除操作的方法 removeItems()
    methods: {removeItems: function (index) {this.todoItems.splice(index,1);
    	}
    }

    说明: splice(index,n) 方法是删除 index 下标开始的 n 个元素

    • 在视图层中自定义事件并绑定 Vue 实例中的方法

    自定义事件为 remove,通过 v -on 绑定 removeItems 方法

    • 在相应的组件中绑定自定义事件
    Vue.component("todo-items",{props:["item","index"],
        template:"
  • {{item}}---{{index}}
  • ", methods: {remove: function (index) {this.$emit('remove',index); } } });

    完整代码如下

    
    
        
            
            Title
        
        
            
            

    逻辑理解

    一文速通 Vue 基础

    8、Vue 入门小结

    核心:数据驱动,组件化

    优点:借鉴了 AngularJS 的模块化开发和 React 的虚拟 Dom,虚拟 Dom 就是把 Demo 操作放到内存中执行;

    常用的属性:

    • v-if
    • v-else-if
    • v-else
    • v-for
    • v-on 绑定事件,简写 @
    • v-model 数据双向绑定
    • v-bind 给组件绑定参数,简写:

    组件化:

    • 组合组件 slot 插槽
    • 组件内部绑定事件需要使用到 this.$emit(“事件名”, 参数);
    • 计算属性的特色,缓存计算数据

    遵循 SoC 关注度分离原则,Vue 是纯粹的视图框架,并不包含,比如 Ajax 之类的通信功能,为了解决通信问题,我们需要使用 Axios 框架做异步通信;

    说明:Vue 的开发都是要基于 NodeJS, 实际开发采用 vue-cli 脚手架开发,vue-router 路由,vuex 做状态管理;Vue UI,界面我们一般使用 ElementUI(饿了么出品),或者 ICE(阿里巴巴出品)来快速搭建前端项目。

    官网:

    • https://element.eleme.cn/#/zh-CN
    • https://ice.work/

    9、Vue:第一个 vue-cli 项目

    什么是 vue-cli

    vue-cli 官方提供的一个脚手架,用于快速生成一个 vue 的项目模板:

    预先定义好的目录结构及基础代码,就好比咱们在创建 Maven 项目时可以选择创建一个骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速:

    主要的功能

    • 统一的目录结构
    • 本地调试
    • 热部署
    • 单元测试
    • 集成打包上线

    需要的环境

    • Node.js : http://nodejs.cn/download/

    安装的时候一直下一步直到结束,安装在自己的环境目录下。

    • Git:https://git-scm.com/downloads

    镜像:https://npm.taobao.org/mirrors/git-for-windows/

    确认 node.js 是否安装成功:

    • 在 cmd 中运行 node - v 命令,查看是否能够输出版本号
    • 在 cmd 中运行 npm - v 命令,查看是否能够输出版本号

    这个 npm,就是一个软件包管理工具,就和 linux 下的 apt 软件安装差不多!

    安装 Node.js 淘宝镜像加速器(cnpm)

    这样子的话,下载会快很多~

    # 安装 node.js 淘宝镜像加速器(cnpm)# -g 就是全局安装
    npm install cnpm -g
    # 或使用如下语句解决 npm 速度慢的问题
    npm install --registry=https://registry.npm.taobao.org
    
    # 安装 vue-cli
    cnpm install vue-cli-g
    #测试是否安装成功 #查看可以基于哪些模板创建 vue 应用程序,通常我们选择 webpack
    vue list

    安装过程可能有点慢,耐心等待。虽然安装了 cnpm,但是尽量少用!

    安装的位置(隐藏目录打开):C:UsersAdministratorAppDataRoamingnpm

    9.1、本机安装 vue-cli 步骤

    通过 Node 下载安装

    npm get registry 展示默认的源

    更改镜像为国内镜像 npm config set registry http://registry.npm.taobao.org/

    安装 cnpm: npm install cnpm -g

    安装 vue : cnpm install vue

    安装 vue-cli : cnpm install –global vue-cli

    一文速通 Vue 基础

    测试是否安装成功 #查看可以基于哪些模板创建 vue 应用程序,通常我们选择 webpack

    vue list

    一文速通 Vue 基础

    9.2、第一个 vue-cli 程序

    创建一个项目(在项目目录下进入 cmd 模式)

    vue init webpack myvue

    进入对应项目目录下 输入命令 npm install 安装依赖包

    运行项目 npm run dev

    Npm run build 打包压缩,会用到的命令

    一文速通 Vue 基础

    Project name:项目名称,默认回车即可

    Project description:项目描述,默认回车即可

    Author:项目作者,默认回车即可

    Install vue-router:是否安装 vue-router,选择 n 不安装(后期需要再手动添加)

    Use ESLint to lint your code: 是否使用 ESLint 做代码检查,选择 n 不安装(后期需要再手动添加)

    Set up unit tests: 单元测试相关,选择 n 不安装(后期需要再手动添加)

    Setupe2etests with Nightwatch:单元测试相关,选择 n 不安装(后期需要再手动添加)

    Should we run npm install for you after the,project has been created: 创建完成后直接初始化,选择 n,我们手动执行;运行结果

    初始化并运行

    cd myvue
    npm install
    npm run dev

    一文速通 Vue 基础

    停止使用 Ctrl+C,点击 y 确定

    将 IDEA 设置为管理员身份运行即可在 IDEA 的终端(Terminal)运行命令。(需要重启 IDEA)

    一文速通 Vue 基础

    一文速通 Vue 基础

    一文速通 Vue 基础

    10、webpack 使用

    10.1、安装配置 webpack

    安装

    # 安装
    npm install webpack -g
    npm install webpack-cli -g
    
    # 测试是否安装成功
    webpack -v
    webpack-cli -v

    一文速通 Vue 基础

    配置

    创建 webpack.config.js 配置文件

    • entry:入口文件,指定 Web Pack 用哪个文件作为项目的入口
    • output:输出,指定 WebPack 把处理完成的文件放置到指定路径
    • module:模块,用于处理各种类型的文件
    • plugins:插件,如:热更新、代码重用等
    • resolve:设置路径指向
    • watch:监听,用于设置文件改动后直接打包
    module.exports = {
    	entry:"",
    	output:{
    		path:"",
    		filename:""
    	},
    	module:{
    		loaders:[{test:/.js$/,;loade:""}
    		]
    	},
    	plugins:{},
    	resolve:{},
    	watch:true
    }

    直接运行 webpack 命令打包

    10.2、使用 webpack

    在 workspace 中创建文件夹 webpack-study,然后用 IDEA 打开

    • 创建一个名为 modules 的目录,用于放置 JS 模块等资源文件
    • 在 modules 下创建模块文件 hello.js
    // 暴露一个方法
    exports.sayHi = function () {document.write("

    狂神说 ES6

    "); };
    • 在 modules 下创建一个名为 main.js 的入口文件 main.js,用于打包时设置 entry 属性
    //require 导入一个模块,就可以调用这个模块中的方法了
    var hello = require("./hello");
    hello.sayHi();
    • 在项目目录下创建 webpack.config.js 配置文件,使用 webpack 命令打包

    一文速通 Vue 基础

    module.exports = {
       entry:"./modules/main.js",
        output:{filename:"./js/bundle.js"}
    };

    一文速通 Vue 基础

    一文速通 Vue 基础

    说明:打包如果失败,就需要使用管理员权限运行 webpack

    • 在项目目录下创建 HTML 页面,如 index.html,导入 webpack 打包后的 JS 文件
    
    
    
        
        Title
    
    
    
    
    
    

    一文速通 Vue 基础

    注:

    # 参数 --watch 用于监听变化, 如果要打包的东西有变化,就重新打包
    webpack --watch

    11、Vue:vue-router 路由

    说明:学习的时候,尽量打开官方的文档

    Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:

    • 嵌套的路由 / 视图表
    • 模块化的、基于组件的路由配置
    • 路由参数、查询、通配符
    • 基于 Vue.js 过渡系统的视图过渡效果
    • 细粒度的导航控制
    • 带有自动激活的 CSS class 的链接
    • HTML 5 历史模式或 hash 模式,在 IE9 中自动降级
    • 自定义的滚动条行为

    安装

    基于第一个 vue-cli 进行测试学习;先查看 node_modules 中是否存在 vue-router

    vue-router 是一个插件包,所以我们还是需要用 npm/cnpm 来进行安装的。代开命令行工具,进入你的项目目录,输入下面命令。

    npm install vue-router --save-dev

    测试路由

    • 删除第一个 vue-cli 项目中的没用的东西
    • components 目录下存放我们自己编写的组件
    • 定义几个自己的组件 Content.vue、Main.vue

    Content.vue

    
    
    
    
    

    Main.vue

    
    
    
    
    
    • 安装路由,在 src 目录下,新建一个文件夹:router,专门存放路由,配置路由 index.js
    import Vue from 'vue'
    import Router from 'vue-router'
    import Content from '../components/Content'
    import Main from '../components/Main'
    // 安装路由
    Vue.use(Router);
    
    // 配置导出路由
    export default new Router({
      routes:[
        {
          // 路由路径 @RequestMapping
          path:'/content',
          // 路由名称
          name:'content',
          // 跳转的组件
          component:Content
        },
        {
          // 路由路径
          path:'/main',
          name:'main',
          // 跳转的组件
          component:Main
        }
      ]
    });
    • main.js 中配置路由
    import Vue from 'vue'
    import App from './App'
    import router from './router'// 自动扫描里面的路由配置
    Vue.config.productionTip = false
    
    new Vue({
      el: '#app',
      // 配置路由
      router,
      components: {App},
      template: ''
    })
    • App.vue 中使用路由
    
    
    
    
    
    • 运行 npm run dev, 然后浏览器访问 localhost:8080
    • 运行错误分析

    一文速通 Vue 基础

    问题所在和解决

    vue-router 版本太高和 vue2 起冲突了, 虽然 router4.X 的大部分的 Vue Router API 都没有变化, 但 vue-router 3.x 只能结合 vue2 进行使用~(网上查的说法, 我翻了下 router 官方文档没找到这样的

    解决也很简单:** 卸载 4 版本的 router,@指定版本装 3.x 的 vue-router 即可,我按自己的习惯安装 3.5.2 的 vue-router 亲测可用~** 命令如下

    npm uninstall vue-router
    npm i vue-router@3.5.2

    一文速通 Vue 基础

    12、Vue + ElementUI

    Element-UI 网址:Element – The world’s most popular Vue UI framework

    12.1、创建工程

    注意:命令行都要使用管理员模式运行

    1、创建一个名为 hello-vue 的工程 vue init webpack hello-vue

    一文速通 Vue 基础

    2、安装依赖,我们需要安装 vue-router、element-ui、sass-loader 和 node-sass 四个插件

    # 进入工程目录
    cd hello-vue
    #安装 vue-routern 
    npm install vue-router --save-dev
    #安装 element-ui
    npm i element-ui -S
    #安装依赖
    npm install
    # 安装 SASS 加载器
    cnpm install sass-loader node-sass --save-dev
    #启功测试
    npm run dev

    12.2、创建登录页面

    • 先把删除没用的文件
    • 项目结构如下

    一文速通 Vue 基础

    说明:

    • assets:用于存放资源文件
    • components:用于存放 Vue 功能组件
    • views:用于存放 Vue 视图组件
    • router:用于存放 vue-router 配置
    • 在 views 目录下创建首页视图 Main.vue 组件
    
    
    
    • 在 views 目录下创建登录页面视图 Login.vue 组件
    
    
    
    
    
    • 在 router 目录下创建一个名为 index.js 的 vue-router 路由配置文件
    // 导入 vue
    import Vue from 'vue';
    import VueRouter from 'vue-router';
    // 导入组件
    import Main from "../views/Main";
    import Login from "../views/Login";
    // 使用
    Vue.use(VueRouter);
    // 导出
    export default new VueRouter({
      routes: [
        {
          // 登录页
          path: '/main',
          component: Main
        },
        // 首页
        {
          path: '/login',
          component: Login
        },
      ]
    
    })
    
    
    
    
    
    
    
    • main.js 中配置路由
    import Vue from 'vue'
    import App from './App'
    import router from "./router"
    
    import ElementUI from 'element-ui'
    import 'element-ui/lib/theme-chalk/index.css'
    
    Vue.config.productionTip = false
    
    Vue.use(router)
    Vue.use(ElementUI)
    
    /* eslint-disable no-new */
    new Vue({
      el: '#app',
      router,
      render:h=>h(App)
    })
    

    版本太高导致出错

    一文速通 Vue 基础

    一文速通 Vue 基础

    调整之后,运行 npm install 重新导入,如果还不行 cnpm install 一下

    本次运行错误

    1、首先在 IDE 中找的 package.json 文件:

    2.、然后打开该文件找到“sass-loader”,修改版本即可,这里修改成 4.0.0:

    3、在(终端)中先输入:ctrl+ c 在点 yes 终止运行

    4、在(终端)中先输入:npm install 如果未成功在输入 cnpm install

    5、仍然出错

    问题所在和解决

    :vue-router 版本太高和 vue2 起冲突了, 虽然 router4.X 的大部分的 Vue Router API 都没有变化, 但 vue-router 3.x 只能结合 vue2 进行使用~(网上查的说法, 我翻了下 router 官方文档没找到这样的

    解决也很简单:** 卸载 4 版本的 router,@指定版本装 3.x 的 vue-router 即可,我按自己的习惯安装 3.5.2 的 vue-router 亲测可用~** 命令如下

    npm uninstall vue-router
    npm i vue-router@3.5.2

    运行成功

    一文速通 Vue 基础

    13、路由嵌套

    嵌套路由又称子路由,在实际应用中,通常由多层嵌套的组件组合而成

    • 创建用户信息组件,在 views/user 目录下创建一个名为 Profile.vue 的视图组件
    
    
    
    
    • 在用户列表组件在 views/user 目录下创建一个名为 List.vue 的视图组件
    
    
    
    
    • 修改首页视图,我们修改 Main.vue 视图组件,此处使用了 ElementUI 布局容器组件
    
    
    
    
    • 添加了组件,去 router 修改配置文件
    // 导入 vue
    import Vue from 'vue';
    import VueRouter from 'vue-router';
    // 导入组件
    import Main from "../views/Main";
    import Login from "../views/Login";
    // 导入子模块
    import UserList from "../views/user/List";
    import UserProfile from "../views/user/Profile";
    
    // 使用
    Vue.use(VueRouter);
    // 导出
    export default new VueRouter({
      routes: [
        {
          // 登录页
          path: '/main',
          component: Main,
          //  写入子模块
          children: [
            {
              path: '/user/profile',
              component: UserProfile,
            }, {
              path: '/user/list',
              component: UserList,
            },
          ]
        },
        // 首页
        {
          path: '/login',
          component: Login
    
        },
      ]
    })
    
    

    一文速通 Vue 基础

    一文速通 Vue 基础

    14、参数传递和重定向

    14.1、参数传递

    方法一

    • 修改路由配置, 主要是 router 下的 index.js 中的 path 属性中增加了 :id 这样的占位符
    {
    	path: '/user/profile/:id', 
    	name:'UserProfile', 
    	component: UserProfile
    }
    
    个人信息

    说明:此时我们在 Main.vue 中的 route-link 位置处 to 改为了 :to,是为了将这一属性当成对象使用,注意 router-link 中的 name 属性名称 一定要和 路由中的 name 属性名称 匹配,因为这样 Vue 才能找到对应的路由路径

    说明:所有的元素必须在根节点下面,否则会报错

    一文速通 Vue 基础

    方法二 : 使用 props 减少耦合

    • 修改路由配置 , 主要在 router 下的 index.js 中的路由属性中增加了 props: true 属性
    {
    	path: '/user/profile/:id', 
    	name:'UserProfile', 
    	component: UserProfile, 
    	props: true
    }
    • 传递参数和之前一样
    • 在 Profile.vue 接收参数为目标组件增加 props 属性
    
    
    

    14.2、重定向

    Vue 中的重定向是作用在路径不同但组件相同的情况

    • 在 router/index.js 配置重定向路径
    {
      path: '/main',
      name: 'Main',
      component: Main
    },
    {
      path: '/goHome',
      redirect: '/main'
    }
    
        
        返回首页
    

    15、路由模式、404 和路由钩子

    15.1、路由模式

    路由模式有两种

    • hash:路径带 # 符号,如 http://localhost/#/login
    • history:路径不带 # 符号,如 http://localhost/login

    修改路由配置

    export default new Router({
      mode:'history',
      routes:[])}

    在路由的配置中修改

    15.2、404 页面

    • 在 views 目录下创建一个 NotFound.vue 视图
    
    
    
    
    • 修改路由配置 index.js
    import NotFound from '../views/NotFound'
    {
       path: '*',
       component: NotFound
    }

    一文速通 Vue 基础

    15.3、路由钩子

    除了之前的钩子函数还存在两个钩子函数

    beforeRouteEnter:在进入路由前执行
    beforeRouteLeave:在离开路由前执行

    参数说明:

    to:路由将要跳转的路径信息

    from:路径跳转前的路径信息

    next:路由的控制参数

    next() 跳入下一个页面

    next(‘/path’) 改变路由的跳转方向,使其跳到另一个路由

    next(false) 返回原来的页面

    next((vm)=>{}) 仅在 beforeRouteEnter 中可用,vm 是组件实例

    • 在钩子函数中进行异步请求

    cnpm install --save vue-axios

    注意:如果 cnpm 失败,就使用 npm 再试一次。

    import axios from 'axios'
    import VueAxios from 'vue-axios'
    Vue.use(VueAxios, axios)
    {
      "name": "cv 战士",
      "url": "https://blog.csdn.net/qq_45408390?spm=1001.2101.3001.5343",
      "page": 1,
      "isNonProfit": true,
      "address": {
        "street": "含光门",
        "city": "陕西西安",
        "country": "中国"
      },
      "links": [
        {
          "name": "bilibili",
          "url": "https://bilibili.com"
        },
        {
          "name": "cv 战士",
          "url": "https://blog.csdn.net/qq_45408390?spm=1001.2101.3001.5343"
        },
        {
          "name": "百度",
          "url": "https://www.baidu.com/"
        }
      ]
    }

    说明:只有我们的 static 目录下的文件是可以被访问到的,所以我们就把静态文件放入该目录下

    • 在 beforeRouteEnter 中进行异步请求

    一文速通 Vue 基础

    原文地址: 一文速通 Vue 基础

      正文完
       0
      Yojack
      版权声明:本篇文章由 Yojack 于2024-09-30发表,共计19263字。
      转载说明:
      1 本网站名称:优杰开发笔记
      2 本站永久网址:https://yojack.cn
      3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
      4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5 本站所有内容均可转载及分享, 但请注明出处
      6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
      7 站长邮箱:laylwenl@gmail.com
      评论(没有评论)