day06——前后端交互

news2024/9/19 22:22:21

一、计算属性

计算属性就是基于现有的数据推算出来的新属性,只要依赖的数据变化,新属性就会自动更新,而且计算属性多次调用的情况下只会计算一次,效率非常高

简化写法

const app = new Vue({
el: '#app',
data: {},
methods: {//跟data平级
  函数名(){
      return 计算结果
  } 
}, 
computed:{//跟data平级
  计算属性名(){
      return 计算结果
  } 
}
})

完整写法

计算属性的值默认情况下是不能直接进行修改的,如果非要修改,就必须使用计算属性的完整写法(表格全选情况会用到,下篇文章案例中会出现)

const app = new Vue({
   el: '#app',
   data: {},
   computed:{//跟data平级
       计算属性名:{
           get(){
               返回计算属性的值
           }
           set(val){
                提供修改的逻辑
           }
       } 
   }
})

二、Vue周期

三、axios发送请求

四、前后端交互案例

接口文档地址: 查询我的账单列表 - 传智教育-vue基础案例接口

功能需求:

        1.基本渲染

        2.合计根据页面数据变化

        3. 添加功能

        4. 删除功能

初始代码:

<!DOCTYPE html>
<html lang="en">
​
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- CSS only -->
    <link href="./css/bootstrap.min.css" rel="stylesheet">
    <script src="./js/vue-2.6.12.js"></script>
    <script src="./js/axios-0.20.0.js"></script>
    <style>
        .red {
            color: red !important;
        }
​
        .search {
            width: 300px;
            margin: 20px 0;
        }
​
        .my-form {
            display: flex;
            margin: 20px 0;
        }
​
        .my-form input {
            flex: 1;
            margin-right: 20px;
        }
​
        .table> :not(:first-child) {
            border-top: none;
        }
​
        .contain {
            display: flex;
            padding: 10px;
        }
​
        .list-box {
            flex: 1;
            padding: 0 30px;
        }
​
        .list-box a {
            text-decoration: none;
        }
​
        .echarts-box {
            width: 600px;
            height: 400px;
            padding: 30px;
            margin: 0 auto;
            border: 1px solid #ccc;
        }
​
        tfoot {
            font-weight: bold;
        }
​
        @media screen and (max-width: 1000px) {
            .contain {
                flex-wrap: wrap;
            }
​
            .list-box {
                width: 100%;
            }
​
            .echarts-box {
                margin-top: 30px;
            }
        }
    </style>
</head>
​
<body>
    <div id="app">
        <div class="contain">
            <!-- 左侧列表 -->
            <div class="list-box">
​
                <!-- 添加资产 -->
                <form class="my-form">
                    <input type="text" class="form-control" placeholder="消费名称" />
                    <input type="text" class="form-control" placeholder="消费价格" />
                    <button type="button" class="btn btn-primary">添加账单</button>
                </form>
​
                <table class="table table-hover">
                    <thead>
                        <tr>
                            <th>编号</th>
                            <th>消费名称</th>
                            <th>消费价格</th>
                            <th>操作</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>1</td>
                            <td>帽子</td>
                            <td>99</td>
                            <td><a href="javascript:;">删除</a></td>
                        </tr>
                    </tbody>
                    <tfoot>
                        <tr>
                            <td colspan="4">消费总计: 298.00</td>
                        </tr>
                    </tfoot>
                </table>
            </div>
        </div>
    </div>
    <script>
        /**
         * 接口文档地址:
         * https://www.apifox.cn/apidoc/shared-24459455-ebb1-4fdc-8df8-0aff8dc317a8/api-53371058
         * 
         * 功能需求:
         * 1. 基本渲染
         * 2. 添加功能
         * 3. 删除功能
         */
        const app = new Vue({
            el: '#app',
            data: {
               
            },
            methods: {
                
            },
            created() {
              
            }
        })
    </script>
</body>
​
</html>

网页初始界面如图所示:

1、基本渲染

        (1)定义一个发送请求的查询数据的方法(在vue初始化后,渲染前执行)

        (2)查询句式:

                axios.get("地址?Query参数变量名=参数值").then(res=>{

                        res.data.data

                })

        (3)在vue对象的data{}中,定义一个数组接收数据

        (4)在html的body代码中利用v-for遍历数组数据,展现在页面上

