vue-生命周期+工程化开发(三)

生命周期

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

思考:

  • 什么时候可以发送初始化渲染请求?(越早越好)
  • 什么时候可以开始操作dom?(至少dom得渲染出来)

Vue生命周期:一个Vue实例从 创建销毁 的整个过程。

生命周期四个阶段:① 创建 (初始化动态数据)② 挂载 (渲染模板)③ 更新 ④ 销毁

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

Vue生命周期过程中,会自动运行一些函数,被称为【生命周期钩子】→ 让开发者可以在【特定阶段】运行自己的代码。

 

 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><h3>{{ title }}</h3><div><button @click="count--">-</button><span>{{ count }}</span><button @click="count++">+</button></div></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {count: 100,title: '计数器'},// 1. 创建阶段(准备数据)beforeCreate () {console.log('beforeCreate 响应式数据准备好之前', this.count)},created () {console.log('created 响应式数据准备好之后', this.count)// this.数据名 = 请求回来的数据// 可以开始发送初始化渲染的请求了},// 2. 挂载阶段(渲染模板)beforeMount () {console.log('beforeMount 模板渲染之前', document.querySelector('h3').innerHTML)},mounted () {console.log('mounted 模板渲染之后', document.querySelector('h3').innerHTML)// 可以开始操作dom了},// 3. 更新阶段(修改数据 → 更新视图)beforeUpdate () {console.log('beforeUpdate 数据修改了,视图还没更新', document.querySelector('span').innerHTML)},updated () {console.log('updated 数据修改了,视图已经更新', document.querySelector('span').innerHTML)},// 4. 卸载阶段beforeDestroy () {console.log('beforeDestroy, 卸载前')console.log('清除掉一些Vue以外的资源占用,定时器,延时器...')},destroyed () {console.log('destroyed,卸载后')}})</script>
</body>
</html>

 小黑记账清单

功能需求:

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 --><linkrel="stylesheet"href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"/><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" v-model="name" class="form-control" placeholder="消费名称" /><input type="text" v-model.number="price" class="form-control" placeholder="消费价格" /><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 list" :key="item.id"><td>{{index+1}}</td><td>{{item.name}}</td><td :class="{ red: item.price>500}">{{item.price}}</td><td><a href="javascript:;" @click="del(item.id)">删除</a></td></tr></tbody><tfoot><tr><td colspan="4" class="red">消费总计: {{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. 基本渲染* 2. 添加功能* 3. 删除功能* 4. 饼图渲染*/const app = new Vue({el: '#app',data: {list: [],name: '',price: null},computed: {totalPrice(){let total = this.list.reduce((sum,item)=>sum+item.price,0)return total}},methods: {async getList(){// 使用ajax发送请求const res = await axios.get('https://applet-base-api-t.itheima.net/bill',{params: {creator: 'jack'}})// console.log(res);this.list=res.data.data// console.log(this.list);//更新图表this.Chars.setOption({series: [{// data: [//   { value: 1048, name: 'Search Engine' },//   { value: 735, name: 'Direct' },//   { value: 580, name: 'Email' },//   { value: 484, name: 'Union Ads' },//   { value: 300, name: 'Video Ads' }// ]data: this.list.map(item=>{//返回一个对象return {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: 'jack',name: this.name,price: this.price})//重新渲染this.getList()//重置输入框this.name = ''this.price = null},async del(id){const res = await axios.delete(`https://applet-base-api-t.itheima.net/bill/${id}`)//重新渲染this.getList()}},// 在数据动态化后执行的钩子函数created(){//数据出初始化完成后,获取数据this.getList()},//在视图渲染完成后执行mounted(){//初始化echarts对象this.Chars = echarts.init(document.querySelector('#main'))this.Chars.setOption({// 标题title: {text: '消费账单列表',left: 'center'},// tooltip: {trigger: 'item'},// 小图标legend: {orient: 'vertical',left: 'left'},series: [{name: '消费账单',type: 'pie',radius: '50%',data: [{ value: 1048, name: 'Search Engine' },{ value: 735, name: 'Direct' },{ value: 580, name: 'Email' },{ value: 484, name: 'Union Ads' },{ value: 300, name: 'Video Ads' }],emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}}}]})}})</script></body>
</html>

