[TOC]

1、Vue 快速入门

1.1、Vue的介绍

https://cn.vuejs.org/v2/guide/ (尤雨溪)

  • Vue是一套构建用户界面的渐进式前端框架。

    “渐进式框架”简单的来说, 就是用你想用或者能用的功能特性,你不想用的部分功能可以先不用。Vue不强求你一次性接受并使用它的全部功能特性。

  • 只关注视图层,并且非常容易学习,还可以很方便的与其它库或已有项目整合。

    MVC:

    model,  模型层
    
    view,  视图层
    
    controller 控制层
    
  • 通过尽可能简单的API来实现响应数据的绑定和组合的视图组件。
  • 特点
    易用:在有HTML,CSS, JavaScript的基础上,快速上手。
    灵活:简单小巧的核心,渐进式技术栈,足以应付任何规模的应用。
    性能:20kbmin+gzip运行大小、超快虚拟DOM、最省心的优化。

1.2、Vue的快速入门

  • 开发步骤
  1. 下载和引入vue.js文件。

    https://cn.vuejs.org/

  1. 编写入门程序。
    视图:负责页面渲染,主要由HTML+CSS构成。
    脚本:负责业务数据模型(Model)以及数据的处理逻辑。
  • 代码实现
    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>Title</title>
    </head>
    <body>
     <!-- 视图部分 : html + css -->
     <div id="myDiv">
         {{msg}}
     </div>
    </body>
    <!--
     TODO Vue入门
     1. 下载并引入vue.js
     2. 编写vue代码
         1). 视图 : 展示数据
         2). 脚本 : 编写逻辑
    -->
    <script src="js/vue.js"></script>
    <!--脚本部分 : js -->
    <script>
     /*
     * 1. vue的核心对象
     *       1). new Vue(参数)
     *       2). Vue首字母是大写的
     *       3). 参数: 是一个js对象
     *           {name : value,name : value}
     * 2. 参数解释
     *   1). 参数是一个js对象
     *   2). 参数的常用属性
     *       I. el : 全程element元素 ,值写的是字符串(选择器)
     *            表示Vue的作用范围,在此范围内可以vue的内容
     *       II. data : 数据,值写的是json对象
     * 3.  插值表达式
     *    1). 使用范围: 用在视图中
     *    2).语法:  {{变量}}
     *           表示从data中获取数据
     *
     * */
     new Vue({
         el : "#myDiv",
         data : {
             msg : "hello vue",
             msg2 : "hello vue2 瘪三"
         }
     })
    </script>
    </html>
    

1.3、Vue快速入门详解

  • Vue 核心对象:每一个 Vue 程序都是从一个 Vue 核心对象开始的。

    let vm = new Vue({ 选项列表; });

  • 选项列表 ```latex
  1. el选项:指定的vue控制区域。(根据选择器获取)
  2. data选项:用于保存当前Vue对象中的数据。在视图中声明的变量需要在此处赋值。
  3. methods选项:用于定义方法。方法可以直接通过对象名调用,或者用this来调用(代表当前Vue对象)。 ```
  • 数据绑定
    在视图部分获取脚本部分的数据: (插值表达式)
     {{变量名}}
    

1.4、Vue快速入门的升级

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>快速入门升级</title>
</head>
<body>
    <!-- 视图 -->
    <div id="div">
        <div>姓名:{{name}}</div>
        <div>班级:{{classRoom}}</div>
        <button onclick="hi()">打招呼</button>
        <button onclick="update()">修改班级</button>
    </div>
</body>
<script src="js/vue.js"></script>
<script>
  // 脚本
  /*
  *  TODO Vue对象的参数
  *     1. 参数是js对象
  *     2. 常用属性
  *         1). el : element指定的是vue作用范围
  *         2). data : 指定的vue的数据,属性
  *         3). methods : 指定的vue的函数
  *
  *     vue的特点: 视图引用脚本中的数据
  *              那么如果脚本中的数据改变,视图也会随之修改!
  *             (动态绑定)
  * */
  let vm = new Vue({
      el : "#div",
      data : {
         name : "张三",
         classRoom : "黑马142期"
      },
      methods : {
          method01 : function (){
              //methods中的函数可以通过this访问data中的数据
              console.log(this.name + ": method01");
          },
          method02 : function (){
              this.classRoom = "白马142"
          }
      }
  })

