Vue.js框架+Axios发送异步请求+elementui前端布局框架

一、Vue

1.什么是vue?

1.JavaScript框架

2.简化Dom操作

3.响应式数据驱动

2.如何使用vue?

官网:介绍 --- Vue.js

开发环境版本,包含了有帮助的命令行警告https://unpkg.com/vue@2/dist/vue.js

1.引入Vue文件

2.在body定义一个双标签

3.定义自己的js代码--创建Vue对象--el:把Vue对象挂载到双标签上,data用于定义数据

2.1EL挂载属性作用?

Vue实例的作用范围是什么?

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

是否可以使用其他选择器?

可以使用,但是建议 使用ID选择器

是否可以设置其他的dom元素?

可以使用其他双标签不能 使用HTMLBody

2.2data定义vue的数据

语法:

data:{

key:value,

............

}

//(value类型可以是Number、boolean、String、Object、Arrays、underfined

3.Vue中常用的指令

vue中的属性,这些指令可以使用在dom属性上。可以调用vue中成员。所有的指令都是以v-开始

3.1v-text和v-html--文本值

设置标签的文本值(textContext)

v-html可以解析内容中的标签 ,v-text和{{}}无法解析

3.2v-on/@事件--绑定事件

为元素绑定事件 [onclick ondblclick onblur onfocus onchange onsubmit等]

v-on:触发的是vue对象method属性中方法名

v-on:可以缩写为@

如果方法中调用vue对象中成员必须使用this

3.3v-show和v-if(不)满足条件(隐藏)显示

满足条件显示,不满足隐藏

根据表达值的真假,切换元素的显示和隐藏

v-if:通过删除标签和添加标签来控制标签的显示和隐藏

v-show:通过style样式来控制标签的显示和隐藏display:none。

如果频繁的显示和隐藏使用v-show

3.4v-else和v-else-if判断

3.5v-bind/:绑定标签属性(src,title,class)

设置元素的属性(比如:src,title,class)

v-bind:可以缩写为:

3.6v-for循环指令

根据数据生成列表结构

v-for="(元素变量名,索引) in 数组"

3.7v-model双向绑定表单元素

获取和设置表单元素的值(双向数据绑定)

比如表单元素(input、radio、select)使用,

双向绑定数据 ,可以快速 获取设置 表单元素内容

v-model表示双向绑定。表单元素内容改变-vue数据跟着改变。 vue数据变化对应的表单元素的内容跟着变化

<body>
    <div id="app">=
        <button v-on:click="fun1()">点击1</button>
        <button @click="fun2()">点击2</button>
        <input type="text" v-model="name" />
        {{name}}
    </div>
</body>
<script>
    let app = new Vue({
        el: "#app",
        data: {
            msg: "<font color='red'>千万别睡觉.</font>",
            name:"admin"
        },
        //定义vue的方法
        methods: {
            fun1() {
                this.name="刘德华"
            },
            fun2() {
                alert("*************"+this.name)
            }
        }
    })
</script>

二、axios发送异步请求

用于发送ajax异步请求,之前使用的是jquery完成ajax异步请求。

$.get(url,[data],[callback],[type])

$.post(url,[data],[callback],[type])

企业种Vue配合axios来完成异步请求。

axios.get(url?key=value&key=value,...).then(function(msg){})

axios.post(url,[data]).then(function(msg){})

1.axios的使用步骤

1.引入axios的文件

<%--引入vue--%>

<script src="js/vue.js"></script>

<%--引入axios文件--%>

<script src="js/axios.min.js"></script>

2.创建div标签

<%--标签就使用div.--%>

<div id="app">

<button @click="fun()">点击</button>

编号:{{user.id}} <br>

姓名:{{user.name}} <br>

年龄:{{user.age}} <br>

</div>

3.创建vue对象并把该对象挂载到div标签上

<script>

