Vue生命周期;综合案例;工程化开发入门

Vue的生命周期 和 生命周期的四个阶段

思考:
什么时候可以发送初始化渲染请求?(越早越好:最早可以早到什么时候?)
什么时候可以开始操作dom?(至少dom得渲染出来)
Vue生命周期:一个Vue实例从***创建***到***销毁***的整个过程

new Vue( ) ①创建(生命就开始了)→②挂载→③更新→④销毁(比如网页被关掉)
①创建阶段(响应式处理):将普通数据转换成响应式数据:data其实是普通数据,但是在Vue在底层创建阶段的时候。就会对下面的普通数据来做一些响应式的处理,只有经过这一步,我们在后来修改数据的时候,才会响应式的更新

②挂载阶段(渲染模板):结合对应的数据(比如:data中的count)和模板(比如:div)做渲染了,最后在界面中看到解构
③更新阶段(修改数据,更新视图:比如点了➕号,100变成101,及视图更改了)
④销毁阶段(销毁实例)
综上可知
发请求最早是在响应式数据准备好,才能发请求
要等模板渲染完成(挂载阶段完成),才可以操作dom

Vue生命周期函数(钩子函数)

vue生命周期过程中,会自动运行一些函数,被称为【生命周期钩子】 → 让开发者可以在【特定阶段】运行自己的代码
在这里插入图片描述
每一个钩子可以用一段自己的代码,到下一个阶段就用别的代码
有八个钩子(四队):

1.数据准备之前和之后
2.dom挂在渲染之前和hi好之后
3.在修改了数据、视图更新之前和之后
4. 销毁实例阶段的之前和之后
在这里插入图片描述
**目前需要记住:created 和 mounted **
1.created:发送初始化渲染的请求
2.mounted:操作dom

在这里插入图片描述

created的应用

有一个新闻列表,需要已进入页面立刻发送请求(created),获取对应的数据渲染出来
在这里插入图片描述
通过下面的代码获取以上展示的数据👇

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script>
        //请求方式:get
        const app = new Vue({
            el:'#app',
            data:{
                list:[

                ]
            },
            async created(){
                //1.请求发送,获取数据
                const res = await axios.get('http://hmajax.itheima.net/api/news')
                // console.log(res)
                //2.将数据更新给data中的list
                this.list = res.data.data
            }
        })
    </script>

如下图显示,获取成功
在这里插入图片描述
如下图可以看见数据中的内容及标签
在这里插入图片描述
然后在代码中让他动态渲染👇

<div id="app">
        <ul>
            <li v-for="(item,index) in list" :key="item.id" class="news">
                <div class="left">
                    <div class="title">{{ item.title }}</div>
                    <div class="info">
                        <span>{{ item.sorce }}</span>
                        <span>{{ item.time }}</span>
                    </div>
                </div>
                <div class="right">
                    <img :src="item.img" alt="">
                </div>
            </li>
        </ul>
    </div>

mounted的应用

有一个搜索功能:一进入页面,立刻能够获取焦点(就是光标显示),要在模板渲染完成后开始操作,即操作dom。和data并列,提供一个mounted


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>mounted.DOM操作.搜索框焦点</title>
</head>
<body>
    <div class="search-container">
        <img src="./火龙果.png" alt="">
        <div class="search-box">
            <input type="text" v-model="words" id="inp">
            <button>搜索一下</button>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el:'#app',
            data:{
                words:''
            },
            //获取焦点核心思路:
            //1.等输入框渲染出来
            //2.让输入框获取焦点
            mounted(){
                document.querySelector('#inp').focus()
            }
        })
    </script>
</body>
</html>

其中focus是原生dom中的用法

Vue生命周期总结图

在这里插入图片描述

综合案例:记账清单

在这里插入图片描述