案例总结:

 

工程化开发入门

开发 Vue 的两种方式:

1. 核心包传统开发模式:基于 html / css / js 文件,直接引入核心包,开发 Vue。

2. 工程化开发模式:基于构建工具(例如:webpack ) 的环境中开发 Vue

工程化开发 & 脚手架 Vue CLI 

基本介绍:

Vue CLI 是 Vue 官方提供的一个全局命令工具

可以帮助我们快速创建一个开发 Vue 项目的标准化基础架子。【集成了 webpack 配置】

好处:

1. 开箱即用,零配置
2. 内置 babel 等工具
3. 标准化

使用步骤:

1. 全局安装 (一次) :yarn global add @vue/cli 或 npm i @vue/cli -g
2. 查看 Vue 版本:vue --version
3. 创建项目架子:vue create project-name(项目名-不能用中文)
4. 启动项目: yarn serve 或 npm run serve(找package.json)

脚手架目录文件介绍 & 项目运行流程

 

 

组件化开发 & 根组件 

① 组件化:一个页面可以拆分成一个个组件,每个组件有着自己独立的结构、样式、行为。 好处:便于维护,利于复用 → 提升开发效率

组件分类:普通组件、根组件。

② 根组件:整个应用最上层的组件,包裹所有普通小组件。

 

App.vue 文件(单文件组件)的三个组成部分 

 普通组件的注册使用

组件注册的两种方式:
1. 局部注册:只能在注册的组件内使用
    ① 创建 .vue 文件 (三个组成部分)
    ② 在使用的组件内导入并注册
2. 全局注册:所有组件内都能使用

局部注册

 全局注册

小结:

(1) 组件化:
页面可拆分成一个个组件,每个组件有着独立的结构、样式、行为
     ① 好处:便于维护,利于复用 → 提升开发效率。
     ② 组件分类:普通组件、根组件

(2) 根组件:
整个应用最上层的组件,包裹所有普通小组件。
一个根组件App.vue,包含的三个部分:
        ① template 结构 (只能有一个根节点)
        ② style 样式 (可以支持less,需要装包 less 和 less-loader )
        ③ script 行为 

 两种注册方式:
         ① 局部注册:
                (1) 创建.vue组件 (单文件组件)
                (2) 使用的组件内导入,并局部注册 components: { 组件名:组件对象 }
        ② 全局注册
                (1) 创建.vue组件 (单文件组件)
                (2) main.js内导入,并全局注册 Vue.component(组件名, 组件对象)
 使用:
<组件名></组件名>
技巧:
一般都用局部注册,如果发现确实是通用组件,再抽离到全局。

综合案例:小兔鲜首页

 

页面开发思路:

1. 分析页面,按模块拆分组件,搭架子 (局部或全局注册)

2. 根据设计图,编写组件 html 结构 css 样式 (已准备好)

3. 拆分封装通用小组件 (局部或全局注册)

将来 → 通过 js 动态渲染,实现功能 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#入门及进阶|数组和集合(六):集合概述

1.集合概述 数组是一组具有相同名称和类型的变量集合&#xff0c;但是数组初始化后就不便于再改变其大小&#xff0c;不能实现在程序中动态添加和删除数组元素&#xff0c;使数组的使用具有很多局限性。集合能解决数组存在的这个问题&#xff0c;下面我们来学习介绍集合…

【DDD】学习笔记-精炼领域分析模型

通过统一语言与“名词动词法”可以迫使团队研究问题域的词汇表&#xff0c;简单而快速地帮助我们获得初步的分析模型。但是这种方法获得的模型品质&#xff0c;受限于语言描述的写作技巧&#xff0c;统一语言的描述更多体现在是对现实世界的模型描述&#xff0c;缺乏深入精准的…