该部分代码实现:
<tr v-for="(item,index) in orders">
      <td>{{item.id}}</td>
      <td>{{item.name}}</td>
      <td>{{item.price}}</td>
      <td><a href="javascript:;">删除</a></td>
</tr>
<script>
     const app = new Vue({
          el: '#app',
          data: {
               orders:[]
           },
           methods: {
                //1、定义一个发送请求查询数据的方法
               findAll() {
                   axios.get("https://applet-base-api-t.itheima.net/bill?creator=zhangsan").then(res=>{
                       this.orders = res.data.data
                    })
                }
            },
            created() {
                //vue初始化后,渲染之前执行
                this.findAll()
            }
        })
</script>

效果图:

2、合计根据页面数据变化

        (1)在vue对象中使用计算属性,实现总计效果

        (2)写一个total()方法,定义sum存储结果,遍历数组,获取每条数据的价格相加,然后返回sum

        (3)在html的body代码中,将写死的数据,换成插值表达式{{total}}

该部分代码实现:
<tr>
    <td colspan="4">消费总计:{{total}}</td>
</tr>
<script>
        const app = new Vue({
            el: '#app',
            data: {
                orders:[]
            },
            methods: {
                //1、定义一个发送请求查询数据的方法
                findAll() {
                    axios.get("https://applet-base-api-t.itheima.net/bill?creator=zhangsan").then(res=>{
                       this.orders = res.data.data
                    })
                }
            },
            created() {
                //vue初始化后,渲染之前执行
                this.findAll()
            },
            computed: {
                total(){
                    let sum = 0
                    this.orders.forEach(element => {
                        sum += element.price
                    })
                    return sum
                }
            }
        })
</script>

效果图:

3、添加功能

        (1)在vue对象的data{}中,定义一个对象 saveOrder:{},用于存储要存入的数据

        (2)通过v-model双向绑定输入框与vue对象

        (3)给“添加账单”按钮绑定事件add()

        (4)在vue对象的methods{}中实现add()方法

                (a)设置账单的创建者

                (b)发送请求到服务端保存

                        添加句式:

                                axios.post("地址",添加对象).then(res=>{}

                (d)判断保存是否成功

                (e)页面的数据列表重新加载

                (f)清空输入框

该部分代码实现:
<form class="my-form">
       <input type="text" class="form-control" placeholder="消费名称"  v-model="saveOrder.name"/>
       <input type="text" class="form-control" placeholder="消费价格"  v-model="saveOrder.price"/>
       <button type="button" class="btn btn-primary" @click="add()">添加账单</button>
</form>
<script>
        const app = new Vue({
            el: '#app',
            data: {
                orders:[],
                saveOrder:{}
            },
            methods: {
                //1、定义一个发送请求查询数据的方法
                findAll() {
                    axios.get("https://applet-base-api-t.itheima.net/bill?creator=zhangsan").then(res=>{
                       this.orders = res.data.data
                    })
                },
                add(){
                    //设置账单的创建者
                    this.saveOrder.creator="zhangsan"
                    //发送请求到服务端保存
                    axios.post("https://applet-base-api-t.itheima.net/bill",this.saveOrder).then(res=>{
                        //判断保存是否成功
                        if(res.data.message=="ok"){
                            alert("添加成功")
                             //页面的数据列表重新加载
                            this.findAll()
                            //清空输入框
                            this.saveOrder={}
                        }
                    })
                }
            },
            created() {
                //vue初始化后,渲染之前执行
                this.findAll()
            },
            computed: {
                total(){
                    let sum = 0
                    this.orders.forEach(element => {
                        sum += element.price
                    })
                    return sum
                }
            }
        })
</script>

效果图:

4、 删除功能

        (1)给“删除”按钮绑定事件del(),需要根据id删除,所以需要传入参数item.id

        (2)在vue对象的methods{}中实现del()方法

                (a)发送请求,删除数据

                        删除句式:

                                axios.delete("地址" + id).then(res=>{

                                        console.log(res)

                                 )}

                (b)判断响应的message是否ok

                (d)页面的数据列表重新加载

该部分代码实现:
<td><a href="javascript:;" @click="del(item.id)">删除</a></td>
<script>
        const app = new Vue({
            el: '#app',
            data: {
                orders:[],
                saveOrder:{}
            },
            methods: {
                //1、定义一个发送请求查询数据的方法
                findAll() {
                    axios.get("https://applet-base-api-t.itheima.net/bill?creator=zhangsan").then(res=>{
                       this.orders = res.data.data
                    })
                },
                add(){
                    //设置账单的创建者
                    this.saveOrder.creator="zhangsan"
                    //发送请求到服务端保存
                    axios.post("https://applet-base-api-t.itheima.net/bill",this.saveOrder).then(res=>{
                        //判断保存是否成功
                        if(res.data.message=="ok"){
                            alert("添加成功")
                             //页面的数据列表重新加载
                            this.findAll()
                            //清空输入框
                            this.saveOrder={}
                        }
                    })
                },
                del(id){//根据id删除
                    // 发送请求,删除数据
                    axios.delete("https://applet-base-api-t.itheima.net/bill/" + id).then(res=>{
                        console.log(res)
                        // 判断响应的message是否ok
                        if(res.data.message=="ok"){
                            alert("删除成功")
                            this.findAll()
                        }
                    })
                }
            },
            created() {
                //vue初始化后,渲染之前执行
                this.findAll()
            },
            computed: {
                total(){
                    let sum = 0
                    this.orders.forEach(element => {
                        sum += element.price
                    })
                    return sum
                }
            }
        })
</script>

效果图:

完整代码: 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- CSS only -->
    <link href="./css/bootstrap.min.css" rel="stylesheet">
    <script src="./js/vue-2.6.12.js"></script>
    <script src="./js/axios-0.20.0.js"></script>
    <style>
        .red {
            color: red !important;
        }

        .search {
            width: 300px;
            margin: 20px 0;
        }

        .my-form {
            display: flex;
            margin: 20px 0;
        }

        .my-form input {
            flex: 1;
            margin-right: 20px;
        }

        .table> :not(:first-child) {
            border-top: none;
        }

        .contain {
            display: flex;
            padding: 10px;
        }

        .list-box {
            flex: 1;
            padding: 0 30px;
        }

        .list-box a {
            text-decoration: none;
        }

        .echarts-box {
            width: 600px;
            height: 400px;
            padding: 30px;
            margin: 0 auto;
            border: 1px solid #ccc;
        }

        tfoot {
            font-weight: bold;
        }

        @media screen and (max-width: 1000px) {
            .contain {
                flex-wrap: wrap;
            }

            .list-box {
                width: 100%;
            }

            .echarts-box {
                margin-top: 30px;
            }
        }
    </style>
</head>

<body>
    <div id="app">
        <div class="contain">
            <!-- 左侧列表 -->
            <div class="list-box">

                <!-- 添加资产 -->
                <form class="my-form">
                    <input type="text" class="form-control" placeholder="消费名称"  v-model="saveOrder.name"/>
                    <input type="text" class="form-control" placeholder="消费价格"  v-model="saveOrder.price"/>
                    <button type="button" class="btn btn-primary" @click="add()">添加账单</button>
                </form>

                <table class="table table-hover">
                    <thead>
                        <tr>
                            <th>编号</th>
                            <th>消费名称</th>
                            <th>消费价格</th>
                            <th>操作</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr v-for="(item,index) in orders">
                            <td>{{item.id}}</td>
                            <td>{{item.name}}</td>
                            <td>{{item.price}}</td>
                            <td><a href="javascript:;" @click="del(item.id)">删除</a></td>
                        </tr>
                    </tbody>
                    <tfoot>
                        <tr>
                            <td colspan="4">消费总计:{{total}}</td>
                        </tr>
                    </tfoot>
                </table>
            </div>
        </div>
    </div>
    <script>
        /**
         * 接口文档地址:
         * https://www.apifox.cn/apidoc/shared-24459455-ebb1-4fdc-8df8-0aff8dc317a8/api-53371058
         * 
         * 功能需求:
         * 1. 基本渲染
         * 2. 添加功能
         * 3. 删除功能
         */
        const app = new Vue({
            el: '#app',
            data: {
                orders:[],
                saveOrder:{}
            },
            methods: {
                //1、定义一个发送请求查询数据的方法
                findAll() {
                    axios.get("https://applet-base-api-t.itheima.net/bill?creator=zhangsan").then(res=>{
                       this.orders = res.data.data
                    })
                },
                add(){
                    //设置账单的创建者
                    this.saveOrder.creator="zhangsan"
                    //发送请求到服务端保存
                    axios.post("https://applet-base-api-t.itheima.net/bill",this.saveOrder).then(res=>{
                        //判断保存是否成功
                        if(res.data.message=="ok"){
                            alert("添加成功")
                             //页面的数据列表重新加载
                            this.findAll()
                            //清空输入框
                            this.saveOrder={}
                        }
                    })
                },
                del(id){//根据id删除
                    // 发送请求,删除数据
                    axios.delete("https://applet-base-api-t.itheima.net/bill/" + id).then(res=>{
                        console.log(res)
                        // 判断响应的message是否ok
                        if(res.data.message=="ok"){
                            alert("删除成功")
                            this.findAll()
                        }
                    })
                }
            },
            created() {
                //vue初始化后,渲染之前执行
                this.findAll()
            },
            computed: {
                total(){
                    let sum = 0
                    this.orders.forEach(element => {
                        sum += element.price
                    })
                    return sum
                }
            }
        })
    </script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

易境通海运系统:打造海运专线稳定合作的强力引擎

对于海运专线而言&#xff0c;稳定的合作伙伴至关重要。在激烈的市场竞争中&#xff0c;如何持续保持客户的高满意度&#xff0c;不断强化自身优势&#xff0c;并提升用户粘性&#xff0c;是众多海运专线必须面对并解决的问题。而拥有一套可靠的系统&#xff0c;提供完备的服务…

会“坐”电梯,能避障碍,AGV无人搬运车进入各行各业

AGV 近年来&#xff0c;自动导引车&#xff08;Automated Guided Vehicle&#xff0c;简称AGV&#xff09;作为一种先进的物流设备&#xff0c;在制造业中广泛应用。AGV是一种能够自主行驶的无人驾驶车辆&#xff0c;通过内置的导航系统和传感器&#xff0c;实现对环境的感知与…

Loop Map 循环的几种方法

参考 Using entrySet() public void iterateUsingEntrySet(Map<String, Integer> map) {for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() ":" entry.getValue());} } Iterator<Map.Entry<String…

