1.JavaScript与基于前端的Web开发

JavaScript

1.Js的介绍

  • JavaScript(简称js)是一门跨平台,面向对象的脚本语言,是用来控制网页的行为的,他能使网页可以交互

  • 脚本语言:就是不需要通过编译,浏览器可以直接读取的语言

2. Js的引入

  • 内部脚本:

    • JavaScript代码必须放在标签之间
    • 在HTML文档中,可以在任意位置,放在任意数量

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 内部脚本 -->
    <script>
        alert("hello,world");
    </script>
    <!-- 外部脚本 -->
    <script src="./js的文件夹/1.demo.js"></script>
</body>
</html>

3. js的基础语法

3.1 书写语法

  • 区分大小写:与java一样,变量名,函数名以及其他一切东西都是区分大小写的
  • 每行的结尾的分号可有可无
  • 注释:
    • 单行注释://
    • 多行注释:/* */
  • 大括号表示代码块
  • 输出语句:
    1. 使用window.alert(),写入警告框(window可有省略)
    2. 使用document.write(),写人HTML输出
    3. 使用console.log(),写入用浏览器的控制台
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //弹出警告框
       alert("Hello,world");
        //输入html页面
       document.write("hello,world");
        //控制台输出
       console.log("hello,world");
    </script>
</body>
</html>

3.2 变量

  • Js中可有使用var关键字来声明变量
  • Js是一门弱语言,变量可以存放不同类型的值
  • 变量的命名的规则:
    • 组成字符可以是任何字母,数字,下划线,美元符号
    • 数字不能开头
    • 建议使用驼峰原则
var a=3;
a="张三"
  • var 变量的特点:
    1. var声明的变量作用域比较大,是全局变量
    2. var声明的变量名是可以重复定义的,后面定义的变量会把前者给替换掉
  • let关键字也可以用来声明变量,只不过其作用域在代码块内有效,并且不能重复声明
  • const关键字,用来声明一个只读常量,一旦声明,常量值就不能发生改变

3.3 数据类型和运算符

