Ajax与Vue初步学习

文章目录

Ajax与Vue

Ajax概念与作用

Ajax:

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

原生Ajax

  • 准备数据地址
  • 创建XMLHttpRequest对象:用于和服务器交换数据
  • 向服务器发送请求
  • 获取服务器响应数据
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ajax</title>
    <script src="js/axios-0.18.0.js"></script>
</head>
<body>
    <input type="button" value="获取数据">
    <div id="div1"></div>
</body>

<script>
    function getData(){
        //创建 XMLHttpRequest
        var xmlHttpRequest = new XMLHttpRequest();
        
        //发送异步请求
        xmlHttpRequest.open('GET',http://yapi.smart-xwork.cn/mock/169327/emp/list); 
        xmlHttpRequest.send();    //发送请求

        //获取服务端响应数据
        xmlHttpRequest.onreadystatechange = function(){
            if(xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200){
                document.getElementById('div1').innerHTML = xmlHttpRequest.responseText;
            }
        }
    }
</script>
</html>

Axios

  • 介绍:Axios对原生的Ajax进行了封装,简化了书写,快速开发
Axios入门
  • 引入Axios的js文件

    html 复制代码
    <script src="js/axios-0.18.0.js"></script>
  • 使用Axios发送请求,并获取响应结果

    html 复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Ajax-Axios</title>
        <script src="js/axios-0.18.0.js"></script>
    </head>
    <body>
        <input type="button" value="获取数据GET" onclick="get()">
        <input type="button" value="删除数据POST" onclick="post()">
    </body>
    
    <script>
        function get(){
            //通过axios发送异步请求get
            axios({
                method:"get",
                url:"http://ajax-api.itheima.net/api/province"
            }).then(result => (
                console.log(result.data),
                alert(result.data)
            ))
        }
    
        function post(){
            //通过axios发送异步请求-post
            axios({
                method:"post",
                url:"http://ajax-api.itheima.net/api/login",
                data:{
                    username:"admin",
                    password:"111"
                }
            }).then(result=>{
                console.log(result.data)
            })
        }
    </script>
    </html>
  • Axios请求方式别名

    • axios.get(url,[,config])
    • axios.delete(url,[,config])
    • axios.post(url,[,config])
    • axios.put(url,[,config])
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ajax-Axios</title>
    <script src="js/axios-0.18.0.js"></script>
</head>
<body>
    <input type="button" value="获取数据GET" onclick="get()">
    <input type="button" value="删除数据POST" onclick="post()">
</body>

<script>
    function get(){
        //通过axios发送异步请求get
/*         axios({
            method:"get",
            url:"http://ajax-api.itheima.net/api/province"
        }).then(result => (
            console.log(result.data),
            alert(result.data)
        )) */

        axios.get("http://ajax-api.itheima.net/api/province").then(result=>{
            console.log(result.data);
        })
    }

    function post(){
        //通过axios发送异步请求-post
/*         axios({
            method:"post",
            url:"http://ajax-api.itheima.net/api/login",
            data:{
                username:"admin",
                password:"111"
            }
        }).then(result=>{
            console.log(result.data)
        }) */
       axios.post("url","id = 1").then(result=>{
        console.log(result.data);
       })
    }
</script>
</html>

案例

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>
    <script src="js/axios-0.18.0.js"></script>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app">
        <table border="1" cellspacing="0" width="60%">
            <tr>
                <th>id</th>
                <th>作者</th>
                <th>书名</th>
                <th>出版社</th>
            </tr>
            <tr v-for="(emp, index) in emps">
                <td>{{index+1}}</td>
                <td>{{emp.author}}</td>
                <td>{{emp.bookname}}</td>
                <td>{{emp.publisher}}</td>
            </tr>
        </table>

    </div>
</body>
<script>
    new Vue({
        el:"#app",
        data:{
            emps:[]
        },
        mounted() {
            axios({
                method:"get",
                url:"http://ajax-api.itheima.net/api/books"
            }).then(result=>(
                this.emps = result.data.data
            ))
        },
    })
</script>
</html>

前后端分离开发

介绍

需求分析---> 接口定义(API接口文档)--->前后端并行开发(遵守规范)--->测试(前端,后端)--->前后端联调测试

YAPI

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

前端工程化

模块化 组件化 规范化 自动化

前端工程化:在企业级的前端项目开发中,把前端开发所需要的工具、技术、流程、经验等进行规范化、标准化.

环境准备

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

Vue项目简介

Vue项目-创建
  • 使用命令行创建 : vue create vue-project01
  • 图形化界面: vue ui
Vue项目-目录结构
  • 基于Vue脚手架创建出来的工程,有标准的目录结构
    • node_moudules整个项目的依赖包
    • public 存放项目的静态文件
    • src 存放项目的源代码
      • assets 静态资源
      • components 可重用的组件
      • router 路由配置
      • views 视图组件(页面)
      • App.vue 入口页面(根组件)
      • main.js 入口js文件
    • package.json 模块基本信息,项目开发所需要模块,版本信息
    • vue.config.js 保存vue配置的文件 如,代理,端口的配置等
Vue项目-配置端口
javascript 复制代码
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true
    deServer:{
    port:7000,
	}
})
Vue项目开发流程
  • 根组件: 以.vue结尾的文件