功能需求
1.基本渲染
2.添加功能
3.删除功能
4.饼图渲染

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

          <!-- 添加资产 -->
          <form class="my-form">
            <input v-model.trim="name" type="text" class="form-control" placeholder="消费名称" />
            <input v-model.number="price" type="text" class="form-control" placeholder="消费价格" />
            <button @click="add" 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 v-for="(item, index) in list" :key="item.id">
                <td>{{ index + 1 }}</td>
                <td>{{ item.name }}</td>
                <td :class="{ red: item.price > 500 }">{{ item.price.toFixed(2) }}</td>
                <td><a @click="del(item.id)" href="javascript:;">删除</a></td>
              </tr>
            </tbody>
            <tfoot>
              <tr>
                <td colspan="4">消费总计: {{ totalPrice.toFixed(2) }}</td>
              </tr>
            </tfoot>
          </table>
        </div>
        
        <!-- 右侧图表 -->
        <div class="echarts-box" id="main"></div>
      </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script>
      
        // 接口文档地址:
        // https://www.apifox.cn/apidoc/shared-24459455-ebb1-4fdc-8df8-0aff8dc317a8/api-53371058
        
        // 功能需求:
        // 1. 基本渲染
        //    (1) 立刻发送请求获取数据 created
        //    (2) 拿到数据,存到data的响应式数据中
        //    (3) 结合数据,进行渲染 v-for
        //    (4) 消费统计 => 计算属性
        // 2. 添加功能
        //    (1) 收集表单数据 v-model
        //    (2) 给添加按钮注册点击事件,发送添加请求
        //    (3) 需要重新渲染
        // 3. 删除功能
        //    (1) 注册点击事件,传参传 id
        //    (2) 根据 id 发送删除请求
        //    (3) 需要重新渲染
        // 4. 饼图渲染
        //    (1) 初始化一个饼图 echarts.init(dom)  mounted钩子实现
        //    (2) 根据数据实时更新饼图 echarts.setOption({ ... })
       
      const app = new Vue({
        el: '#app',
        data: {
          list: [],
          name: '',
          price: ''
        },
        computed: {
          totalPrice () {
            return this.list.reduce((sum, item) => sum + item.price, 0)
          }
        },
        created () {
          // const res = await axios.get('https://applet-base-api-t.itheima.net/bill', {
          //   params: {
          //     creator: '小黑'
          //   }
          // })
          // this.list = res.data.data

          this.getList()
        },
        mounted () {
          this.myChart = echarts.init(document.querySelector('#main'))
          this.myChart.setOption({
            // 大标题
            title: {
              text: '消费账单列表',
              left: 'center'
            },
            // 提示框
            tooltip: {
              trigger: 'item'
            },
            // 图例
            legend: {
              orient: 'vertical',
              left: 'left'
            },
            // 数据项
            series: [
              {
                name: '消费账单',
                type: 'pie',
                radius: '50%', // 半径
                data: [
                  // { value: 1048, name: '球鞋' },
                  // { value: 735, name: '防晒霜' }
                ],
                emphasis: {
                  itemStyle: {
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                  }
                }
              }
            ]
          })
        },

        methods: {
          async getList () {
            const res = await axios.get('https://applet-base-api-t.itheima.net/bill', {
              params: {
                creator: '小黑',
              }
            })
            this.list = res.data.data

            // 更新图表
            this.myChart.setOption({//这里面所有传过的数据都不需要再传了
              // 数据项
              series: [
                {
                  // data: [
                  //   { value: 1048, name: '球鞋' },
                  //   { value: 735, name: '防晒霜' }
                  // ]
                  data: this.list.map(item => ({ value: item.price, name: item.name}))//要加括号,告诉他是个对象,不然他会识别成代码段
                }
              ]
            })
          },
          async add () {
            if (!this.name) {
              alert('请输入消费名称')
              return
            }
            if (typeof this.price !== 'number') {
              alert('请输入正确的消费价格')
              return
            }

            // 发送添加请求
            const res = await axios.post('https://applet-base-api-t.itheima.net/bill', {
              creator: '小黑',
              name: this.name,
              price: this.price
            })
            // 重新渲染一次
            this.getList()

            this.name = ''
            this.price = ''
          },
          async del (id) {
            // 根据 id 发送删除请求
            const res = await axios.delete(`https://applet-base-api-t.itheima.net/bill/${id}`)
            // 重新渲染
            this.getList()
          }
        }
      })
    </script>
  </body>
