VUE入门

第一个VUE程序

使用!tab创建标准html模板,嵌入vue实例化

<!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

插入模板语法

<div id="app">
  {{ message }}
</div>


var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})

vue3 h函数生成element plus图标标签 vue创建标签_HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>test</title>
</head>
<body>
    {{ message }}

    <h2 id="app" class = "app">
        {{ message }}
        <span> {{message}} </span>>
    </h2>
    <!-- 开发环境版本,包含了有帮助的命令行警告 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        var app = new Vue({
            el:"#app",
           //el:".app",
           
           //el:"div",
            data:{
                message:"VUE hell"
            }



        })

    </script>
</body>
</html>

el:挂载点

Vue实例作用范围

Vue会管理el选项命中的元素及内部的后代元素

可以使用其他的选择器

如ID、DIV等,建议使用id

双标签

可以使用其他的双标签,不能使用HTML和BODY双标签


data:数据对象

  • Vue中用到的数据定义在data中
  • data中可以写复杂类型的数据
  • 渲染复杂类型的数据时,遵守js的语法

本地应用

使用vue实现简单的网页

Vue指令

1、内容绑定,事件绑定

v-text

<body>

    <div id = "app">
        <h2 v-text="message+'!'"></h2>
        <h2 v-text="info"></h2>
        
        <h2>学院路{{message}}</h2>




        {{message}}
            <div>   {{ school.name}} {{school.mobile}} </div>
    
            <ul>
                <li> {{campus[0]}} </li>
                <li> {{campus[1]}} </li>

            </ul>
    
        </div>
  • 设置标签内容--content
  • 插值表达式替换内容
  • 可以写表达式

v-html

设置innerHTML

  • 设置元素的innerHTML
  • 内容中有html结构的会被解析为标签
  • v-text指令只会解析为文本
data:{
            content : "<a href='https://www.bilibili.com/'>link </a>"

               }

vue3 h函数生成element plus图标标签 vue创建标签_Vue_02

v-on

  • v-on指令的作用:为元素绑定事件
  • 事件名不需要写on
  • 指令可以写为@
  • 绑定的方法定义在methods中
<input type="button" value = "v-on指令" v-on:click = "makenoise">
<input type="button" value = "v-on简写" @click = "makenoise">
<input type="button" value = "双击"     @dblclick = "makenoise">

vue3 h函数生成element plus图标标签 vue创建标签_Vue_03

实现网页计数器

  • 创建Vue实例时:el(挂载点),data(数据),methods(方法)
  • v-on
  • this 获取数据

2、显示切换,属性绑定

v-show


  • v-show指令作用:根据真假切换元素的显示状态
  • 原理是修改元素的display,实现隐藏
  • 指令后面内容解析为布尔值
  • 值为true显示,值为false隐藏

v-if

基本和v-show相同

  • V-if指令:更具表达式真假切换元素的显示状态
  • 操纵dom元素切换显示状态
  • 表达式值为true,元素存在于dom树中,为false,从dom树中移除
  • 频繁切换v-show否则v-if,前者消耗小

v-bind

vue3 h函数生成element plus图标标签 vue创建标签_数据_04

为元素绑定属性

  • 完整写法v-bind:属性名
  • 简写省略v-bind,只保留:属性名

3、列表循环,表单元素绑定

v-for

  • v-for:根据数据生成列表结构
  • 数组经常和v-for一起使用
  • 语法是(item,index)in数据
  • item和index可以结合其他指令一起使用
  • 数组长度的更新会同步到页面上,是响应式的

v-on-补充

vue3 h函数生成element plus图标标签 vue创建标签_HTML_05

<body>
    <div id ="app">
        <input type ="button" value="点击"  @click="doit(233,'bili')">  
        <input type="text" @keyup.enter="sayhi" >
    </div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
    el:"#app",

    methods:{
        doit:function(p1,p2){
            console.log("test");
            console.log(p1);
            console.log(p2 );
        },
        sayhi:function(){
                alert ("success");
            },   
    }
})
</script>
</body>
</html>
  • 事件绑定,函数调用传形参
  • 定义方法时定义形参接收实参
  • 事件后跟.修饰符 可以进行限制
  • .enter可以限制触发 的按键 为回车键
  • 事件修饰符有多种。

v-module

双向数据绑定

vue3 h函数生成element plus图标标签 vue创建标签_数据_06

<body>
    <div id ="app"> 
        <input type = "button" value = "修改message" @click="setM">
        <input type ="text" v-model="message" @keyup.enter="getM">
        <h2>{{message}}</h2>
    </div>
<!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
 var app = new Vue({
    el:"#app",
    data:{
        message :"test"
    },
    methods:{
        getM:function(){
            alert(this.message)
        },
        setM:function(){
            this.message="函数";
                }
    },
 })
</script>
</body>
</html>
  • v-module指令:便捷 的设置和获取表单元素的值
  • 绑定的数据会和表单元素的值相关联
  • 绑定的数据和表单元素值一一对应

前后端分离

经典的JSP+Servlet+JavaBean的MVC时代

半分离

SSM(Spring + SpringMVC + Mybatis)和SSH(Spring + Struts + Hibernate)的Java 框架时代

步骤如下:
(1)浏览器请求,CDN返回HTML页面;
(2)HTML中的JS代码以Ajax方式请求后台的Restful接口;
(3)接口返回Json数据,页面解析Json数据,通过Dom操作渲染页面;