html 复制代码
<template>
    //模板部分,由它生成HTML代码
</template>

<script>
    
    //控制模板的数据来源和行为
</script>

<style>
    
    //控制css样式
</style>

Vue组件库Element

  • Element : 是饿了么团队研发,一套为开发者、设计者和铲平经理准备的基于Vue2.0的桌面端组件
  • 组件:组成网页的不见,例如,超链接、按钮、图片、表格、表单、分页条等等

快速入门

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

    cmd 复制代码
    npm install element-ui@2.15.3
  • 引入ElementUI组件库

    javascript 复制代码
    import ElementUI from 'element-ui'
    import 'element-ui/lib/theme-chalk/index.css';
    
    Vue.use(ElementUI);
  • 访问官网,组织组件代码,调正。

常见组件

  • Table表格:用于展示多条结构类似的数据,可对数据进行排序、筛选、对比或其他自定义操作。
html 复制代码
<template>
  <div>
    <el-table :data="tableData" 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>
  </div>
</template>

<script>
export default {
          data() {
        return {
          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 弄'
          }]
        }
      }
};
</script>

<style></style>
  • 常见组件-分页

Pagination分页:当数据量过多时,使用分页分解数据。

html 复制代码
<template>
  <div>
    <el-pagination background layout="total,sizes,prev,prev, pager, next" 
    @size-change="handleSizeChange"
    @current-change="handleCurrentChange"
    :total="1000">
    </el-pagination>
  </div>
</template>

<script>
export default {
  data() {
    return {
      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 弄",
        },
      ],
    };
  },
  methods: {
    handleCurrentChange:function(val){
        alert("页码变化为:"+val);
    },
    handleSizeChange:function(val){
        alert("每页记录数变化为:"+val)
    }
  },
};
</script>

<style></style>
  • 常见组件-对话框

Dialog对话框:在保留当前页面状态的情况下,告知用户并承载相关操作。

html 复制代码
<template>
  <div>
    <!-- <el-pagination background layout="total,sizes,prev,prev, pager, next" 
    @size-change="handleSizeChange"
    @current-change="handleCurrentChange"
    :total="1000">
    </el-pagination> -->
    <!-- Table -->
    <!-- Table -->
    <el-button type="text" @click="dialogTableVisible = true"
      >打开嵌套表格的 Dialog</el-button
    >
    <el-dialog title="收货地址" :visible.sync="dialogTableVisible">
      <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="地址"></el-table-column>
      </el-table>
    </el-dialog>

    <!-- Form -->
    <el-button type="text" @click="dialogFormVisible = true"
      >打开嵌套表单的 Dialog</el-button
    >

    <el-dialog title="收货地址" :visible.sync="dialogFormVisible">
      <el-form :model="form">
        <el-form-item label="活动名称" :label-width="formLabelWidth">
          <el-input v-model="form.name" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="活动区域" :label-width="formLabelWidth">
          <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>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="dialogFormVisible = false"
          >确 定</el-button
        >
      </div>
    </el-dialog>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        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,
        form: {
          name: '',
          region: '',
          date1: '',
          date2: '',
          delivery: false,
          type: [],
          resource: '',
          desc: ''
        },
        formLabelWidth: '120px'
      };
    }
};
</script>