2013-2022年上市公司迪博内部控制指数、内部控制分项指数数据

2013-2022年上市公司迪博内部控制指数、分项指数数据 1、时间&#xff1a;2013-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、辖区、证监会行业、申万行业、内部控制指数、战略层级指数、经营层级指数、报告可靠指数、合法合规指数、资产安全…

VTK 三维场景的基本要素(相机) vtkCamera

观众的眼睛好比三维渲染场景中的相机&#xff0c;在VTK中用vtkCamera类来表示。vtkCamera负责把三维场景投影到二维平面&#xff0c;如屏幕&#xff0c;相机投影示意图如下图所示。 1.与相机投影相关的要素主要有如下几个&#xff1a; 1&#xff09;相机位置: 相机所处的位置…

图像处理之《隐写网络的隐写术》论文阅读

一、文章摘要 隐写术是一种在双方之间进行秘密通信的技术。随着深度神经网络(DNN)的快速发展&#xff0c;近年来越来越多的隐写网络被提出&#xff0c;并显示出良好的性能。与传统的手工隐写工具不同&#xff0c;隐写网络的规模相对较大。如何在公共信道上秘密传输隐写网络引起…

分享一款让新手快速学习编程及教学的工具

文章目录 一、Flowgorithm 是什么二、为什么需要Flowgorithm三、Flowgorithm 的应用场景四、Flowgorithm的特点五、Flowgorithm下载与安装六、Flowgorithm 的使用1、聊天风格控制台2、绘图3、调试条件断点4、交互式生成真实代码5、多语言支持6、可定制的配色方案7、多种颜色皮肤…

论文阅读-One for All : 动态多租户边缘云平台的统一工作负载预测

论文名称&#xff1a;One for All: Unified Workload Prediction for Dynamic Multi-tenant Edge Cloud Platforms 摘要 多租户边缘云平台中的工作负载预测对于高效的应用部署和资源供给至关重要。然而&#xff0c;在多租户边缘云平台中&#xff0c;异构的应用模式、可变的基…

CentOS在VMWare中扩容

1.相关概念 物理卷&#xff1a;简称PV&#xff0c;逻辑卷管理中处于最底层&#xff0c;它可以是实际物理硬盘上的分区&#xff0c;也可以是整个物理硬盘&#xff0c;一块硬盘&#xff0c;或多块硬盘&#xff0c;如/dev/sdb。 卷组&#xff1a;简称VG&#xff0c;建立在物理卷之…

【Redis快速入门】初识Redis、Redis安装、图形化界面

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

图片懒加载:从低像素预览到高清加载

老生常谈的问题&#xff0c;图片太多太大的网站&#xff0c;往往由于图片加载过慢而导致页面白屏时间过长。本次年前最后一更&#xff0c;来讲一个加载方法来处理这种情况。 在使用 Next.js 时&#xff0c;发现其支持模糊图片占位符加载的方式&#xff0c;本文就手动实现一个 图…

Microsoft OneNote 图片文字提取

Microsoft OneNote 图片文字提取 1. 文件 -> 新建 -> 我的电脑 -> 名称 -> 位置 -> 创建笔记本2. 插入图片​​​3. 复制图片中的文本References 1. 文件 -> 新建 -> 我的电脑 -> 名称 -> 位置 -> 创建笔记本 ​ 2. 插入图片 ​​​3. 复制图片…

监测Nginx访问日志502情况后并做相应动作

今天带大家写一个比较实用的脚本哈 原理&#xff1a; 假设服务器环境为lnmp&#xff0c;近期访问经常出现502现象&#xff0c;且502错误在重启php-fpm服务后消失&#xff0c;因此需要编写监控脚本&#xff0c;一旦出现502&#xff0c;则自动重启php-fpm服务 场景&#xff1a; 1…