3.3.1 数据类型
  • JavaScript中分为:原始类型和引用类型

  • 原始类型:

    • number:数字(整数,小时,NaN(Not a Number)
    • string:字符串,单双引号都可以
    • boolean:布尔值。true/false
    • null:对象为空
    • underfined:当前声明的对象未初始化,该变量默认值是undefined
  • 使用typeof运算符可以获取数据类型

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //原始数据类型
        alert(typeof(3));//number
        alert(tyepof(3.14));//number

        alert(typeof("A"));//string
        alert(typeof('hello,world'));//string
        
        alert(typeof(false));//boolean
        alert(typeof(true));//boolean

        aler(typeof(null));//object

        var a;
        alert(typeof(a));//undefined
    </script>
</body>
</html>
3.3.2 运算符
  • 算术运算符
  • 赋值运算符
  • 比较运算符
  • 逻辑运算符
  • 三元运算符
  • 该运算符与java的运算符基本一致,只有比较运算符中的== 和===与java不一样
  • 在js中== 会先进行类型转换,再进行比较,===则不会进行类型转换
var a=10;
alert(a=="10");//true
alert(a==="10");//false
alert(a===10);//true
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var a=10;
        var _a="10";
        var $a=10;
        alert(a==_a);//true
        alert(a===_a);//false
        alert(a===$a);//true
    </script>
</body>
</html>
3.3.4 类型转换
  • 字符串类型转换为数字
    • 将字符串字面值转为数字。如果字面值不是数字,则转为NaN
  • 其他类型转换为boolean
    • Number:0和NaN为false,其他均转为true
    • String:空字符串为false,其他均转为true
    • Null和undefined:均转为false
    <script>
        //其他类型转换为数字
        alert(parseInt("12"));//12
        alert(parseInt("12A45"));//12
        alert(parseInt("A45"));//NaN
        //其他类型转换为boolean
        if(0){
            alert("0转换为false");
        }
        if(NaN){
            alert("NaN转换为false");
        }
        if(-1){
            alert("除了0和NaN其他都是true");
        }
        if(""){
            alert("空字符串转换为false,其他都为true");
        }
        if(null){
            alert("null也是转换为false");
        }
        if(undefined){
            alert("undefined也是转换为false");
        }
    </script>
3.3.5 流程控制语句
  • 和java一模一样

4.函数(方法)

  • 介绍:函数(方法)是被设计为执行特定任务的代码块

  • 定义1:JavaScript函数通过function关键字进行定义:

    function fuctionName(参数1,参数2){
        //执行的代码
    }
    
  • 注意:

    • 形式参数不需要类型,因为Js是弱类型语言
    • 返回值也不需要定义类型,可以在函数内部直接使用return返回即可
  • 调用:函数名称(实际参数列表)

<body>
    <script>
        //定义函数
        function add(a,b){
            return a+b;
        }
        var result=add(12,20);
        alert(result);
    </script>
</body>
  • 定义2:
var functionName=fuction(参数1,参数2){
    //需要执行的代码
}
var add=function(a,b){
    return a+b;
}
var result=add(10,20);
alert(result);
  • 定义三:类似于java的Iambda表达式
      var add3=(a,b)=>{
            return a+b;
        }
        alert(add3(10,30));
  • 在函数的调用,可以传递多个参数,但是会按照函数定义的参数个数进行计算

5. 对象

5.1 Array数组

  • 在JS中Array对象是用于定义数组的

  • 定义:

    //方法1
    var 变量名=new Array(元素列表);
    var arr=new Array(1,2,3,4);
    //方法2
    var 变量名=[元素列表];
    var arr=[1,2,3,4];
    
  • 访问:

    arr[索引]=值
    arr[10]="hellow";
    
  • 特点:长度可变,类型可变

    var arr2=[1,2,3,4];
    arr2[10]="hello";
    console.log(arr2[10]);
    
  • 常用的属性和方法

    属性描述
    length设置或返回数组中元素的数量
    方法描述
    forEach()变量数组中的每个有值的元素,并调用一次传入函数
    push()将新元素添加到数组的末尾,并返回数组的长度
    splice()从数组中删除元素
var arr=new Array(1,2,3,4,5);
        for(let i=0;i<arr.length;i++){
            console.log(arr[i]);
        }
对于forEach()方法,里面的参数要设置一个函数,这个函数,是用来处理遍历出来的元素
		var arr=new Array(1,2,3,4,5);
        arr[10]="hello";
        arr.forEach(function(e){
            console.log(e);
        });
    //js中也提供了类似Java lambda表达式叫做箭头函数
     ()=>{}
     arr.forEach(()=>{
         console.log(e);
     });
         //push:添加元素到数组的末尾
        var arr=new Array(1,2,3,4,5);
        arr.push(6,7,8);
        console.log(arr);
       //splice:删除元素
       //从那个索引开始删除,删除几个
       var arr=[1,2,3,4,5];
       arr.splice(2,2);
       console.log(arr);

5.2自定义对象

  • 定义格式:

    var 对象名={
        属性名1:属性值1,
        属性名2:属性值2,
        属性名3:属性值3,
        函数名称:function(参数列表){}
    };
    
    var user={
        name:"tom",
        age:20,
        gender:"male",
        eat:function(){
            alert("吃饭");
        }
        //也可以使用方法也可以简写
        eat(){
            alert("吃饭");
        }
    };
    
  • 调用格式:

    对象名.属性名
    console.log(user.name);
    对象名.函数名
    user.eat();
    

5.3 JSON的介绍

  • JvavScript Object Notation,JavaScript对象标记法
  • JSON是通过js对象标记书写的文本
  • JSON的格式十分简单,就是K/V的键值对,但是键要用双引号
  • JSON现在多用于作为数据载体,在网络中进行数据传输
  • JSON字符串对象只能通过单引号标记
{
    "name":"Tom",
    "age":20,
     "gender":"male"
}
  • 定义:

    var 变量名='{"key1":value1,"key2""value2}';
    
    var userStr='{"name":"Jerry","age":18,"addr":["北京","上海","武宁"]}';
    
  • 由于无法直接获取JSON里面的值,所以需要把JSON对象转换为JS对象

        var userStr='{"name":"Jerry","age":18,"addr":["北京","上海","武宁"]}';//JSON格式的字符串
        //把JSON对象转换为JS对象
        var jsObject=JSON.parse(userStr);
        alert(jsObject.name);
        //把JS对象转换为JSON对象
        var jsonObject=JSON.stringify(jsObject);
		alert(jsonObject);

5.4 BOM对象

  • 概念:Browser Object Model 浏览器对象模型,运行JavaScript与浏览器对话,JavaScript将浏览器的各个组成部分封装成对象

  • 组成:

    • Window:浏览器窗口对象
    • Navigator:浏览器对象
    • Screen:屏幕对象
    • History:历史记录对象
    • Location:地址栏对象
  • 对于Java程序员主要了解Window和Location对象

5.4.1 Window对象
  • 获取:直接使用window,其中window.可以省略
  • 属性:
    • history:对History对象的只读引用
    • location:用于窗口或框架的Location对象。
    • navigator:对navigator对象的只读引用
  • 方法:
    • alert():显示一段消息和一个确定按钮的警告框
    • confirm():显示带有一段消息以及确定和取消的对话框,他会有返回值,点击确定返回true,点击取消返回false
    • setInterval():按照指定的周期(毫米)来调用函数或表达式
    • setTimeout():在指定的毫米数后调用函数或计算表达式
    <script>
    alert("弹出一个警告框");
    //confirm方法--对话框--确认:true--取消:false
    var flag=confirm("是否要删除文件");
    alert(flag);
    //定时器--setInterval --周期性的执行某个方法
    //1000毫米==2s
    var i=0;
    setInterval(function(){
       i++;
       console.log("定时器执行了:"+i+"次");
    },2000);
    //定时器--setTimeOut--延迟指定时间执行一次
    setTimeout(function(){
        alert("JS");
    },3000);
    </script>
5.4.2 Location对象
  • 介绍:地址栏对象
  • 获取:window.location.属性,其中window.可以省略
  • 属性:
    • href:设置或返回完整的URL
    <script>
        alert(location.href);
        //设置新的地址,并且自动跳转到新地址
        location.href="https://leetcode.cn/";
    </script>

5.5 DOM对象

  • 概念:Document Object Model,文档对象模型。

  • 标记语音的各个组成部分封装成对应的对象:

    • Document:整个文档对象
    • Element:元素对象
    • Attribute:属性对象
    • Text:文本对象
    • Comment:注释对象
  • HTML:就是超文本标记语言

  • HTML被浏览器解析成对象:

  • 会将整个HTML封装成Document对象

  • 会将HTML里面的每一个标签封装成Element对象

  • 会将HTML标签中的属性封装成Attribute对象

  • 标签之间的文本会被封装成成Text对象

  • 在HTML中的注释会封装成Comment对象

  • JaavScript通过DOM,就能够对HTML进行操作:

    • 改变HTML元素的内容
    • 改变HTML元素的样式(CSS)
    • 对HTML DOM事件作出反应
    • 添加和删除HTML元素
  • HTML中Element对象可以通过Document对象获取,而Doucument对象是通过window对象获取的

  • Document对象中提供以下获取Element元素对象的函数

    1. 根据id属性值获取,返回单个Element对象
    var h1=document.getElementByID('h1');
    
    1. 通过标签名获取,返回Element对象数组
    var divs=document.getElementsByTagName('div');
    
    1. 根据name属性值获取,返回Element对象数组
    var hobbys=document.getElementsByName('hobby');
    
    1. 根据class属性获取,返回Element对象数组
    var clss=document.getElementsByClassNmae('cls');
    
    
        <script>
            //1.获取Element元素
            //1.1获取元素-根据ID获取,由于id是唯一的所以Element不用加s
             var img=document.getElementById('h1');
            alert(img);
    
            //1.2获取元素-根据标签获取
            var divs=document.getElementsByTagName('div');
            for(var i=0;i<divs.length;i++){
               alert(divs[i]);
            }
    
            //1.3获取元素-根据name获取
            var hobby=document.getElementsByName('hobby');
            for(var i=0;i<hobby.length;i++){
                alert(hobby[i]);
            }
    
            //1.4获取元素--根据class属性获取
            var divs= document.getElementsByClassName('cls');
            for(var i=0;divs.length;i++){
                alert(divs[i]);
            }
            
            //2.查询参考手册,完成相关方法
            var div1=divs[0];
            //通过DOM方法完成对元素的修改
            div1.innerHTML="wzc天下无双";
        </script>
    
  • 要使用DOM步骤:

    1. 获取相关对象
    2. 找到需要修改的属性/方法
    3. 修改该属性值/调用该方法
<body>
    <img id="h1" src="../图片/1.png"><br><br>
    <div class="cls">传智教育</div><br>
    <div class="cls">黑马程序员</div><br>
    <input type="checkbox" name="hobby">电影
    <input type="checkbox" name="hobby">旅行
    <input type="checkbox" name="hobby">游戏
    <script>
     //1.点亮灯泡,修改src属性值
     var light=document.getElementById('h1');
     light.src="../图片/2.png";
    //2.给所以div标签加上very good(红色字体)
    var divs=document.getElementsByTagName('div');
    for(var i=0;i<divs.length;i++){
        const div=divs[i];
        div.innerHTML+="<font color='red'>very good</font>";
    }
    //3.给所以复选框添加选中的状态
    var box=document.getElementsByName('hobby');
    for(var i=0;i<box.length;i++){
        box[i].checked=true;
    }
    </script>
</body>

6 事件监听

  • 事件:HTML事件是发生在HTML元素的“事件",例如:
    • 按钮被点击
    • 鼠标移动到元素上
    • 按下键盘按键
  • 事件监听:JavaScript可以在事件被检测时执行代码

6.1 事件绑定

  • 方法一:通过HTML标签中的事件进行绑定

    <input type="button" onlick="on() value="按钮">                                                            <script>
          fuction on(){
            alert(我被点击了)
              }                                      
    </script>                                                       
    
  • 方式二:通过DOM元素属性绑定

    <input type=button id="bth" value="按钮2">
    <script>
    document.getElmenetById('bth').onclick=function(){
        alert("w我被点击;1")
    }
    </script>
    

6.2 常见事件

事件名说明
onclick鼠标点击事件
onblur元素失去焦点
onfocus元素获取焦点
onload某个页面或图像被完全加载
onsubmit当表单提交时触发该事件
onkeydown键盘上某个按钮被按下
onmouseover鼠标移动到某元素上
onmouseout鼠标从某元素移开
<!-- 给body添加onload事件,当网页开始加载时,会调用load()方法 -->
<body onload="load()">
    <!-- 给表格添加onsubmit事件,当提交这个表单时,会带有subfn()方法 -->
    <form accept="" style="text-align: center;" onsubmit="subfn()">
    <input type="text" name="username" onblur="bfn()"  onfocus="ffn()" onkeydown="kfn()">

    <input id="'b1" type="submit" value="提交">

    <input id="b1" type="button" value="点击事件" onclick="fn1()">

    </form>
    <br><br><br>
    <table width="800px" border="1" cellspacing="0" align="center" onmousemove="over()" onmouseout="out()">
        <tr align="center">
           <th>学号</th>
           <th>姓名</th>
           <th>分数</th>
           <th>评语</th>
        </tr>
        <tr align="center">
            <td>001</td>
            <td>张三</td>
            <td>98</td>
            <td>优秀</td>
        </tr>
        <tr align="center">
            <td>002</td>
            <td>李四</td>
            <td>100</td>
            <td>非常优秀</td>
        </tr>
    </table>
    <script>
        //onload:页面/元素加载完成后触发
        function load(){
            alert("页面加载完毕");
        }
        //onclick:鼠标点击事件
        function fn1(){
            console.log("我被点击了");
        }
        //onblur:失去焦点事件
        function bfn(){
            console.log("失去焦点");
        }
        //onfocus:元素获取焦点
        function ffn(){
            console.log("获取焦点");
        }
        //onkeydown:当键盘下的某个键被按下时
        function kfn(){
            console.log("键盘被按下");
        }
        //onmouseover:当鼠标移动到元素之上
        function over(){
            console.log("鼠标移入....");
        }
        //onmouserout:当鼠标移出
        function out(){
            console.log("鼠标移出....");
        }
        //onsubmit:提交表单事件
        function sunfn(){
           alert("表单被提交了...");
        }
    </script>
</body>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <img src="../图片/1.png" id="light">
    <br><br>
    <input type="button" value="点亮" onclick="on()" >
    <input type="button" value="熄灭" onclick="off()">
    <br><br>
    <input type="text" value="absdajsdkajsdjad" onfocus="small()" onblur="big()" id="文本">
    <br><br>
    <input type="checkbox" name="爱好">电影
    <input type="checkbox" name="爱好">旅游
    <input type="checkbox" name="爱好">游戏
    <br><br>
    <input type="button" value="全选" onclick="al()" >
    <input type="button" value="反选" onclick="none()" >
    <script>
        function on(){
          // 为什么通过ID获取document对象可以
          //var img= document.getElementById('light');
          //img.src="../图片/2.png";
          //我通过标签获取document对象却不可以
          //因为通过下面是获得数组的
          var img=document.getElementsByTagName('img');
          img[0].src="../图片/2.png";
        }
        function off(){
           var img= document.getElementById('light');;
           img.src="../图片/1.png";
        }
        function small(){
             var input=document.getElementById('文本');
             input.value=input.value.toLowerCase ();
        }
        function big(){
            var input=document.getElementById('文本');
             input.value=input.value.toUpperCase();
        }
        function al(){
            var hobby=document.getElementsByName('爱好');
            for(var i=0;i<hobby.length;i++){
                hobby[i].checked=true;
            }
        }
        function none(){
            var hobby=document.getElementsByName('爱好');
            for(var i=0;i<hobby.length;i++){
                hobby[i].checked=false;
            }
        }
    </script>
</body>
</html>

7. Vue

7.1 Vue的快速入门

  • Vue是一套前端框架,免除原生Javascript中的DOM操作,简化书写

  • 基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上

  • 视图-模型-视图模型,当模型内容改变时,通过视图模型,改变视图,或者改变视图内容时,模型内容也会发生改变

  • 使用操作:

    1. 先引入Vue文件(Vue2)
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    
    1. 在JS代码区域,创建Vue核心对象,定义数据模型
    <script>
        new Vue{
            el:"#app",  //表示Vue对象控制的区域,相当于css中的id选择器
            data:{      //定义的数据模型
                message:"hello Vue"
            }    
        }
        
    </script>
    
    1. 编写视图
    <div id="app">
        <input type="text" v-model="message">
        {{message}}//插值表达式
    </div>
    
    • 插值表达式
      • 形式:{{表达式}}
      • 内容:
        • 变量
        • 三元运算符
        • 函数调用
        • 算术运算

7.2 Vue的常用指令

  • 指令:在HTML标签上带有的v-前缀的特殊属性,不同指令具有不同的含义

  • 常用指令:

    指令作用
    v-bind为HTML标签绑定属性值,如设置href,css样式等
    v-model表单元素上创建双向数据绑定
    v-on为HTML标签绑定事件
    v-if条件性的渲染某元素,判断为true时渲染,否则不渲染
    v-else-if条件性的渲染某元素,判断为true时渲染,否则不渲染
    v-else条件性的渲染某元素,判断为true时渲染,否则不渲染
    v-show根据条件展示元素,区别在于切换的是display属性值
    v-for列表渲染,遍历容器的元素或对象的属性
7.2.1 v-vbind和v-model
  • v-bind:为HTML标签绑定属性值,如设置href,css样式等
  • v-model:在表单元素上创建双向数据绑定
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <div id="app">
        <!-- 通过v-vind给href动态绑定地址 -->
        <a v-bind:href="url">链接1</a>  
        <!-- 简化模式 -->
        <a :href="url">链接2</a>
        <!-- 这时候input表单元素和数据项的url绑定了 -->
        <input type="text" v-model="url">
    </div>
    <script>
        new Vue({
            el:"#app",
            data:{
               url:"https://www.baidu.com/"
            }

        })
    </script>
  • 注意:当我们通过V-bind或者v-model绑定变量时,必须在数据模型中声明该变量(例如:上面的url)
7.2.2 v-on
  • 为HTML标签绑定事件

  • 在v-on:后面绑定事件名称

    • 视图层:
    <input type="button" value="按钮" v-on:click="handle()">;
    <!-- 简化模式 -->
    <input type="button" value="按钮" @click="handle()">;
    
    • 创建Vue对象
    <script>
         new Vue({
             el:"#app",   //定义控制区域的区域
             data:{   //定义数据模型的区域
                 //....
             },
             methods:{  //定义函数的区域
             handle:fuction(){
             alert("我被点击了")
         }
         }
             
         })
        
     
    </script>
    

<body>
    <input type="button" id="app" value="按钮"  v-on:click="handel()">
    <script>
        new Vue({
            el:"#app",
            data:{

            },
            methods:{
                handel:function(){
                    alert("我被点击了")
                }
            }
        })
    </script>
</body>
7.2.3条件渲染事件
  • 注意:v-show是通过控制css中的display属性值来完成的
<body>
    <div id="app">
    年龄<input type="text" v-model="age">
    <span v-if="age<=35">年轻人</span>
    <span v-if="age>35&&age<60">中年人</span>
    <span v-if="age>=60">老年人</span>
    <br><br>
    年龄<input type="text" v-model="age">
    <span v-show="age<=35">年轻人</span>
    <span v-show="age>35&&age<60">中年人</span>
    <span v-show="age>=60">老年人</span>
    </div>
    <script>
         new Vue({
            el:"#app",
            data:{
                age:35
            }
         })
    </script>
</body>
7.2.4V-for
  • v-for:基本语法:
<div v-for="addr in addrs">{{addr}}</div>
//第一个addr是遍历出来的元素名称,可以自定义
//第二个addr是在数据模型中定义的数据类型
//插值表达式可以将出数据插入到HTML模版中
//索引是从0开始的
<body>
    <div id="app">
        <!-- 方式1 -->
        <div v-for="addr in addrs">{{addr}}</div>
        <!-- 方式二 -->
        <div v-for="(addr,index) in addrs">{{index}}:{{addr}}</div>
    </div>


    <script>
        new Vue({
            el:"#app",
            data:{
                addrs:["北京","天津","厦门","南昌","武宁"]
            }
        })
    </script>

7.3 Vue的生命周期

  • 生命周期:一个对象从创建到销毁的整个过程
  • 生命周期的八大阶段:没触发一个生命周期事件,会自动执行一个生命周期方法(钩子)
状态创建周期
beforeCreate创建前
created创建后
beforeMount挂载前
mounted挂载完成
beforeUpdate更新前
updated更新完成
beforeDestroy销毁前
destoryed销毁完成

生命周期.png

<script>
   new Vue({
       el:"#app",
       data:{
           
       },
       mounted(){
           console.log("Vue挂载完成,请求获取数据");
       },
       methods:{
           
       },
   })

</script>

8.Ajax(暂时有点懵24.3.13)

  • 概念: Asynchronous JavaScript And Xml ,异步的JavaScript和XML
  • 作用:
    • 数据交换:通过Ajax可以给服务器发送请求,并获取服务器相应数据
    • 异步交互:可以在不重新加载整个网页的情况下,与服务器交换数据并更新部分网页技术:搜索联想,用户名是否可以用的校验等等

在这里插入图片描述

8.1 Axios

  • 介绍:Axios对原生的Ajax进行了封装,简写书写,快速开发

  • Axios的使用方式:

    1. 引入Axios的js文件
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    
    1. 使用Axios发送请求,并获取响应结果

9. 前端工程化

在这里插入图片描述

  • 为了使前后端能够发生交换就必须遵守同一个接口文档

9.1 YApi

  • 介绍:YApi是高效,易用,功能强大的api管理平台,旨在为开发,产品,测试人员提供更优雅的接口管理服务

  • 地址:YApi Pro-高效、易用、功能强大的可视化接口管理平台

  • 也可以使用Apifox

  • get/post请求方式的区别:

  • 在这里插入图片描述

  • Apifox的使用步骤:

    1. 先创建一个目录(添加项目和添加分类)
    2. 在添加接口,使用get请求方式,接口名可以见名之意,比如:getById(通过id查询)(添加接口)
    3. 再在修改文档中设置请求参数返回响应

9.2 环境准备

  • 介绍:Vue-cli是Vue官方提供的一个脚手架,用于快速生成一个Vue的项目模版
  • Vue-cli提供了如下功能:
    • 统一的目录结构
    • 本地调试
    • 热部署
    • 单元测试
    • 集成打包上线
  • 依赖环境:NodeJs

9.3 Vue项目

9.3.1项目的创建
  • 命令行:

    vue create vue-project01
    
  • 图形化界面:

    vue ui
    
  • 创建项目步骤:

    1. 在所需项目文件夹打开控制面板,再在命令行输入vue ui命令
    2. 在创建项目中–包管理器选择npm,暂时不初始化Git仓库
    3. 在选择预设模版中–手动
    4. 再额外选择–Router功能
    5. 选择Vue的版本–2.x
    6. 语法检测选择第一个

在这里插入图片描述

  1. 再在VScode中打开Vue文件夹
9.3.2Vue项目的目录结构
  • 基于Vue脚手架创建出来的工程,有标准的目录结构,如下:

在这里插入图片描述

  • 打开Vue项目:

    • 在Vscode中的NPM脚本中,在serve中运行
    • 在命令行中输入:npm run serve
  • 配置Vue项目的端口号:

    在这里插入图片描述

9.4 Vue项目的开发流程

  • Vue组件文件以.vue结尾,每个组件由三部分组成:,

10.Element

  • Element是一套为开发者,设计师和产品经理准备的基于Vue2.0桌面的组件
  • 组件:组成网页的部件,例如:超链接,按钮,图片,表格,表单,分页条等

10.1 Element的快速入门

  • 安装ElementUI组件库(当前工程的目录下),在命令行执行代码:

    npm install element -ui@2.15.3
    
  • 会把element-ui目录安装在node_modules目录下

  • 引入ElementUI组件库(在main.js文件下),这个可以直接去官网搜索

    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    Vue.use(ElementUI);
    
  • 再在views下创建vue文件(采用驼峰命名),并且要包括vue的三部分

  • 访问Element官网复制组件代码到所创建的vue文件中,调整相关组件

  • 由于默认展示的是根组件App.vue里面的内容,所以我们就需要在App.vue里面引用所创建的Vue文件

  • 在中添加标签:,这样会在

import ElementView from './views/ElementView.vue'
export default {
  components: { ElementView },

10.2 Element的常见组件

  • 组件:就是直接去Element官网,直接负责,然后进行调试就可以了
  • Ctrl+Alt+F格式化
10.2.1 表格
  • Table:用于展示多条结构类似的数据,可对数据进行排序,筛选,对比或其他自定义的操作。
  • 可以查看该组件官网的最下面查看相关属性信息
10.2.2Pagination分页组件
  • Pagination分页:当数据量过多时,使用分页分解数据
  • 具体查看Element官网
10.2.3 Dialog对话框
  • 在保留当前页面状态的情况下,告知用户并承载相关操作
10.2.4Form表单
  • Form表单:有输入框,选择器,单选框,复选框等控件组成,用以收集,校验,提交数据

  • 通过el-form声明一个表单

  • 通过model变量绑定了一个变量from

  • 通过el-form-item声明一个表单项

  • 再通过v-model绑定数据模型

  • 由于绑定了数据模型,就得在data里面声明

//ElementView.vue
<template>
  <div>
    <!-- 这是button按钮 -->
    <el-row>
      <el-button>默认按钮</el-button>
      <el-button type="primary">主要按钮</el-button>
      <el-button type="success">成功按钮</el-button>
      <el-button type="info">信息按钮</el-button>
      <el-button type="warning">警告按钮</el-button>
      <el-button type="danger">危险按钮</el-button>
    </el-row>
    <!-- 这是表格 -->
    <el-table :data="tableData" border style="width: 100%">
      <el-table-column prop="date" label="日期" width="180"> </el-table-column>
      <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
      <el-table-column prop="address" label="地址"> </el-table-column>
    </el-table>
    <!-- 这是分页组件 -->
    <el-pagination
      background
      layout="total,sizes,prev, pager, next,jumper"
      :total="1000"
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
    >
    </el-pagination>
    <!-- 这是对话框 -->
    <!--定义了dialogTableVisible数据模型,数据模型在data里面定义的 -->
    <el-button type="text" @click="dialogTableVisible = true"
      >打开嵌套表格的 Dialog</el-button
    >
    <el-dialog title="收货地址" :visible.sync="dialogTableVisible">
      <!-- 定义了griddata数据模型 -->
      <el-table :data="gridData">
        <el-table-column
          property="date"
          label="日期"
          width="150"
        ></el-table-column>
        <el-table-column
          property="name"
          label="姓名"
          width="200"
        ></el-table-column>
        <el-table-column
          property="address"
          label="地址"
          width="200px"
        ></el-table-column>
      </el-table>
    </el-dialog>
    <br /><br />
    <!-- 通过Dialog展示表单 -->
    <el-button type="text" @click="dialogFormVisible = true"
      >打开嵌套表单</el-button
    >
    <el-dialog title="Form表单" :visible.sync="dialogFormVisible">
      <!-- 通过model绑定了一个变量form -->
      <el-form ref="form" :model="form" label-width="80px">
        <el-form-item label="活动名称">
          <el-input v-model="form.name"></el-input>
        </el-form-item>
        <el-form-item label="活动区域">
          <el-select v-model="form.region" placeholder="请选择活动区域">
            <el-option label="区域一" value="shanghai"></el-option>
            <el-option label="区域二" value="beijing"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="活动时间">
          <el-col :span="11">
            <el-date-picker
              type="date"
              placeholder="选择日期"
              v-model="form.date1"
              style="width: 100%"
            ></el-date-picker>
          </el-col>
          <el-col class="line" :span="2">-</el-col>
          <el-col :span="11">
            <el-time-picker
              placeholder="选择时间"
              v-model="form.date2"
              style="width: 100%"
            ></el-time-picker>
          </el-col>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="onSubmit">立即创建</el-button>
          <el-button>取消</el-button>
        </el-form-item>
      </el-form>
    </el-dialog>
  </div>
</template>
<script>
export default {
  data() {
    return {
      form: {
          name: '',
          region: '',
          date1: '',
          date2: '',
          },
      tableData: [
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄",
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄",
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1516 弄",
        },
      ],
      gridData: [
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄",
        },
      ],
      dialogTableVisible: false,
      dialogFormVisible: false,
    };
  },
  methods: {
    handleSizeChange: function (pager) {
      alert("展示页面数据量为:" + pager);
    },
    handleCurrentChange: function (pager) {
      alert("跳转到页面:" + pager);
    },
    onSubmit:function(){
      // 由于里面的数据全部绑定到了form对象中,可以输出form对象输出
      //由于Form是JSON对象,所以得通过stringify将其转换成字符串
      alert(JSON.stringify(this.form));
    }
  },
};
</script>
<style>
</style>