<style></style>
  • 常见组件-From表单
html 复制代码
<template>
    <div>
        <!-- Table -->
        <el-button type="text" @click="dialogFormVisible = true">打开嵌套表格的 Dialog</el-button>

        <el-dialog title="From表单" :visible.sync="dialogFormVisible">
            <el-form :inline="true" :model="formInline" class="demo-form-inline">
                <el-form-item label="审批人">
                    <el-input v-model="formInline.user" placeholder="审批人"></el-input>
                </el-form-item>
                <el-form-item label="活动区域">
                    <el-select v-model="formInline.region" placeholder="活动区域">
                        <el-option label="区域一" value="shanghai"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item>
                    <el-button type="primary" @click="onSubmit">查询</el-button>
                </el-form-item>
            </el-form>
        </el-dialog>




    </div>
</template>


<script>
export default {
    data() {
        return {
            formInline: {
                user: '',
                region: ''
            },
            dialogFormVisible: false,
        }
    },
    methods: {
        onSubmit() {
            alert(JSON.stringify(this.formInline))
        }
    }
}
</script>

<style></style>

案例

根据页面原型完成员工管理页面开发,并通过Axios完成数据异步加载

步骤

  • 创建页面,完成页面的整体布局规划
  • 布局中每个部分的组件实现
  • 列表数据的异步加载,并渲染展示

Vue项目中使用Axios:

  • 在项目目录下安装axios: npm install axios;
  • 需要使用axios时,导入axios: import axios from 'axios';
html 复制代码
<template>
    <div>
        <el-container style="height: 700px; border: 1px solid #eee">
            <el-header style="font-size:40px; background-color: rgb(238, 241, 246);">tlias智能学习辅助系统</el-header>
            <el-container >
                <el-aside width="230px" style=" border: 1px solid #eee">
                    <el-menu :default-openeds="['1', '3']">
                        <el-submenu index="1">
                            <template slot="title"><i class="el-icon-message"></i>系统信息管理</template>
                            <el-menu-item-group>
                                <template slot="title">分组一</template>
                                <el-menu-item index="1-1">部门管理</el-menu-item>
                                <el-menu-item index="1-2">员工管理</el-menu-item>
                            </el-menu-item-group>
                        </el-submenu>
                    </el-menu>
                </el-aside>
                <el-main>
                    <!-- 表单 -->
                    <el-form :inline="true" :model="searchForm" class="demo-form-inline">
                        <el-form-item label="姓名">
                            <el-input v-model="searchForm.name" placeholder="姓名"></el-input>
                        </el-form-item>

                        <el-form-item label="性别">
                            <el-select v-model="searchForm.gender" placeholder="性别">
                                <el-option label="男" value="1"></el-option>
                                <el-option label="女" value="2"></el-option>
                            </el-select>
                        </el-form-item>

                        <el-form-item label="入职日期">
                            <!-- 日期选择器 -->
                            <el-date-picker v-model="searchForm.entryDate" type="daterange" range-separator="至"
                                start-placeholder="开始日期" end-placeholder="结束日期">
                            </el-date-picker>
                        </el-form-item>

                        <el-form-item>
                            <el-button type="primary" @click="onSubmit">查询</el-button>
                        </el-form-item>
                    </el-form>
                    <!-- 表格 -->
                    <el-table :data="tableData">
                        <el-table-column prop="name" label="姓名" width="180"></el-table-column>
                        <el-table-column  label="图像" width="180">
                            <template slot-scope="scope"> 
                                <img :src = "scope.row.image" width="70px" height="100px" >
                            </template>
                        </el-table-column>
                        <el-table-column  label="性别" width="140">
                            <template slot-scope="scope">
                                {{ scope.row.gender ==1? '男':'女' }}
                            </template>
                        </el-table-column>
                        <el-table-column prop="job" label="职位" width="140"></el-table-column>
                        <el-table-column prop="entrydate" label="入职日期" width="180"></el-table-column>
                        <el-table-column prop="updatetime" label="最后操作时间" width="230"></el-table-column>
                        <el-table-column label="操作">
                            <el-button type="primary" size="mini">编辑</el-button>
                            <el-button type="danger" size="mini">删除</el-button>
                        </el-table-column>
                    </el-table>
                    <br>
                    <br>
                    <br>
                    <!-- 分页条 -->
                    <el-pagination background layout="total,sizes,prev,prev, pager, next"
                        @size-change="handleSizeChange" @current-change="handleCurrentChange" :total="1000">
                    </el-pagination>
                </el-main>
            </el-container>
        </el-container>
    </div>