let app=new Vue({

el:"#app",//挂载

data:{

user:{}

},

methods:{

fun(){

//异步请求数据

// axios.get("/AjaxServlet?name=刘德华&age=18").then(function(msg){})

//axios会把响应的结果做了再次封装

// axios.get("/AjaxServlet?name=刘德华&age=18").then(msg=>{

// //浏览器控制台输出

// this.user=msg.data;

// })

axios.post("/AjaxServlet",{"name":"zxy","age":18}).then(msg=>{

console.log(msg)

})。。。

2.传递参数的种类

1.query String params:查询字符串参数。地址栏传递

2.form data:表单参数。表单的提交传递

3.request payload:请求载荷,它传递的是json数据

request对象中getParamater方法只能接受上面前两种传递的参数。无法接受第三种传递的参数。 如果现在想接受第三种传递的参数值,那么你需要把第三种传参方法转化为上面的两种。qs工具。

网页中引入qs文件

<%--导入qs文件--%>

<script src="js/qs.min.js"></script>

三、elementui

它是一款前端布局的框架,它可以帮你完成一些简单的布局效果。

引入相应的文件

<%--引入elementui的css样式--%>

<link rel="stylesheet" href=" https://unpkg.com/element-ui/lib/theme-chalk/index.css">

<%--引入vue文件: 必须先引入vue --%>

<script src=" https://unpkg.com/vue@2/dist/vue.js"></script>

<%--引入elementui的js文件--%>

<script src=" https://unpkg.com/element-ui/lib/index.js"></script>

:data使用vue中data属性中数据

四、elementui+vue+后端代码

  1. 异步请求axios:

语法: axios.get(url?key=value&key=value).then(msg=>{})

axios.post(url,{key:value,key:value}).then(msg=>{})

注意:{key:value...}默认为json对象参数。而request.getParamter无法接受这种参数

需要把json对象转化为表单数据。 Qs.stringify(json)

  1. elementui前端布局。--引入elementui的css和js文件,注意先引入vue的js文件。

常见:elementui组件。表格 按钮 对话框 表单 消息框

登录login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<head>
  <title>登录</title>
  <%--引入elementui的css样式--%>
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
  <%--引入vue文件:必须先引入vue--%>
  <script src="https://unpkg.com/vue@2/dist/vue.js"></script>
  <%--引入elementui的js文件--%>
  <script src="https://unpkg.com/element-ui/lib/index.js"></script>
  <script src="js/qs.min.js"></script>
  <script src="js/axios.min.js"></script>

</head>
<body>
  <div id="app" style="width: 350px;height:300px;margin:auto;margin-top: 100px">
    <h3 align="center">登录</h3>
    <el-input
          placeholder="请输入用户名"
          v-model="name"
          clearable>
    </el-input>
    <br><br>
    <el-input
          placeholder="请输入密码"
          v-model="password"
          show-password>
    </el-input>
    <br><br>
    <span style="color: red" v-if="t">用户名或密码错误</span>
    <el-button type="primary" @click="dl()" style="width: 350px">登录</el-button>
  </div>
<script>
  let app = new Vue({
    el:"#app",
    data:{
      name:"",
      password:"",
      t:false
    },
    methods:{
      dl(){
        axios.get("/userServlet?method=login&name="+this.name+"&password="+this.password).then(msg=>{
          if (msg.data){
            this.t=false;
            location.href="homePage.jsp";
          }else {
            this.t=true;
          }
        })
      }
    }
  })
</script>
</body>
</html>

1.先引入文件

2.elementui组件_登录和注册框

3.Vue挂载_登录方法点击触发的事件,通过axios携带数据发送请求

增删改分页

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>首页</title>
    <%--引入elementui的css样式--%>
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <%--引入vue文件:必须先引入vue--%>
    <script src="https://unpkg.com/vue@2/dist/vue.js"></script>
    <%--引入elementui的js文件--%>
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <script src="js/qs.min.js"></script>
    <script src="js/axios.min.js"></script>
</head>
<body>
    <div id="h" align="center">
<%--表头--%>
        <el-header style="text-align: right; font-size: 12px">
            <el-dropdown>
                <i class="el-icon-setting" style="margin-right: 15px"></i>
                <el-dropdown-menu slot="dropdown">
                    <el-dropdown-item @click.native="my_add()">新增</el-dropdown-item>
                </el-dropdown-menu>
            </el-dropdown>
            <span>${sessionScope.user.name}</span>
        </el-header>
<%--显示所有的信息表格--%>
        <el-table
                :data="tableData"
                border
                style="margin: auto">
            <el-table-column
                    prop="id"
                    label="编号"
                    width="120">
            </el-table-column>
            <el-table-column
                    prop="name"
                    label="姓名"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="age"
                    label="年龄"
                    width="120">
            </el-table-column>
            <el-table-column
                    prop="sex"
                    label="性别"
                    width="120">
            </el-table-column>
            <el-table-column
                    prop="phone"
                    label="手机号"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="email"
                    label="邮箱"
                    width="180">
            </el-table-column>
            <el-table-column
                    label="操作"
                    width="180">
                <template slot-scope="scope">
                    <el-button type="primary" @click="my_update(scope.row.id)">编辑</el-button>
                    <el-button type="danger" @click="open(scope.row.id)">删除</el-button>
                </template>
            </el-table-column>
        </el-table>
<%--新增学生信息对话框--%>
        <el-dialog title="新增学生信息" :visible.sync="FormVisible">
            <el-form :model="addForm">
                <el-form-item label="姓名" :label-width="formLabelWidth">
                    <el-input v-model="addForm.name" autocomplete="off"></el-input>
                </el-form-item>
                <el-form-item label="年龄" :label-width="formLabelWidth">
                    <el-input v-model="addForm.age" autocomplete="off"></el-input>
                </el-form-item>
                <el-form-item label="性别" :label-width="formLabelWidth">
                    <el-select v-model="addForm.sex" placeholder="请选择您的性别">
                        <el-option label="男" value="男"></el-option>
                        <el-option label="女" value="女"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item label="手机号" :label-width="formLabelWidth">
                    <el-input v-model="addForm.phone" autocomplete="off"></el-input>
                </el-form-item>
                <el-form-item label="邮箱" :label-width="formLabelWidth">
                    <el-input v-model="addForm.email" autocomplete="off"></el-input>
                </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button @click="FormVisible = false">取 消</el-button>
                <el-button type="primary" @click="confirmAdd()">确 定</el-button>
            </div>
        </el-dialog>
<%--修改学生信息对话框--%>
        <el-dialog title="修改学生信息" :visible.sync="dialogFormVisible">
            <el-form :model="editForm">
                <el-form-item label="姓名">
                    <el-input v-model="editForm.name" autocomplete="off"></el-input>
                </el-form-item>
                <el-form-item label="年龄">
                    <el-input v-model="editForm.age" autocomplete="off"></el-input>
                </el-form-item>
                <el-form-item label="性别">
                    <el-select v-model="editForm.sex" placeholder="请选择您的性别">
                        <el-option label="男" value="男"></el-option>
                        <el-option label="女" value="女"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item label="手机号">
                    <el-input v-model="editForm.phone" autocomplete="off"></el-input>
                </el-form-item>
                <el-form-item label="邮箱">
                    <el-input v-model="editForm.email" autocomplete="off"></el-input>
                </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button @click="dialogFormVisible = false">取 消</el-button>
                <el-button type="primary" @click="confirmUpdate()">确 定</el-button>
            </div>
        </el-dialog>
<%--分页--%>
        <el-pagination
                @size-change="handleSizeChange"
                @current-change="handleCurrentChange"
                :current-page="currentPage"
                :page-sizes="pageSizes"
                :page-size="pageSize"
                layout="total, sizes, prev, pager, next, jumper"
                :total="sumTotal">
        </el-pagination>
    </div>
<script>
    let h = new Vue({
        el:"#h",
        mounted(){
          this.initdata()
        },
        data:{
        //表格数据
            tableData:[],
        //控制修改对话框的显示和隐藏
            dialogFormVisible:false,
            FormVisible:false,
        //修改数据的表单
            //修改的表单对象
            editForm:{},
            addForm:{},
        // 显示的当前页码
            currentPage:1,
        // 数组元素为显示的选择每页显示个数的选项
            pageSizes:[3,4,6],
        // 默认每页的条数
            pageSize:3,
        // 总条数-- 后台获取
            sumTotal:undefined
        },
        methods:{
            //数组元素为显示的选择每页显示个数的选项的几条
            handleSizeChange(val) {
               this.pageSize=val;
               this.initdata();
            },
            //当前所在的页
            handleCurrentChange(val) {
                this.currentPage=val;
                this.initdata();
            },
            //初始化的信息
            initdata(){
                axios.get("/StuServlet?method=select&current="+this.currentPage+"&pageSize="+this.pageSize).then(msg=>{
                   this.tableData=msg.data.list;//把传过来的当前页记录赋给表格的数据
                   this.sumTotal=msg.data.count;//把传过来的总数据给总条数
                })
            },

            //新增
            my_add(){
                this.FormVisible=true;//点击添加,弹出对话框
            },
            //新增确定
            confirmAdd(){
                axios.post("/StuServlet?method=insert",Qs.stringify(this.addForm)).then(msg=>{
                    if (msg.data === 1){
                        this.$message.success("添加成功");
                        this.FormVisible=false;
                        this.initdata();
                    }else {
                        this.$message.error("添加失败");
                    }
                })
            },

            //修改操作
            my_update(id){
                //先找到当前要修改的信息,给列表框显示出来
                axios.get("/StuServlet?method=edit&id="+id).then(msg=>{
                    this.editForm=msg.data;
                    this.dialogFormVisible=true;
                })
            },
                //修改提交重新加载整个页面
                confirmUpdate(){
                    axios.post("/StuServlet?method=update",Qs.stringify(this.editForm)).then(msg=>{
                        if (msg.data === 1){//row传过来给msg为影响1行就代表修改成功
                            this.$message.success("修改成功");//弹出提示信息
                            this.dialogFormVisible=false;//把数据对话框关闭
                            this.initdata();//重新加载页面显示数据
                        }else {
                            this.$message.error("修改失败");
                        }
                    })
                },
            //删除条数所在信息
            open(id){
                axios.get("/StuServlet?method=del&id="+id).then(msg=>{
                    this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }).then(() => {
                        this.initdata();
                        this.$message({
                            type: 'success',
                            message: '删除成功!'
                        });
                    }).catch(() => {
                        this.$message({
                            type: 'info',
                            message: '已取消删除'
                        });
                    });
                })
            }
        }
    })
</script>
</body>
</html>
相关推荐
Martin -Tang16 分钟前
vite和webpack的区别
前端·webpack·node.js·vite
迷途小码农零零发17 分钟前
解锁微前端的优秀库
前端
王解1 小时前
webpack loader全解析,从入门到精通(10)
前端·webpack·node.js
老码沉思录1 小时前
写给初学者的React Native 全栈开发实战班
javascript·react native·react.js
我不当帕鲁谁当帕鲁1 小时前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis
那一抹阳光多灿烂1 小时前
工程化实战内功修炼测试题
前端·javascript
放逐者-保持本心,方可放逐2 小时前
微信小程序=》基础=》常见问题=》性能总结
前端·微信小程序·小程序·前端框架
毋若成4 小时前
前端三大组件之CSS,三大选择器,游戏网页仿写
前端·css
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
Black蜡笔小新5 小时前
网页直播/点播播放器EasyPlayer.js播放器OffscreenCanvas这个特性是否需要特殊的环境和硬件支持
前端·javascript·html