Vue入门


0. Vue简单说明

如下的程序


{{message}}

这个页面的元素不需要变化,以后前端数据想要修改,则不需要修改view层代码,直接改model层东西即可。

并且,以后想要更新数据,不需要刷新网页,因为通过这种虚拟Bom的机制,只要模型里面的数据变了,双绑定机制会让view的数据也自动更新。


1. IDEA开发Vue

  1. 新建空项目

  2. 下载vue插件

    setting - > plugins -> vue -> install vue.js

    下完后重启idea即可

    问题:如果重启还是无法new一个vue代码,那么可以看这里

  3. 新建html页面

    
    
    
        
        Title
    
    
    
    
    
    
    {{message}}

2. vue语法

常用属性:

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

组件化

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

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

2.1 if(v-if)




    
    Title





A

B

C


2.2 for(v-for)




    
    Title





  • {{item.message}}--{{index}}

  • 2.3 事件(v-on:xx)

    
    
    
        
        Title
    
    
    
    

    2.4 Vue双向绑定(v-model)

    Vue.js是一个MVVM框架,即数据双向绑定,数据和视图其中一个发生变化,另一个也会随之变化。

    利用v-model绑定,被绑定的东西将一起变化

    文本:

    
    
    
        
        Title
    
    
    
    
    输入的文本:{{message}}

    单选框:

    
    
    
        
        Title
    
    
    
    
    男 女

    选中了:{{message}}

    下拉框:

    
    
    
        
        Title
    
    
    
    

    选中了:{{message}}


    2.5 Vue组件(v-bind:xx、Vue.component())

    
    
    
        
        Title
    
    
    
    

    2.6 Axios异步通信

    2.6.1 Vue的生命周期

    钩子函数:程序执行的时候查到中间执行的函数;

    2.6.2 Axios

    1. 什么是Axios

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

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

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

    
    
    
        
        Title
    
    
    
    
    {{info.name}}
    Click Me

    对应的json数据:

    {
      "name": "hjq",
      "url": "https://baidu.com"
    }
    

    2.7 计算属性(computed)

    计算出来的结果保存在属性中,节约系统开销,只有当中间的数据刷新的时候才会重新计算

    
    
    
        
        Title
    
    
    
    

    currentTime1: {{currentTime1()}}

    currentTime2: {{currentTime2}}


    2.8 内容分发(slot)

    ps:v-bind:xx可以简写成:xx,v-on:click可以简写成@click

    给模板view留下插槽,以后有东西可以从这里插进去,很方便的把模板变成了别人看不懂的样子,可能是为了防止别的前端扒下模板自己用吧。

    总之,别人看不懂就对了。

    很方便,数据随时可以插进去。

    
    
    
        
        Title
    
    
    
    

    2.9 自定义事件内容分发(this.$emit)

    //index:要删除的数组元素的下标
    //num:从下标开始,要删除的个数
    //"xxx":要添加的元素的内容
    splice(index, num, "xxx", "xxx")
    

    这个东西的讲解的例子是如何在vue的组件中调用vue的方法:

    数据项在Vue的实例中,但删除操作要在组件中完成,那组件如何才可以删除Vue实例中的数据呢?

    :参数传递与事件分发

    使用this.$emit('自定义事件名', 参数)

    操作过程如下:

    
    
    
        
        Title
    
    
    
    

    ps:无论是自定义事件还是数据什么的,只要是符合MVVM模型双向绑定的东西, 你想实现双向绑定,那么你就要在前端模板中,以模板为中心,一向绑定实例,一向绑定组件,两边缺一不可。


    3. vue-cli

    3.1 安装vue-cli环境

    进入Nodejs官网,下载Windows安装包(.msi),完成后点开即可

    • cmd下输入'node -v',查看能正常打印出版本号即可
    • cmd下输入'npm -v',查看能正常打印出版本号即可

    安装Node.js淘宝镜像加速器(cnpm),这样下载会快很多

    • npm install cnpm -g

    安装vue-cli

    • cnpm install vue-cli -g

    查看可以基于哪些模板创建 vue 应用

    • vue list

    3.2 第一个vue-cli程序

    有了这玩意儿,我们可以建立一个项目,并且让项目跑起来。

    1. 创建一个空的目录

    2. 创建一个基于webpack模板的vue应用程序

      # 这里的 myvue 是项目名称,可以根据自己的需求起名
      vue init webpack myvue
      
    3. cmd进入那个目录下

    4. 输入命令

      • vue init webpack myvue

      这里说明一下:

      1. 一直显示downloading template...的,可以按任意字母键退出
      2. Project name:项目名字
      3. Project description:项目描述,可以直接回车
      4. Author:作者
      5. Vue build:可以选第一个
      6. 接下来的4个是询问要不要帮你安装工具,如果不是为了体验手动安装,可以选yes
      7. 还有一个,选npm还是yarn,这里可以选no,待会儿手动装
    5. 进入这个项目的目录里面

      • cd myvue
    6. 输入命令

      • npm install
    7. 如果提示有错误,按照提示输入命令即可修复

    8. 可以用这个命令运行

      • npm run dev
    9. Ctrl + c 可以停止运行

    idea直接打开这个项目就可以编码了,但是可能idea命令行运行不了。


    3.2 webpack

    webpack工具可以打包前端项目以及模块,打包好的模块只需要简单的引用语句就可以在别的页面中被使用。

    用babel可以给ES6+代码降级为ES5代码。

    3.2.1 安装webpack

    # 安装命令
    npm install webpack -g
    npm install webpack-cli -g
    
    # 测试命令
    webpack -v
    webpack-cli -v
    

    3.2.2 使用webpack

    1. 创建项目(新建一个空的目录,然后用idea打开)

    2. 创建一个名为modules的目录,用于放置JS模块等资源文件(在项目下新建一个Directory叫modules)

    3. 在modules下创建模块文件,如hello.js,用于编写JS模块相关代码

      //暴露一个方法:sayHi
      exports.sayHi = function() {
          document.write("
      Hello Webpack
      ") }
    4. 在modules下创建一个名为main.js的入口文件,用于打包时设置entry属性

      //require导入一个模块,就可以调用这个模块中的方法了
      var hello = require("./hello");
      hello.sayHi();
      
    5. 在项目目录下创建webpack.config.js配置文件,使用webpack命令打包

      module.exports = {
          entry: "./modules/main.js",
          output: {
              filename: "./js/bundle.js"
          }
      };
      
    6. 在项目目录下创建HTML页面,如 index.html ,导入webpack打包后的JS文件

      
      
      
          
          Title
      
      
      
      
      
      
      
      
    7. 在IDEA控制台中直接执行webpack,如果失败,使用管理员权限运行即可

    8. 运行html看效果

    说明:

    # 参数 --watch 用于监听变化
    webpack --watch
    # 执行这个命令webpack将会一直更新,类似热部署
    

    3.3 vue-router路由

    多个页面之间的跳转跳转,这是前端的跳转,不需要后端参与。

    其中,main.js作为整个项目的入口,这个入口绑定了组件App.vue,也就是说main.js会实现App.vue以及其里面包含的所有组件。

    App.vue是一个组件,这个组件里面可以包含很多小组件,这些个组件我们自己自由编写。

    然后在index.js这个路由下表明路由的路径和跳转的组件,类比后端来说,就像是把路径名和跳转的界面绑了起来

    3.3.1 安装

    进入项目目录,输入命令:

    • npm install vue-router --save-dev

    如果在一个模块化工程中使用它,必须要通过Vue.use()明确的安装路由功能:

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    
    Vue.use(VueRouter);
    

    3.3.2 实例测试

    1. 先删除没有用的东西

    2. components目录下放我们自己写的组件

    3. components目录下定义一个Content.vue的组件

      
      
      
      

      一个main.vue的组件(理论上,vue组件的命名都是大写开头,本来应该是Main.vue的,但是这里测试完毕了,就不改了)

      
      
      
      
      
      
      
    4. 安装路由,在src目录下,新建一个文件夹:router,专门存放路由,router新建index.js(配置路由的文件)

      import Vue from 'vue'
      import VueRouter from "vue-router";
      
      import Content from "../components/Content";
      import main from "../components/main";
      
      //安装路由
      Vue.use(VueRouter);
      
      //配置导出路由
      export default new VueRouter({
        routes: [
          {
            //路由路径
            path: '/content',
            name: 'Content',
            //跳转的组件
            component: Content
          },
          {
            //路由路径
            path: '/main',
            name: 'main',
            //跳转的组件
            component: main
          }
        ]
      })
      
      
    5. 在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: ''
      })
      
    6. 在App.vue中使用路由

      
      
      
      
      
      

    3.4 vue + elementUI

    1. 创建一个名为hello-vue的工程(在准备放置项目的目录下进入管理员cmd)

      • vue init webpack hello-vue
    2. 安装依赖

      # 进入工程目录
      cd hello-vue
      # 安装 vue-router
      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
      
    3. npm命令解释

      • npm install moduleName:安装模块到项目目录下
      • npm install -g moduleName:-g的意思是将模块安装到全局,具体安装到磁盘哪个位置,要看npm config prefix 的位置
      • npm install -save moduleName: --save 的意思是将模块安装到项目目录下,并在 package 文件的 dependencies 节点写入依赖, -S 为该命令的缩写
      • npm install --save-dev moduleName:--save-dev 的意思是将模块安装到项目目录下,并在package 文件的 devDependencies 结点写入依赖, -D 为该命令的缩写
    4. 创建登录页面

      把没有用的初始化东西删掉

      src源码目录下如下结构

      • assets:用于存放资源文件
      • components:用于存放Vue 功能组件
      • views:用于存放 Vue 视图组件
      • router:用于存放 vue-router 配置

      创建首页视图,在 views 目录下创建一个名为 Main.vue 的视图组件;

      
      
      
      
      
      

      创建登录页视图在 views 目录下创建一个名为 Login.vue 的视图组件,其中 el-* 的元素为 ElementUI 的组件;

      
      
      
      
      
      

      创建路由,在 router 目录下创建一个名为 index.js 的 vue-router 路由配置文件

      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.use(router);
      Vue.use(ElementUI);
      
      new Vue({
        el: '#app',
        router,
        render: h => h(App) //ElementUI
      })
      

      App.vue代码如下

      
      
      
      

      运行有bug,关掉项目,打开 static 下的 package.json ,改sass 版本sa

      "sass-loader":"^8.0.0",
      改为
      "sass-loader":"^7.3.1",
      

      然后命令行中重新运行' cnpm install '


    3.5 路由嵌套

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

    Demo:

    1. views下新建目录 user

    2. user 下建立 List.vue 和 Profile.vue

      Profile.vue

      
      
      
      
      

      List.vue

      
      
      
      
      
      
    3. 修改首页视图,我们修改 Main.vue 视图组件,此处使用了 ElementUI 布局容器组件,代码如下:

      Main.vue

      
      
      
      
      
    4. index.js 修改

      //导入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
      
          },
        ]
      })
      
      
      
      

    运行;


    3.6 参数传递及重定向

    vue官方文档

    这里演示如果请求带有参数该怎么传递

    demo (用的还是上述例子的代码 修改一些代码 这里不放重复的代码了 ):

    第一种取值方式

    1. 修改路由配置, 主要是router下的index.js中的 path 属性中增加了 :id 这样的占位符
    {
    	path: '/user/profile/:id', 
    	name:'UserProfile', 
    	component: UserProfile
    }
    
    1. 传递参数

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

      
      个人信息
      
    2. 在要展示的组件Profile.vue中接收参数 使用 {{$route.params.id}}来接收

      Profile.vue 部分代码

      
      
      
      

    第二种取值方式 使用props 减少耦合

    1、修改路由配置 , 主要在router下的index.js中的路由属性中增加了 props: true 属性

    {
    	path: '/user/profile/:id', 
    	name:'UserProfile', 
    	component: UserProfile, 
    	props: true
    }
    
    

    2、传递参数和之前一样 在Main.vue中修改route-link地址

    
    个人信息
    
    

    3、在Profile.vue接收参数为目标组件增加 props 属性

    Profile.vue

    
    
    
    
    

    组件重定向

    重定向的意思大家都明白,但 Vue 中的重定向是作用在路径不同但组件相同的情况下,比如: 在router下面index.js的配置

    {
      path: '/main',
      name: 'Main',
      component: Main
    },
    {
      path: '/goHome',
      redirect: '/main'
    }
    
    

    说明:这里定义了两个路径,一个是 /main ,一个是 /goHome,其中 /goHome 重定向到了 /main 路径,由此可以看出重定向不需要定义组件;

    使用的话,只需要在Main.vue设置对应路径即可;

    
        回到首页
    
    
    

    3.7 404和路由钩子

    vue官方文档

    路由模式有两种

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

    修改路由配置,代码如下:

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

    404 demo

    1.创建一个NotFound.vue视图组件

    NotFound.vue

    
    
    
    
    

    2.修改路由配置index.js

    import NotFound from '../views/NotFound'
    {
       path: '*',
       component: NotFound
    }
    
    

    路由钩子与异步请求

    路由钩子你可以当作后端的aop来用。

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

    在Profile.vue中写

      export default {
        name: "UserProfile",
        beforeRouteEnter: (to, from, next) => {
          console.log("准备进入个人信息页");
          next();
        },
        beforeRouteLeave: (to, from, next) => {
          console.log("准备离开个人信息页");
          next();
        }
      }
    
    

    参数说明:
    to:路由将要跳转的路径信息
    from:路径跳转前的路径信息
    next:路由的控制参数
    next() 跳入下一个页面
    next(’/path’) 改变路由的跳转方向,使其跳到另一个路由
    next(false) 返回原来的页面
    next((vm)=>{}) 仅在 beforeRouteEnter 中可用,vm 是组件实例


    在钩子函数中使用异步请求

    1、安装 Axios

    cnpm install --save vue-axios
    

    2、main.js引用 Axios

    import axios from 'axios'
    import VueAxios from 'vue-axios'
    Vue.use(VueAxios, axios)
    

    3、准备数据 : 只有我们的 static 目录下的文件是可以被访问到的,所以我们就把静态文件放入该目录下。

    数据和之前用的json数据一样 需要的去上述axios例子里

    // 静态数据存放的位置
    static/mock/data.json
    

    4.在 beforeRouteEnter 中进行异步请求

    Profile.vue

      export default {
        //第二种取值方式
        // props:['id'],
        name: "UserProfile",
        //钩子函数 过滤器
        beforeRouteEnter: (to, from, next) => {
          //加载数据
          console.log("进入路由之前")
          next(vm => {
            //进入路由之前执行getData方法
            vm.getData()
          });
        },
        beforeRouteLeave: (to, from, next) => {
          console.log("离开路由之前")
          next();
        },
        //axios
        methods: {
          getData: function () {
            this.axios({
              method: 'get',
              url: 'http://localhost:8080/static/mock/data.json'
            }).then(function (response) {
              console.log(response)
            })
          }
        }
      }