</html>

其中用到了ECharts初始化饼图,但是必须要给它一个dom才可以
在这里插入图片描述

工程化开发和手脚架(那个管理员的程序目前没下好,下不了,只能先截图了,到后面下好了再改)

工程化开发 & 手脚架 Vue CLI
在这里插入图片描述
重点看:
index.html
App.vue
main.js
在做项目时,养成一个习惯,直接把整个文件作为根目录,往vscode中拖

1.index.html 中,有一个< noscript>标签,是做兼容的:给不支持js的浏览器一个提示

2.其中的 < div id=“app”>< /div> :在工程化开发模式种:这里不再直接编写模板语法了。而是通过App.vue 提供结构渲染

3.main.js的核心作用:导入App.vue,基于App.vue创建结构渲染index.html
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】C++入门(一)

个人主页 &#xff1a; zxctsclrjjjcph 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. C关键字3. 命名空间3.1 命名空间定义3.2 命名空间的使用 4. C输入&输出 1. 前言 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0…

4G物联网LED智慧路灯杆显示屏产品介绍

4GLED显示屏是一种具有4G网络连接功能的LED显示屏。它可以通过4G网络连接到互联网&#xff0c;实现远程管理和控制&#xff0c;方便进行内容更新和管理。同时&#xff0c;4GLED显示屏具有高亮度、高清晰度和高对比度的特点&#xff0c;可以提供清晰明亮的图像和视频展示效果。它…

【前端小点】Vue3中的IP输入框组件

本文章记录,如何在vue3项目开发中,使用ip输入框组件. 之前写过vue2版本的ip组件,为了更好的适应vue3,此次进行vue3代码重写 先上效果图: 禁用效果图: 主要是组件的开发,代码如下,可直接拷贝使用. 大概思路就是: 使用四个输入框拼接,然后给输入内容添加校验操作,添加光标移动,…

灵眸边缘计算产品学习

EASY EAI灵眸科技 | 让边缘AI落地更简单 (easy-eai.com) 产品简介 支持4路1080P30fps视频流采集&#xff0c;四核CPU1.5GHz与2Tops AI边缘算力能力。集成有以太网、Wi-Fi、4G等网络通信外设&#xff1b;RS232、RS485、UART等本地通信接口。HDMI显示屏接口、音频输入输出等交互…

ntp时间适配服务器和ssh免密登录

1&#xff0e;配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 服务端server向阿里时间服务器进行时间同步 第一步&#xff1a;定位服务端server #安装软件 [rootserver ~]# yum install chrony -y # 编辑配置文件&#xff0c;定位第3行&#xff0c;修改…

小程序直播项目搭建

项目功能&#xff1a; 登录实时聊天点赞功能刷礼物取消关注用户卡片直播带货优惠券直播功能 项目启动&#xff1a; 1 小程序项目创建与配置&#xff1a; 第一步 需要登录小程序公众平台的设置页面进行配置&#xff1a; 首先需要是企业注册的才可以个人不能开通直播功能。服务类…

动态gif图怎么在线做?简单三步快速上手

使用gif动态图片能够增加图片的吸引力和趣味性&#xff0c;在很多社交平台上gif动态都是用来表达自己的心情的。而且&#xff0c;gif动图可以用于创意设计和艺术制作的宣传等。那么&#xff0c;要怎么制作呢&#xff1f;这时候使用gif制作&#xff08;https://www.gif.cn/&…

【学网攻】 第(6)节 -- 三层交换机实现VLAN间路由

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan【学网攻】 第(5)节 -- Cisco VTP的使用 前言 第5章给大家讲了VTP,也是为这节课铺垫,带领大家慢慢进入路由的区…

安全基础~通用漏洞2