</template>


<script>

import axios from 'axios';

export default {
    data() {
        return {
            tableData: [],
            searchForm: {
                name: "",
                gender: "",
                entryDate: [],
            }
        }
    },
    methods: {
        onSubmit() {
            alert("查询数据");
        },
        handleCurrentChange: function (val) {
            alert("页码变化为:" + val);
        },
        handleSizeChange: function (val) {
            alert("每页记录数变化为:" + val)
        },
    },
    mounted() {
        //发送异步请求,获取数据

        axios.get("https://mock.apifox.cn/m1/3128855-0-default/emp/list").then((result) => {
            this.tableData = result.data.data;
        })
    },
}
</script>

<style></style>

Vue路由

前端路由:URL中的hash(#号)与组件之间的对应关系

Vue Router

  • 介绍 : Vue Router 是 Vue 的官方路由

  • 组成

    • VueRouter : 路由器类,根据路由请求在路由视图中动态渲染选中的组件。
    • <router-link> : 请求链接组件,浏览器会解析成<a>
    • <router-view> : 动态试图组件,用来渲染展示与路由路径对应的组件。
  • 安装(创建Vue项目时选择路由功能自动安装)

    html 复制代码
    npm install vue-router@3.5.1
  • 定义路由

    在router/index.js路径下

打包部署

打包: 使用npm脚本 build

部署:Nginx

  • 介绍: Nginx 是一款轻量级的Web服务器\反向代理服务器及电子邮件(IMAP/POP3) 代理服务器。其特点是占用内存少,并发能力强,在各大型互联网公司都有非常广泛的使用。
  • 部署: 将打包好的 dist 目录下的文件,复制到nginx 安装目录的 html 目录下。

Nginx默认占用80 端口号,如果80端口号被占用,可以在nginx.conf中修改端口号

使用cmd命令 `netstat -ano|findStr 80 可以查询哪个进程占用了80端口

在nginx根目录下调用cmd,输入nginx -s quit关闭

Nginx目录:

  • conf 配置文件目录
  • contrib
  • docs
  • html 静态资源文件目录
  • logs 日志文件目录
  • temp 临时文件目录
  • nginx.exe
相关推荐
咔叽布吉25 分钟前
【前端学习笔记】AJAX、axios、fetch、跨域
前端·笔记·学习
GISer_Jing1 小时前
Vue3常见Composition API详解(适用Vue2学习进入Vue3学习)
前端·javascript·vue.js
计算机学姐1 小时前
基于SSM的宠物领养平台
java·vue.js·spring·maven·intellij-idea·mybatis·宠物
谢白羽1 小时前
深度神经网络模型压缩学习笔记三:在线量化算法和工具、实现原理和细节
笔记·学习·dnn
工业互联网专业2 小时前
Python毕业设计选题:基于django+vue的期货交易模拟系统的设计与实现
vue.js·python·django·毕业设计·源码·课程设计
悦涵仙子2 小时前
vueuse中的useTemplateRefsList
前端·javascript·vue.js
楚疏笃2 小时前
鸿蒙学习自由流转与分布式运行环境-价值与架构定义(1)
学习·架构·harmonyos
架构文摘JGWZ2 小时前
替代Postman ,17.3K star!
学习·工具
宇寒风暖2 小时前
软件工程——UML简介
笔记·学习·软件工程