/*  let vm = {
      name : "张三",
      classRoom : "142期",
      method01 : function (){
          console.log("method01");
          console.log(this.name);
      },
      method02 : function (){
          console.log("method02");
      }
  }*/

  function hi(){
      // console.log("hi");
      console.log(vm.name);
      console.log(vm.classRoom);
      vm.method01()
      vm.method02()
  }
  function update(){
      vm.method02();
  }

</script>
</html>

1.5、Vue小结

  • Vue是一套构建用户界面的渐进式前端框架。
  • Vue的程序包含视图和脚本两个核心部分。
  • 脚本部分
    • Vue核心对象。
    • 选项列表
      • el:接收获取的元素。
      • data:保存数据。
      • methods:定义方法。
  • 视图部分
    • 数据绑定:{{变量名}}

2、Vue 常用指令

2.1、指令介绍

  • 指令:是带有 v- 前缀的特殊属性,不同指令具有不同含义。例如 v-html,v-if,v-for。
  • 使用指令时,通常编写在标签的属性上,值可以使用 JS 的表达式。
  • 常用指令

常用指令-指令介绍.png

2.2、文本插值

  • v-html:把文本解析为 HTML 代码。
    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>文本插值</title>
    </head>
    <body>
         <!--
             插值表达式
             1. 文本插值指令
                 1). v-text : innerText (不识别标签)
                 2). v-html : innerHTML (识别标签)
         -->
     <div id="div">
         <div>{{msg}}</div>
         <div v-text="msg"></div>
         <div v-html="msg"></div>
     </div>
     <div id="myDiv"></div>
    </body>
    <script src="js/vue.js"></script>
    <script>
     new Vue({
         el:"#div",
         data:{
             msg:"<h1>Hello Vue</h1>"
         }
     });
    </script>
    <script>
     let myDiv = document.getElementById("myDiv");
     myDiv.innerText = "<h1>hello</h1>"
    </script>
    </html>
    

2.3、绑定属性

  • v-bind:为 HTML 标签绑定属性值。 ```html <!DOCTYPE html>

百度一下
百度一下{{url}}

    <br>
    <!--
        v-bind:为 HTML 标签绑定属性值
            1). v-bind:属性名 = "data中的属性"  -> 引用data中指定的属性
            2). v-bind可以省略
    -->
    <a v-bind:href="url">百度一下</a>
    <br>
    <!--
        v-bind 可以省略不写
    -->
    <a :href="url">百度一下</a>
    <br>
    <!--
        也可以绑定其他属性
    -->
    <div :class="cls">我是div</div>
</div>

``` ## 2.4、条件渲染 - v-if:条件性的渲染某元素,判定为真时渲染,否则不渲染。 - v-else-if:条件性的渲染。 - v-else:条件性的渲染。 - v-show:根据条件展示某元素,区别在于切换的是display属性的值。 ```html
div1
div2
div3
性别:
div4
``` ## 2.5、列表渲染 - v-for:列表渲染,遍历容器的元素或者对象的属性。 ```html
  • {{element}}
  • {{e}}
  • {{index}},{{element}}
  • {{index}},{{element}}
``` ## 2.6、事件绑定 - v-on:为 HTML 标签绑定事件。 ```html
{{name}}
``` ## 2.7、表单绑定 - **表单绑定**
v-model:在表单元素上创建双向数据绑定。 - **双向数据绑定**
更新data数据,页面中的数据也会更新。(默认单向 : 模型改变,视图也会改变)
更新页面数据,data数据也会更新。(视图改变,也会影响模型改变) - **MVVM模型(Model,View,ViewModel):是MVC模式的改进版**
在前端页面中,JS对象表示Model,页面表示View,两者做到了最大限度的分离。
将Model和View关联起来的就是ViewModel,它是桥梁。
ViewModel负责把Model的数据同步到View显示出来,还负责把View修改的数据同步回Model。
![MVVM模型.png](https://cdn.nlark.com/yuque/0/2022/png/26811008/1650019457417-edea1fab-75e3-4e92-9150-e1d352a61a3e.png#clientId=u8dff2f94-4bb5-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=uc7a92eed&name=MVVM%E6%A8%A1%E5%9E%8B.png&originHeight=135&originWidth=589&originalType=binary&ratio=1&rotation=0&showTitle=false&size=10457&status=done&style=none&taskId=ue161d3a7-62b2-4f2f-acca-6c375aa8a32&title=) ```html
姓名1:
姓名_单向绑定2:
姓名_双向绑定:
年龄: 性别:

