Vue [Day3]

Vue生命周期

生命周期四个阶段

在这里插入图片描述

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

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<script src="../vue.js"></script>
<link rel="stylesheet" href="../base.css">
<style></style><body><div id="app"><h3>{{title}}</h3><button @click="count++">+</button>{{count}}<button @click="count--">-</button></div>
</body>
<script>const app = new Vue({el: '#app',data: {count: 100,title: '计数器'},// 1.创建阶段(准备数据)beforeCreate() {console.log(' beforeCreate 响应式数据准备好之前');},created() {console.log(' created 响应式数据准备好之后');// 可以开始发送初始化渲染的请求了   this.数据名=请求回来的数据},// 2.挂载阶段(渲染模板)beforeMount() {console.log(' beforeMount 模板渲染之前');},mounted() {console.log(' mounted 模板渲染之后');// 可以开始操作dom},})
</script></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>
</head>
<script src="../vue.js"></script>
<link rel="stylesheet" href="../base.css">
<style>#app {margin: 50px 50px;display: flex;width: 900px;height: 300px;}.left {flex: 1;}.right {flex: 1;background-color: #864343;}table {width: 400px;margin-top: 20px;text-align: center;border: 1px solid black;border-spacing: 0;}td,th {border-bottom: 1px solid black;}/* 超过500元 高亮 */.red {color: red;}
</style><body><div id="app"><div class="left"><div class="head"><!-- 不用加{{}} v-model="{{name}}" 这样写是错的--><input v-model.trim="name" type="text" placeholder="消费名称"><input v-model="price" type="text" placeholder="消费价格"><button @click="add"> 添加账单</button></div><!-- 表单;账单主体 --><table><thead><tr><th>编号</th><th>消费名称</th><th>消费价格</th><th>操作</th></tr></thead><tbody v-if="list.length>0"><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="#" style="color:blue">删除</a></td></tr></tbody><tbody v-else><tr><td colspan="4"></td></tr></tbody><tfoot><tr><td colspan="4">总计:{{totalPrice.toFixed(2)}}</td></tr></tfoot></table></div><div class="right"></div></div>
</body>
<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: [//     { id: 1, name: '衣服', price: 130 },//     { id: 2, name: '零食', price: 30 },//     { id: 3, name: '娱乐', price: 90 },// ]// 所以,直接定义就行了,具体的值后面赋list: [],name: '',price: ''},created() {// const res = await axios.get('https://applet-base-api-t.itheima.net/bill', {//     params: {//         creator: 'slx'//     }// })// // console.log(res.data);// this.list = res.data.data// 一进页面就调用this.getList()},mounted() {this.myChart = echarts.init(document.querySelector('.right'))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: '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)'}}}]})},computed: {totalPrice() {return this.list.reduce((sum, item) => sum += item.price, 0)}},methods: {// 封装成函数,每次都要渲染async getList() {const res = await axios.get('https://applet-base-api-t.itheima.net/bill', {params: {creator: 'slx'}})// console.log(res.data);this.list = res.data.datathis.myChart.setOption({series: [{// data: [// { value: 1048, name: 'Search Engine' },// { value: 735, name: 'Direct' },// ],//                         ()必须加,不然会以为是代码段data: this.list.map(item => ({ value: item.price, name: item.name }))}]})},async add() {// if (parseFloat(this.price) == 'NaN') {//     console.log('NAN!!!!!');// 好吧,小知识点不会,在JavaScript中,NaN是一个特殊的值,表示不是一个有效的数字。然而,NaN与任何其他值(包括NaN本身)进行相等比较时都会返回false。所以,使用==或===运算符将parseFloat(this.price)与字符串’NaN’进行比较,结果永远是false。// 为了判断parseFloat(this.price)是否为NaN,你可以使用全局的isNaN()函数来进行判断。// }if (!this.name) {alter('请输入消费名称')return}// 我觉得他这个不全,要是用户输入12.396.353.3也还是不报错,所以就自己手动加判断了// if (typeof this.price != 'number') {//     alert('请输入正确的数字')//     return// }let ch = '.'let count = this.price.split(ch).length - 1;if (count > 1) {alert('请输入正确的数字')return}if (isNaN(parseFloat(this.price))) {console.log('NAN');alert('请输入正确的数字')return}else {this.price = parseFloat(this.price)}const res = await axios.post('https://applet-base-api-t.itheima.net/bill', {// data: {   post不用写这个creator: 'slx',name: this.name,price: this.price// }})console.log(res);this.getList()// 输入后清空this.name = ''this.price = ''},async del(tt) {// 注意这个的写法,``  $const res = await axios.delete(`https://applet-base-api-t.itheima.net/bill/${tt}`)// console.log(res);this.getList()}},}) 
</script></html>

工程化开发 & 脚手架 Vue CLI

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述



main.js

// 文件核心作用:导入App.vue,基于App.vue创建结构渲染index.html
// 1. 导入 Vue 核心包
import Vue from 'vue'// 2. 导入 App.vue 根组件
import App from './App.vue'// 提示:当前处于什么环境 (生产环境 / 开发环境)
Vue.config.productionTip = false// 3. Vue实例化,提供render方法 → 基于App.vue创建结构渲染index.html
new Vue({// el: '#app', 作用:和$mount('选择器')作用一致,用于指定Vue所管理容器// render: h => h(App),render: (createElement) => {// 基于App创建元素结构return createElement(App)}
}).$mount('#app')


组件化开发 & 根组件

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


App.vue

<template><div class="App"><div class="box" @click="fn"></div></div>
</template><script>
// 导出的是当前组件的配置项
// 里面可以提供 data(特殊) methods computed watch 生命周期八大钩子
export default {created () {console.log('我是created')},methods: {fn () {alert('你好')}}
}
</script><style lang="less">
/* 让style支持less1. 给style加上 lang="less"2. 安装依赖包 less less-loaderyarn add less less-loader -D (开发依赖)
*/
.App {width: 400px;height: 400px;background-color: pink;.box {width: 100px;height: 100px;background-color: skyblue;}
}
</style>


普通组件的注册使用

在这里插入图片描述

局部注册

App.vue

<template><div class="hm-header">我是hm-header</div>
</template><script>
export default {}
</script><style>
.hm-header{height: 100px;line-height: 100px;text-align: center;font-size: 30px;background-color: #cdcf48;
}
</style>

components/HmFooter.vue

<template><div class="App"><!-- 使用,直接当成html标签使用 -->
<!-- 组件命名规范,大驼峰命名法 --><!-- 头部组件 -->
<HmHeader></HmHeader>  <!-- 主体组件 -->
<HmMain></HmMain><!-- 底部组件 -->
<HmFooter></HmFooter></div>
</template><script>
// 导入
import HmFooter from './components/HmFooter.vue';
import HmHeader from './components/HmHeader.vue';
import HmMain from './components/HmMain.vue';export default {// 局部注册
components:{// '组件名':'组件对象HmHeader:HmHeader,HmFooter,// 同名可简写HmMain,
}
}
</script><style>
.App{width: 600px;height: 700px;background-color:rgb(0, 234, 255);padding: 20px;margin: 0 auto;
}
</style>

全局注册

在这里插入图片描述


HmButton.vue

<template><button class=".hm-button">通用按钮</button>
</template><script>
export default {}
</script><style>
.hm-button{height: 50px;line-height: 50px;padding: 0 20px;background-color: #ca2a50;border-radius: 5px;
}
</style>

main.js

// 文件核心作用:导入App.vue,基于App.vue创建结构渲染index.html
import Vue from 'vue'
import App from './App.vue'// 1.导入的代码,都写在上面,书写规范
import HmButton from './components/HmButton'
Vue.config.productionTip = false// 2.进行全局注册
// Vue.component(组件名,组件注册)
Vue.component('HmButton', HmButton)new Vue({render: (createElement) => {return createElement(App)}
}).$mount('#app')

HmFooter.vue
<template><div class="hm-footer">我是hm-footer<!-- 直接用 --><HmButton></HmButton></div></template><script>export default {}</script><style>.hm-footer{height: 100px;line-height: 100px;text-align: center;font-size: 30px;background-color: #6848cf;}</style>

两种注册方式总结

在这里插入图片描述

【案例】—— 小兔鲜 组件拆分

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Three.js入门

Three.js 介绍 Three.js 是一个开源的应用级 3D JavaScript 库&#xff0c;可以让开发者在网页上创建 3D 体验。Three.js 屏蔽了 WebGL的底层调用细节&#xff0c;让开发者能更快速的进行3D场景效果的开发。 Three.js的开发环境搭建 创建目录并使用npm init -y初始化package…

Containerd容器镜像管理

1. 轻量级容器管理工具 Containerd 2. Containerd的两种安装方式 3. Containerd容器镜像管理 4. Containerd数据持久化和网络管理 1、Containerd镜像管理 1.1 Containerd容器镜像管理命令 docker使用docker images命令管理镜像单机containerd使用ctr images命令管理镜像,con…

无涯教程-Lua - 文件I/O

I/O库用于在Lua中读取和处理文件。 Lua中有两种文件操作&#xff0c;即隐式(Implicit)和显式(Explicit)操作。 对于以下示例&#xff0c;无涯教程将使用例文件test.lua&#xff0c;如下所示。 -- sample test.lua -- sample2 test.lua 一个简单的文件打开操作使用以下语句。…

【C++】STL——list的模拟实现、构造函数、迭代器类的实现、运算符重载、增删查改

文章目录 1.模拟实现list1.1构造函数1.2迭代器类的实现1.3运算符重载1.4增删查改 1.模拟实现list list使用文章 1.1构造函数 析构函数 在定义了一个类模板list时。我们让该类模板包含了一个内部结构体_list_node&#xff0c;用于表示链表的节点。该结构体包含了指向前一个节点…

git之reflog分析

写在前面 本文一起看下reflog命令。 1&#xff1a;场景描述 在开发的过程中&#xff0c;因为修改错误&#xff0c;想要通过git reset命令恢复到之前的某个版本&#xff0c;但是选择提交ID错误&#xff0c;导致多恢复了一个版本&#xff0c;假定&#xff0c;该版本对应的内容…

Springboot部署ELK实战

Springboot部署ELK实战 1、部署docker、docker-compose环境安装docker安装docker-compose 2、搭建elk1、构建目录&&配置文件1、docker-compose.yml 文档2、Kibana.yml3、log-config.conf 2、添加es分词器插件3、启动 3、Springboot项目引入es、logStash配置1、引入依赖…

【新人指南】给新人软件开发工程师的干货建议

在我是新人时&#xff0c;如果有前辈能够指导方向一下&#xff0c;分享一些踩坑经历&#xff0c;或许会让我少走很多弯路&#xff0c;节省更多的学习的成本。 这篇文章根据我多年的工作经验&#xff0c;给新人总结了一些建议&#xff0c;希望对你会有所帮助。 写好注释 没有注…

解决Map修改key的问题

需求 现在返回json数据带有分页的数据&#xff0c;将返回data属性数据变更为content&#xff0c;数据不变&#xff0c;key发生变化 实现1&#xff0c;源数据比较复杂&#xff0c;组装数据比较麻烦 说明&#xff1a;如果使用这种方式完成需求&#xff0c;需要创建对象&#xff0…

C++ 多态 虚函数表

文章目录 简易抽象理解多态多态的具体实现虚函数的定义虚函数的重写重定义&#xff08;隐藏&#xff09;、重载 、重写&#xff08;覆盖&#xff09;区别C11 override 和 final 关键字抽象类的定义接口继承和实现继承多态的原理&#xff1a;虚函数表单继承和多继承关系的虚函数…

Flask项目打包为exe(附带项目资源,静态文件)

1.在项目根目录创建my_app.spec文件&#xff0c;内容如下&#xff1a; # -*- mode: python ; coding: utf-8 -*-block_cipher Nonea Analysis([server.py], # flask入口pathex[],binaries[], datas[("E:/**/templates","/templates"),("E:/**/s…

物联网工程开发实施,应该怎么做?

我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 物联网工程的概念 物联网工程是研究物联网系统的规划、设计、实施、管理与维护的工程科学&#xff0c;要求物联网工程技术人员根 据既定的目标&#xff0c;依照国家、行业或企业规范&#xff0c;制定物联网…

Visual ChatGPT:Microsoft ChatGPT 和 VFM 相结合

推荐&#xff1a;使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 什么是Visual ChatGPT&#xff1f; Visual ChatGPT 是一个包含 Visual Foundation 模型 &#xff08;VFM&#xff09; 的系统&#xff0c;可帮助 ChatGPT 更好地理解、生成和编辑视觉信息。VFM 能够指…

Java抽象类和接口【超详细】

文章目录 一、抽象类1.1 抽象类概念1.2 抽象类语法1.3 抽象类特性1.4 抽象类的作用 二、接口2.1 接口的概念2.2 语法规则2.3 接口使用2.4 接口特性2.5 实现多个接口2.6 接口间的继承2.7 接口使用实例2.8Clonable 接口和深拷贝2.9 抽象类和接口的区别 一、抽象类 1.1 抽象类概念…

MySQL索引1——索引基本概念与索引结构(B树、R树、Hash等)

目录 索引(INDEX)基本概念 索引结构分类 BTree树索引结构 Hash索引结构 Full-Text索引 R-Tree索引 索引(INDEX)基本概念 什么是索引 索引是帮助MySQL高效获取数据的有序数据结构 为数据库表中的某些列创建索引&#xff0c;就是对数据库表中某些列的值通过不同的数据结…

Flask简介与基础入门

一、了解框架 Flask作为Web框架&#xff0c;它的作用主要是为了开发Web应用程序。那么我们首先来了解下Web应用程序。Web应用程序 (World Wide Web)诞生最初的目的&#xff0c;是为了利用互联网交流工作文档。 1、一切从客户端发起请求开始。 所有Flask程序都必须创建一个程序…

WSL 2 installation is incomplete的解决方案

问题描述 解决方案 在Windows功能中开启Hyper-v 如果没有Hyper-v选项&#xff0c;新建文本粘贴以下内容后以.cmd为后缀保存后执行即可 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in (findstr /i . hyper-v.t…

Julia 字典和集合

数组是一种集合&#xff0c;此外 Julia 也有其他类型的集合&#xff0c;比如字典和 set&#xff08;无序集合列表&#xff09;。 字典 字典是一种可变容器模型&#xff0c;且可存储任意类型对象。 字典的每个键值 key>value 对用 > 分割&#xff0c;每个键值对之间用逗…

OSLog与NSLog对比

NSLog: NSLog的文档&#xff0c;第一句话就说&#xff1a;Logs an error message to the Apple System Log facility.&#xff0c;所以首先&#xff0c;NSLog就不是设计作为普通的debug log的&#xff0c;而是error log&#xff1b;其次&#xff0c;NSLog也并非是printf的简单…

前端学习---vue2--选项/数据--data-computed-watch-methods-props

写在前面&#xff1a; vue提供了很多数据相关的。 文章目录 data 动态绑定介绍使用使用数据 computed 计算属性介绍基础使用计算属性缓存 vs 方法完整使用 watch 监听属性介绍使用 methodspropspropsData data 动态绑定 介绍 简单的说就是进行双向绑定的区域。 vue实例的数…

Java课题笔记~ IoC 控制反转

二、IoC 控制反转 控制反转&#xff08;IoC&#xff0c;Inversion of Control&#xff09;&#xff0c;是一个概念&#xff0c;是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器&#xff0c;通过容器来实现对象的 装配和管理。控制反转就是对对象控制权的转移&a…