11.Axios异步加载

  • 当完成页面的布局和组件的实现之后,就需要使用Axios进行异步加载了

  • 使用步骤:

    1. 在项目目录下安装axios:npm install axios(右击该项目在集成终端中打开)
    2. 需要使用axios时,导入axios:import axios form ‘axios’(导入到所创建的Vue文件)
    3. 再创建一个与methods平级的钩子方法(mounted),在该方法中获取异步请求:
         axios.get("https://yapi.pro/mock/73458/emp/list").then((result) =>{
           //地址可以通过YApi创建获取  
          //result就是从Yapi获取到的数据
          //再通过.data获取到数据中的数据管理模块
          //再.data从数据管理模块中获取data属性
          //再讲获取到的值给上面的数据模型赋值
                this.tableData=result.data.data;
         });
    

12. vue路由

  • 前端路由:URL中的hash(#号后面的)与组件之间的对应关系
  • Vue Router是Vue官方路由
  • 组成:
    • VueRouter:路由器类,根据路由请求在路由视图中动态渲染选中的组件
    • :请求链接组件,浏览器会解析生成(超链接标签)
    • :动态路由视图组件,用来渲染展示与路由路径对应的组件

在这里插入图片描述

  • 路由器类中有一个路由表:该表中有与vue组件相关的标识,通过路由链接组件,通过标识来链接对应的组件

12.1 使用步骤

  1. 安装路由(在创建Vue项目时已经选择了)

    npm install vue-router@3.5.1
    
  2. 定义路由表

    • 要在:src的router的index.js中定义

    • 相关的路由信息在const routes 里面配置

  3. 由于在main.js中已经导入路由信息,并且在创建Vue对象时已经指定了路由

  4. 当完成了上述之后,就需要使用标签,然后在对应的区域展示出效果

  5. 标签放在需要跳转标签处

                    <el-menu-item index="1-1">
                      <router-link to="/dept">部门管理</router-link>
                    </el-menu-item>
                    <el-menu-item index="1-2">
                      <router-link to="/emp">员工管理</router-link>
                    </el-menu-item>
    
  6. 再在APP.vue展示,把之前的vue标签注释掉,使用 标签

  7. 当我们重新加载这个项目时,会展示出空白页面,因为初始时,默认路径是空,解决办法就是在添加一个空路径到router里面

13 打包部署

  • 打包部署分为两步:打包和部署
  • 再讲打包好的文件夹通过Nginx部署到服务器上

13.1 打包

在这里插入图片描述

  • 执行NPM第二个脚本:build进行打包,会将打包好的文件放在dist目录下

13.2 部署

  • 介绍:Nginx是一款轻量级的Web服务器/方向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点:占用内存少,并发能力强,在各大互联网公司都有非常广泛的使用

  • Nginx相关目录:

    在这里插入图片描述

  • 部署:将打包好的dist目录下的文件,复制到Nginx安装目录的html目录下面

  • 启动:双击Nginx.exe文件就可以,Nginx服务器默认占用本地的80端口号

  • 可以在命令行中输入:netstat -ano | findStr 80 就可以查看80端口被什么程序占用了

  • 当80端口号是被系统占据时,我们可以通过修改默认端口号来解决

  • 修改步骤:

    1. 在conf目录下的nginx.conf中修改
    2. 在36行的listen 把80修改为90
  • 查看:在浏览器中输入:localhost:90 就可以查看网页了
    通过标识来链接对应的组件

12.1 使用步骤

  1. 安装路由(在创建Vue项目时已经选择了)

    npm install vue-router@3.5.1
    
  2. 定义路由表

    • 要在:src的router的index.js中定义

    • 相关的路由信息在const routes 里面配置

  3. 由于在main.js中已经导入路由信息,并且在创建Vue对象时已经指定了路由

  4. 当完成了上述之后,就需要使用标签,然后在对应的区域展示出效果

  5. 标签放在需要跳转标签处

                    <el-menu-item index="1-1">
                      <router-link to="/dept">部门管理</router-link>
                    </el-menu-item>
                    <el-menu-item index="1-2">
                      <router-link to="/emp">员工管理</router-link>
                    </el-menu-item>
    
  6. 再在APP.vue展示,把之前的vue标签注释掉,使用 标签

  7. 当我们重新加载这个项目时,会展示出空白页面,因为初始时,默认路径是空,解决办法就是在添加一个空路径到router里面

13 打包部署

  • 打包部署分为两步:打包和部署
  • 再讲打包好的文件夹通过Nginx部署到服务器上

13.1 打包

[外链图片转存中…(img-ah5zwD1U-1714900669494)]

  • 执行NPM第二个脚本:build进行打包,会将打包好的文件放在dist目录下

13.2 部署

  • 介绍:Nginx是一款轻量级的Web服务器/方向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点:占用内存少,并发能力强,在各大互联网公司都有非常广泛的使用

  • Nginx相关目录:

    [外链图片转存中…(img-joHOaMKO-1714900669494)]

  • 部署:将打包好的dist目录下的文件,复制到Nginx安装目录的html目录下面

  • 启动:双击Nginx.exe文件就可以,Nginx服务器默认占用本地的80端口号

  • 可以在命令行中输入:netstat -ano | findStr 80 就可以查看80端口被什么程序占用了

  • 当80端口号是被系统占据时,我们可以通过修改默认端口号来解决

  • 修改步骤:

    1. 在conf目录下的nginx.conf中修改
    2. 在36行的listen 把80修改为90
  • 查看:在浏览器中输入:localhost:90 就可以查看网页了

  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要成为全栈糕手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值