后端提供的都是以JSON为数据格式的API接口供Native端使用,同样提供给WEB的也是JSON格式的API接口。

那么意味着WEB工作流程是:
1、打开web,加载基本资源,如CSS,JS等;
2、发起一个Ajax请求再到服务端请求数据,同时展示loading;
3、得到json格式的数据后再根据逻辑选择模板渲染出DOM字符串;
4、将DOM字符串插入页面中web view渲染出DOM结构;

这些步骤都由用户所使用的设备中逐步执行,也就是说用户的设备性能与APP的运行速度联系的更紧换句话说就是如果用户的设备很低端,那么APP打开页面的速度会越慢。

为什么说是半分离的?因为不是所有页面都是单页面应用,在多页面应用的情况下,前端因为没有掌握controller层,前端需要跟后端讨论,我们这个页面是要同步输出呢,还是异步Json渲染呢?而且,即使在这一时期,通常也是一个工程师搞定前后端所有工作。因此,在这一阶段,只能算半分离。

首先,这种方式的优点是很明显的。前端不会嵌入任何后台代码,前端专注于HTML、CSS、JS的开发,不依赖于后端。自己还能够模拟Json数据来渲染页面。发现Bug,也能迅速定位出是谁的问题。

然而,在这种架构下,还是存在明显的弊端的。最明显的有如下几点:
1)JS存在大量冗余,在业务复杂的情况下,页面的渲染部分的代码,非常复杂;
2)在Json返回的数据量比较大的情况下,渲染的十分缓慢,会出现页面卡顿的情况;
3)SEO( Search Engine Optimization,即搜索引擎优化)非常不方便,由于搜索引擎的爬虫无法爬下JS异步渲染的数据,导致这样的页面,SEO会存在一定的问题;
4)资源消耗严重,在业务复杂的情况下,一个页面可能要发起多次HTTP请求才能将页面渲染完毕。可能有人不服,觉得PC端建立多次HTTP请求也没啥。那你考虑过移动端么,知道移动端建立一次HTTP请求需要消耗多少资源么?

正是因为如上缺点,我们才亟需真正的前后端分离架构。

前端框架(KnockoutJS、AngularJS、vueJS、ReactJS)为主的MV*时代

大家一致认同的前后端分离的例子就是SPA(Single-page application),所有用到的展现数据都是后端通过异步接口(AJAX/JSONP)的方式提供的,前端只管展现。从某种意义上来说,SPA确实做到了前后端分离,但这种方式存在两个问题:

  • WEB服务中,SPA类占的比例很少。很多场景下还有同步/同步+异步混合的模式,SPA不能作为一种通用的解决方案;
  • 现阶段的SPA开发模式,接口通常是按照展现逻辑来提供的,而且为了提高效率我们也需要后端帮我们处理一些展现逻辑,这就意味着后端还是涉足了view层的工作,不是真正的前后端分离。
    SPA式的前后端分离,从物理层做区分(认为只要是客户端的就是前端,服务器端就是后端)这种分法已经无法满足前后端分离的需求,我们认为从职责上划分才能满足目前的使用场景:
  • 前端负责view和controller层
  • 后端只负责model层,业务处理与数据持久化等
    controller层与view层对于目前的后端开发来说,只是很边缘的一层,目前的java更适合做持久层、model层的业务。
    在前后端彻底分离这一时期,前端的范围被扩展,controller层也被认为属于前端的一部分。在这一时期:
    前端:负责View和Controller层。
    后端:只负责Model层,业务/数据处理等。
    可是服务端人员对前端HTML结构不熟悉,前端也不懂后台代码呀,controller层如何实现呢?这就是node.js的妙用了,node.js适合运用在高并发、I/O密集、少量业务逻辑的场景。最重要的一点是,前端不用再学一门其他的语言了,对前端来说,上手度大大提高。

可以就把Nodejs当成跟前端交互的api。总得来说,NodeJs的作用在MVC中相当于C(控制器)。Nodejs路由的实现逻辑是把前端静态页面代码当成字符串发送到客户端(例如浏览器),简单理解可以理解为路由是提供给客户端的一组api接口,只不过返回的数据是页面代码的字符串而已。

用NodeJs来作为桥梁架接服务器端API输出的JSON。后端出于性能和别的原因,提供的接口所返回的数据格式也许不太适合前端直接使用,前端所需的排序功能、筛选功能,以及到了视图层的页面展现,也许都需要对接口所提供的数据进行二次处理。这些处理虽可以放在前端来进行,但也许数据量一大便会浪费浏览器性能。因而现今,增加Node中间层便是一种良好的解决方案。

vue3 h函数生成element plus图标标签 vue创建标签_Vue_07

浏览器(webview)不再直接请求JSP的API,而是:
1)浏览器请求服务器端的NodeJS;
2)NodeJS再发起HTTP去请求JSP;
3)JSP依然原样API输出JSON给NodeJS;
4)NodeJS收到JSON后再渲染出HTML页面;
5)NodeJS直接将HTML页面flush到浏览器;

这样,浏览器得到的就是普通的HTML页面,而不用再发Ajax去请求服务器了。

Nodejs引领的全栈时代


Apache Tomcat

Ajax