``` ## 2.8、小结 - **指令:是带有v-前缀的特殊属性,不同指令具有不同含义。** - **文本插值**
v-html:把文本解析为HTML代码。 - **绑定属性**
v-bind:为HTML标签绑定属性值。 > 完整 v-bind:属性名="data变量" > > 省略 :属性名="data变量" - **条件渲染**
v-if:条件性的渲染某元素,判定为真时渲染,否则不渲染。
v-else:条件性的渲染。
v-else-if:条件性的渲染。
v-show:根据条件展示某元素,区别在于切换的是display属性的值。 - **列表渲染**
v-for:列表渲染,遍历容器的元素或者对象的属性。 - **事件绑定**
v-on:为HTML标签绑定事件。 > 完整 v-on:事件名="methods中的函数名" > > 省略 @事件名="methods中的函数名" - **表单绑定**
v-model:在表单元素上创建双向数据绑定。 # 3、Vue的生命周期 ## **3.1 生命周期** ![Vue生命周期.png](https://cdn.nlark.com/yuque/0/2022/png/26811008/1650019468200-38ed9a4d-9c91-478e-91d3-0f54c35a7e58.png#clientId=u8dff2f94-4bb5-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u45641a2f&name=Vue%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.png&originHeight=609&originWidth=1005&originalType=binary&ratio=1&rotation=0&showTitle=false&size=187056&status=done&style=none&taskId=uf74a0637-f313-46ce-96f1-51954775d80&title=) ## **3.2 生命周期的八个阶段** ![生命周期的八个阶段.png](https://cdn.nlark.com/yuque/0/2022/png/26811008/1650019472563-c3a3ca5f-b653-4bbb-9fd3-146eea112383.png#clientId=u8dff2f94-4bb5-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=u4ebcdc7a&name=%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E7%9A%84%E5%85%AB%E4%B8%AA%E9%98%B6%E6%AE%B5.png&originHeight=349&originWidth=633&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29917&status=done&style=none&taskId=ua4eefa28-7bd5-41f8-8d0f-eeedbdd8765&title=) ## 3.3 运用举例 ```markdown # 了解生命周期,掌握常用的 created方法! 1. 此方法是 data初始化完成(模型), 视图加载模型的数据之前执行的方法 2. 通常在此方法中,我们会发起后台数据请求,在页面加载数据之前,先获取后台数据,进行模型的数据进行赋值,最后视图会将这些数据进行挂载,渲染出来! ``` ```html
{{message}}
{{user.name}}

``` # 4. Vue异步操作 ## 4.1 axios介绍 - **在Vue中发送异步请求,本质上还是AJAX。我们可以使用axios这个插件来简化操作!** - **使用步骤**
1.引入axios核心js文件。
2.调用axios对象的方法来发起异步请求。
3.调用axios对象的方法来处理响应的数据。 - **axios常用方法**
![axios常用方法.png](https://cdn.nlark.com/yuque/0/2022/png/26811008/1650019484056-dc62d969-403c-49d1-95e7-3ecf0869aa55.png#clientId=u8dff2f94-4bb5-4&crop=0&crop=0&crop=1&crop=1&from=drop&id=ud505d96a&name=axios%E5%B8%B8%E7%94%A8%E6%96%B9%E6%B3%95.png&originHeight=211&originWidth=672&originalType=binary&ratio=1&rotation=0&showTitle=false&size=43221&status=done&style=none&taskId=ud3e6509b-5030-4979-a088-70edd7eba5d&title=) - **代码实现** - **html代码** ```html
{{user.name}}
``` - **java代码** ```java ppackage com.itheima01.vue; import com.alibaba.fastjson.JSON; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; @WebServlet("/MyServlet") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletInputStream is = request.getInputStream(); User user = JSON.parseObject(is, User.class); System.out.println(user); response.setContentType("text/html;charset=utf-8"); response.getWriter().print("你好,世界"); } } ``` User.java ```java package com.itheima01.vue; public class User { private String name; private Integer age; @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } ``` ## 4.2 案例练习 (重点) ```html 案例: 当页面加载好之后,从服务器上请求联系人数据,显示到网页上