文章目录 知识补充盲注Boolean盲注延时盲注报错注入二次注入 知识补充 盲注常用 if(条件,5,0) #条件成立 返回5 反之 返回0 left(database(),1)&#xff0c;database() #left(a,b)从左侧截取a的前b位 盲注 盲注就是在注入过程中&#xff0c;获取的数据不能回显至前端页面。 …

vivado: 设置里配置改了之后,总是在下次重启时重置的解决

我以前改字体大小&#xff0c;和改notepad编辑器都遇到&#xff0c;下一次打开就又是默认配置 解决&#xff1a; 1. c盘路径下&#xff0c;找到这个.xml文件&#xff0c;用记事本打开 2. 直接拉到记事本最后&#xff0c;我圈起来这里的路径不能有中文&#xff0c;所以要去把…

C++面试宝典第24题:袋鼠过河

题目 一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子。每隔一米就有一个桩子,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳得更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米;如果为0,就会陷进去无法…

【GitHub项目推荐--人脸识别】【转载】

01 带有移动应用程序的人脸识别库 OpenFace 作为用于人脸识别的通用库&#xff0c;能够实现瞬态和移动人脸识别&#xff0c;目前在 GitHub 上斩获 14291 Star。以下为 LFW 数据集 Sylvestor Stallone 输入单个图像的流程。 项目地址&#xff1a;https://github.com/cmusatya…

【zlm】针对单个设备的码率的设置

目录 代码修改 实验数据一 实验数据二 同时拉一路视频后 修改记录 使用方法 各库实操 代码修改 要被子类引用 &#xff0c;所以放在protected 不能放private 下面的结论&#xff0c;可以在下面的实验数据里引用。“同时拉一路视频后” 实验数据一 https://10.60.3.45:1…

【ZYNQ入门】第十篇、基于FPGA的图像白平衡算法实现

目录 第一部分、关于白平衡的知识 1、MATLAB 自动白平衡算法的实现 1.1、matlab代码 1.2、测试效果 1.3 测试源图 2、为什么摄像头采集的图像要做白平衡 3、自动白平衡算法总结 4、FPGA设计思路 4.1、实时白平衡的实现 4.2、计算流程优化思路 第二部分、硬件实…

机器学习之numpy库

机器学习之numpy库 numpy库概述numpy库历史numpy的核心numpy基础ndarray数组内存中的ndarray对象ndarray数组对象的特点ndarray数组对象的创建ndarray对象属性的基本操作数组的维度元素的类型数组元素的个数数组元素索引(下标) ndarray对象数组的自定义类型切片操作一维数组切片…

后端开发_单元测试

后端开发_单元测试 1. 简介2. JUnit 4使用方法2.1 jar包引入2.2 测试用例1. 简介 2. JUnit 4使用方法 2.1 jar包引入 1. 本地依赖引入方式 Junit4.jar包 2. maven方式引入jar <dep

AMIS的组件学习使用

部分代码片段 {"id": "filterForm","className": " xysd-zbkb-pubquery","labelWidth": 130,"body": [{"type": "grid","className": "xysd-grid-query-input","c…

多协议转BACnet网关BA110

随着通讯技术和控制技术的发展&#xff0c;为了实现楼宇的高效、智能化管理&#xff0c;集中监控管理已成为楼宇智能管理发展的必然趋势。在此背景下&#xff0c;高性能的楼宇暖通数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于楼宇自控和暖通空调系统应用中…

【SGX系列教程】(一)Intel-SGX SDK在ubuntu22.04下安装全流程

文章目录 一.概述1.1 SGX三大组件1.2 SGXDataCenterAttestationPrimitives 二.安装流程2.1 检查服务器是否支持SGX2.2 sgx硬件/软件开启方法2.3 sgx dirver驱动安装&#xff1b;2.3.1 linux-sgx-driver驱动程序2.3.2 Intel SGX Support in the Linux Kernel&#xff08;linux内…

第11次修改了可删除可持久保存的前端html备忘录:将样式分离,可以自由秒添加秒删除样式

第11次修改了可删除可持久保存的前端html备忘录&#xff1a;将样式分离&#xff0c;可以自由秒添加秒删除样式 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"…