Apache CloudStack Official Document 翻译节选(七)

关于 Apache CloudStack 的 最佳实践 &#xff08;一&#xff09; Best Practices 部署Apache CloudStack是极具挑战性的&#xff0c;在整个部署过程中需要你做出形形色色的技术性选择。Apache CloudStack的配置条目是相当灵活的&#xff0c;这是因为在组合和配置具体条目时有…

手机谷歌浏览器怎么用

谷歌浏览器不仅在PC端受欢迎&#xff0c;在移动端也是广泛应用的。为了帮助大家更好的理解和使用手机谷歌浏览器&#xff0c;本文将详细介绍如何使用手机谷歌浏览器&#xff0c;对这款浏览器感到陌生的话就快快学起来吧。&#xff08;本文由https://chrome.cmrrs.com/站点的作者…

动手学深度学习7.6 残差网络(ResNet)-笔记练习(PyTorch)

本节课程地址&#xff1a;29 残差网络 ResNet【动手学深度学习v2】_哔哩哔哩_bilibili 29.2 ResNet为什么能训练出1000层的模型【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;7.6. 残差网络&#xff08;ResNet&#xff09; — 动手学深度学习 2.0.0 docume…

制造企业MES系统质检管理的应用

MES系统在质检管理中的作用 MES系统通过集成生产过程中的各个环节&#xff0c;实现对产品质量的全面监控和管理。其在质检管理中的作用主要体现在以下几个方面&#xff1a; 1. 实时数据采集&#xff1a;MES系统能够实时收集生产线上的质量数据&#xff0c;包括但不限于产品尺…

知识改变命运 数据结构【栈和队列面试题】