登录页面

  <input type="text" name="username" placeholder="请输入用户名"
         v-model="user.username"> <br>
  <input type="password" name="password" placeholder="请输入密码"
         v-model="user.password"><br>
  <button @click="send()">登录</button>

  <h1>主页: 显示好友列表</h1>
  <ul>
      <li v-for="friend of list">
          {{friend.name}},{{friend.age}}
      </li>
  </ul>


```java
package com.itheima02.vue;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;

@WebServlet("/MyServlet2")
public class MyServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        try {
            //1. 接收请求
            User2 user2 = BaseController.getBean(request, User2.class);
            System.out.println(user2);
            //2. 业务处理
            //数据库查询好友数据
            ArrayList<Friend> friends = new ArrayList<>();
            friends.add(new Friend("张三",18));
            friends.add(new Friend("李四",19));
            friends.add(new Friend("王五",20));
            //3. 响应
//        response.getWriter().print("hello");
            Result result = new Result(true, "成功", friends);
            BaseController.printResult(response,result);
        } catch (Exception e) {
            Result result = new Result(false, "失败", null);
            BaseController.printResult(response,result);
        }
    }
}
package com.itheima02.vue;

public class Friend {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Friend() {
    }

    public Friend(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Friend{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}
package com.itheima02.vue;

public class User2 {
    private String username;
    private String password;

    @Override
    public String toString() {
        return "User2{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
package com.itheima02.vue;
//数据封装
public class Result {
    //表示状态: true表示成功
    private boolean flag;
    // 提示信息
    private String msg;
    // 数据
    private Object data;

    public Result() {
    }

    public Result(boolean flag, String msg, Object data) {
        this.flag = flag;
        this.msg = msg;
        this.data = data;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}
package com.itheima02.vue;

import com.alibaba.fastjson.JSON;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//TODO: springmvc 有个controller,接收请求和响应数据都封装了
//将获取请求和响应进行封装
public class BaseController {
    //第一个方法的作用: 将请求体中的数据转换成指定类型的对象
     //泛型方法
    public static <T>T getBean(HttpServletRequest request,Class<T> clazz) throws IOException {
        ServletInputStream is = request.getInputStream();
        //将输入流中的json格式字符串转换成user对象
        T o = JSON.parseObject(is, clazz);
        return o;
    }
    //第二个方法的作用: 将result对象转成json格式字符串并响应
    public static void printResult(HttpServletResponse response, Result result) throws IOException {
        String json = JSON.toJSONString(result);
        // 解决响应体中文乱码问题
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().print(json);
    }


}
<dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
    </dependencies>

符录: 设置 (了解)

1. Vue相关api的自动提示

添加快捷提示:

@tap,@tap.stop,@tap.prevent,@tap.once,@click,@click.stop,@click.prevent,@click.once,@change,@change.lazy,@change.number,@change.trim,v-model,v-for,v-text,v-html,v-if,v-else-if,v-else,v-pre,v-once,v-bind,scoped

第一步

vue自动提示1.png

一般第一步设置好了,就可以了, 如果还不行,就如下设置

vue自动提示2.png

为了提示功能更加强大,还可添加vue插件(需要联网, 安装后需要重启)

1600710157816.png

2. Chrome浏览器Vue插件的安装

打开chrome浏览器;输入:chrome://extensions/

点击“加载已解压的扩展程序”(如果看不到,点击右上角开发者模式)
然后将“资料/chrome vue插件/chrome”文件夹选中即可

1609138576276.png