1.最小栈 class MinStack {Stack <Integer>stack;Stack <Integer>minStack; public MinStack() {stacknew Stack<>();minStacknew Stack<>();}public void push(int val) {stack.push(val);if(minStack.empty()) {minStack.push(val);} else {int top…

汇昌联信科技做拼多多电商怎么提升浏览量?

随着电子商务的蓬勃发展&#xff0c;各大平台之间的竞争变得日益激烈。在这样的背景下&#xff0c;汇昌联信科技如何通过有效的策略来提升其在拼多多平台上的店铺浏览量&#xff0c;成为了一个值得深入探讨的问题。提升浏览量不仅能够增加商品的曝光率&#xff0c;还能有效提高…

【设计模式】六大原则-下

❓首先什么是设计模式&#xff1f; &#x1f635;相信刚上大学的你和我一样&#xff0c;在学习这门课的时候根本不了解这些设计原则和模式有什么用处&#xff0c;反而不如隔壁的C更有意思&#xff0c;至少还能弹出一个小黑框&#xff0c;给我个hello world。 ✨ 如何你和我一样…

【python报错】‘XXX‘ object is not callable

‘XXX‘ object is not callable----这个报错通常是因为在代码中某一个变量的名字和函数的名字重复导致的&#xff0c;此时需要确定名称使用是否正确&#xff0c;如果重复则需要修改其中一个名字&#xff1b;如果名字没有问题&#xff0c;那就要看表达式写的对不对&#xff0c;…

使用 Lombok 遇到一个问题

起因是换了一个电脑&#xff0c;重新从服务器上拉了一个项目。项目是由maven构建的&#xff0c;在控制台中使用mvn命令编译项目时&#xff0c;没有任何问题&#xff0c;编译成功。如下图&#xff1a; 可是idea里面的源码&#xff0c;却标红了&#xff0c;如下&#xff1a; 错误…

猫咪掉毛很烦恼,希喂、小米哪个牌子的宠物空气净化器更好用?

随着养宠物人群变多&#xff0c;现在打着宠物专用旗号的空气净化器也越来越多&#xff0c;但是很多空气净化器对宠物的效果&#xff0c;真的是只有宣传上和宠物有关&#xff0c;实际设计和效果上和宠物毫无关系。需要大家擦亮眼睛&#xff0c;多做功课&#xff0c;才能不被那些…

如何在前端测试中,在F12中加入token

不止是token&#xff0c;cookie中其他的数据也都可以这样 首先打开F12&#xff0c;然后找到Application或者应用程序 然后找到cookie里面双击这里&#xff0c;输入token或者其他数据就可以了&#xff0c;后面输值。

网络安全术语全解析:筑牢数字防线的必备知识

在当今数字化时代&#xff0c;网络安全成为了至关重要的议题。了解网络安全术语是构建安全网络环境的基础&#xff0c;本文将为你详细介绍一系列常见的网络安全术语。 一、攻击相关术语 1. 恶意软件&#xff08;Malware&#xff09; 恶意软件是指在计算机系统上执行恶意任务…

操作系统简介:存储管理

存储管理 1. 基本概念2. 存储管理方案2.1 分区存储管理2.2 分页存储管理2.3 分段存储管理2.4 虚拟存储管理页面置换算法 存储器管理的对象是主存储器(主存、内存)。存储管理的主要功能包括 分配和回收主存空间、提高主存的利用率、扩充主存、对主存信息实现有效保护。 1. 基本…

【机器学习】探索机器学习在旅游业的革新之旅

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习在旅游需求分析中的应用&#x1f31e;用户行为数据分析&#x1f319;旅客偏好预测模型⭐…

【Spring】为什么不建议使用@Autowired

【Spring】为什么不建议使用Autowired 开篇词&#xff1a;干货篇&#xff1a;1.知识回顾2.Autowired和其他注入方式的对比1.Autowired 注入&#xff08;字段注入&#xff09;2.构造器注入3.Setter 方法注入 3.为什么spring官方不推荐使用1. 违反封装原则2. 依赖关系不明确3. 难…

yolo V8训练 长条状目标

1、说明 目标数据集合中有很多长条状图片&#xff0c;如果直接Resize 会严重拉伸&#xff0c;因此采用把长条图像裁剪成2段&#xff0c;然后将裁剪后的2段图片拼接在一起。 2、代码 2.1 C 代码 &#xff08;部署&#xff0c;模型推理时C &#xff09; #include <stdio.h…

讯飞星火极速超拟人交互技术:语音端到端,8 月底开放;昆仑万维发布 AI 短剧平台 SkyReels丨RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…