vue part 5

news/2024/9/19 0:41:56/ 标签: vue.js, 前端, javascript

生命周期

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>引出生命周期</title><!-- 引入Vue --><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><!--准备好一个容器--><div id="root"><h2 :style="{opacity:opacity}">欢迎学习Vue</h2><!-- {{change()}} 错误的,change后,vue实例调用保障重新解析,又重新渲染,导致死循环--></div>
</body>
<script type="text/javascript">Vue.config.productionTip = false//阻止vue在启动时生成生产提示。//删除vmnew Vue({el: '#root',data: {opacity: 1},methods: {change() {setInterval(() => {this.opacity -= 0.01if (this.opacity <= 0) this.opacity = 1}, 16)}},//vue实例挂载完成后把真实的dom元素页面后执行的函数mounted() {setInterval(() => {this.opacity -= 0.01if (this.opacity <= 0) this.opacity = 1}, 16)}})</script></html>

生命周期:
1 .又名:生命周期回调函数、生命周期函数、生命周期钩广。
2 .是什么:Vue在关键时刻用我们调用的一些特殊名称的函数。
3•生命周期函数的名字不可史改,但函数的具体内容是程序员根据需求编写的.
4 .生命周期函数中的this指向是vm或组件实例对象。

挂载流程

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>分析生命周期</title><!-- 引入Vue --><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><!--准备好一个容器--><div id="root" :x="n"><h2>当前的n值是:{{n}}</h2><button @click="add">点我n+1</button><button @click="bye">点我销毁组件</button></div>
</body>
<script type="text/javascript">Vue.config.productionTip = false//阻止vue在启动时生成生产提示。//删除vmnew Vue({el: '#root',/* template:`<div><h2>当前的n为{{n}}</h2><button @click="add">点我n+1</button></div>`, *///可以把root的模板写在这里data: {n: 0},methods: {add() {this.n += 1},bye() {console.log('bye')this.$destroy()//销毁了但是残留}},beforeCreate() {console.log('beforeCreate')},created() {console.log('created')},beforeMount() {console.log('beforeMount')},mounted() {console.log('mounted', this.$el)// 真实的DOM元素},beforeUpdate() {console.log('beforeUpdate')},updated() {console.log('updated')},beforeDestroy() {console.log('beforeDestroy')this.add()//发现页面并没有+1,生命周期在这个时候就已经不会触发更新//销毁的2个都不能用,仅能销毁},destroyed() {console.log('destroyed')//官网说:组件实例对象,都是通过VUE创建的实例。但是工作重点不一样。vm是全局管理。其他是组件的管理。vm直接管理组件的加载和删除。组件管理和页面的交互。}})</script></html>

常用的生命周期钩子:
1.mounted:发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。
2.beforeDestroy:清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。
关于销毁Vue实例
1.销毁后借助Vue开发者工具看不到任何信息。
2.销毁后自定义事件会失效,但原生DOM事件依然有效
3.一般不会再beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>分析生命周期</title><!-- 引入Vue --><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><!--准备好一个容器--><div id="root"><h2 :style="{opacity}">欢迎学习Vue</h2><button @click="stop">透明度设置为1</button><!-- 注意:这样的添加方式不会使模板中心解析,只是改变了vm 你这是清除的定时器又不是销毁的实例,opacity还在当然能操作--><button @click="stop">点我停止变换</button></div>
</body>
<script type="text/javascript">Vue.config.productionTip = false//阻止vue在启动时生成生产提示。//删除vmnew Vue({el: '#root',data: {opacity: 1,},methods: {stop() {//clearInterval(this.timer)//this.opacity = 1this.$destroy()}},mounted() {this.timer = setInterval(() => {this.timer -= 0.01if (this.timer <= 0) {this.timer = 1}}, 16)},beforeDestroy() {clearInterval(this.timer)console.log('销毁实例vm')}})</script></html>

组件

 关键是用于购物车非常有用,父子组件通信,会话维持,多页面跳转

组件是实现应用中局部功能代码和资源

非单文件组件:不是一个组件单独放在一个文件里

单文件组件:一个组件单独放在一个文件里

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>Vue实例</title><!-- 引入Vue --><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><!--准备好一个容器--><div id="root"><h1>{{msg}}</h1><xuexiao></xuexiao><hr><xuesheng></xuesheng></div>
</body>
<script type="text/javascript">Vue.config.productionTip = false//阻止vue在启动时生成生产提示。const school = Vue.extand({//创建school组件template: `<div><h2>学校名称:{{schoolname}}</h2><h2>学校地址:{{address}}</h2><button @click="showName">点我提示学校名</button></div>`,data() {//不能写el配置项,因为所有的组件都要被vm管理,由vm来决定服务。return {schoolname: '华中科技大学',address: '武汉',}},methods: {showName() {alert(this.schoolname)}}})const student = Vue.extand({//创建student组件template: `<div><h2>学生姓名:{{studentname}}</h2><h2>学生年龄:{{age}}</h2></div>`,data() {return {studentname: '张三',age: 20,}},})new Vue({el: '#root',data: {msg: 'hellohello'},compoments: {xuexiao: school,xuesheng: student}})//使用对象是引用数据,你用我用大家用,函数返回值,是复印了一份新的给你,你随便改,影响不了原本。</script></html>

Vue中使用组件的三大步骤:
一、定义组件(创建组件)
二、注册组件
三、使用组件(写组件标签)
一、如何定义一个组件?
使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别;
区别如下:
1.el不要写,为什么?——最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。
2.data必须写成函数,为什么?——避免组件被复用时,数据存在引用关系。
备注:使用template可以配置组件结构。
二、如何注册组件?
1.局部注册:靠new Vue的时候传入components选项
2.全局注册:靠Vue.component('组件名',组件)
三、编写组件标签:
<school></school>

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8" /><title>几个注意点</title><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><!--准备好一个容器--><div id="root"></div>
</body>
<script type="text/javascript">Vue.config.productionTip = falseconst school = Vue.extend({template: `<div><h2>学校名称:{{name}}</h2><h2>学校地址:{{address}}</h2><student></student></div>`,components: {student},data() {return {name: '尚硅谷',address: '北京市海淀区西二旗北路10号'}}})const student = Vue.extend({name: 'student',template: `<div><h2>学生信息:{{name}}</h2><h2>学生年龄:{{age}}</h2></div>`,data() {return {name: 'KOBE',age: 20}}})const hello = Vue.extend({template: `<h1>{{msg}}</h1>`,data() {return {msg: 'Hello尚硅谷学校'}}})const app = new Vue({template: `<div><hello></hello><school></school></div>`,components: {school,hello}})//不要忘记模板里面之后一个根容器new Vue({template: `       <app></app>        `,el: '#root',components: {app},})
</script>

vm----->app--->student/school/hello

几个注意点:

1.关于组件名:
一个单词组成:
第一种写法(首字母小写):school
第二种写法(首字母大写):School
多个单词组成:
第一种写法(kebab-case命名):my-school
第二种写法(CamelCase命名):MySchool(需要Vue脚手架支持)
备注:
(1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。
(2).可以使用name配置项指定组件在开发者工具中呈现的名字。
2.关于组件标签:
第一种写法:<school></school>
第二种写法:<school/>
备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。
3.一个简写方式:
const school = Vue.extend(options)可简写为: const school = options

组件的嵌套

关于VueComponent:
1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。
2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,
即Vue帮我们执行的:new VueComponent(options)。
3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!
4.关于this指向:
(1).组件配置中:
data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均为【VueComponent实例对象】。
(2).new Vue()配置中:
data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。
5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。
Vue的实例对象,以后简称vm。

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>VueComponent实例对象</title><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><!--准备好一个容器--><div id="root"><school></school></div>
</body>
<script type="text/javascript">Vue.config.productionTip = falseconst school = Vue.extend({template: `<div><h2>学校名称:{{name}}</h2><h2>学校地址:{{address}}</h2>       </div>`,data() {return {name: '尚硅谷',address: '北京市海淀区西二旗北路10号'}}})const hello = Vue.extand({template: `<h2>{{msg}}</h2>`,data() {return {msg: 'hello world'}},methods: {showName() {alert(this.name)//this是VueComponent{_uid:1,_isvue:true,$options:{template:...}}}})new Vue({el: '#root',components: {school}})
</script>

实例和组件

vc有的我要有,vc没有的我更要有

一个重要的内置关系

这个原型不是相当于Java中的父类,原型对象应该对应Java中的类的class对象

059_尚硅谷Vue技术_一个重要的内置关系_哔哩哔哩_bilibili

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>一个重要的内置关系</title><!-- 引入Vue --><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head><body><!--1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype2.为什么要这个关系?因为可以让组件实例对象vc访问到Vue的全局属性和方法。--><!--准备好一个容器--><div id="root"></div>
</body>
<script type="text/javascript">Vue.config.productionTip = false//阻止vue在启动时生成生产提示。//定义一个构造函数function Demo() {this.a = 1this.b = 2}//创建一个Demo的实例对象const d = new Demo()console.log(Demo.prototype)//demo的原型对象console.log(d.__proto__ === Demo.prototype)//d的隐式原型对象是否等于demo的原型对象//prototype和__proto__都是原型对象console.log('@', d)const school = Vue.extend({template: `<div><h2>学校名称:{{name}}</h2><h2>学校地址:{{address}}</h2>       </div>`,data() {return {name: '尚硅谷',address: '北京市海淀区西二旗北路10号'}}})//这里的school不是new出来的,只是个变量用来存放VueComponten构造函数的,//所以在此处school只是VueCompontent构造函数,等在模板中使用的时候才会解析成实例//创建一个Vue实例对象new Vue({el: '#root',data: {msg: 'hello'}})</script></html>

我没找到__proto__只有 [[prototype]]

实例的隐式原型属性永远指向自己缔造者的原型对象

原型对象就是类的元数据对象,实例对象就是普通的对象/实例,原型对象(类的元数据对象)也有个__proto__属性,指向其父类的元数据对象,实例对象有个__proto__属性,指向其类元数据对象,最后,类的构造函数里存了个prototype属性,指向其类的元数据对象

单文件组件

xxxx.vue和xxxx.js想变成js和css,就需要webpack或者vue脚手架

在vscode里面下载vetur插件

student.vue

<template><!-- 组件的结构 --><div class="demo"><h2>学校名称:{{ schoolName }}</h2><h2>学校地址:{{ address }}</h2><button @click="showName">点我提示学校名</button></div>
</template><script>
/* 组件的交互逻辑数据方法 */
/* 简单的es6模块化写法 */export const school = Vue.extend({data() {return {schoolName: '北京大学',address: '北京市海淀区西二旗北路10号'}},methods: {showName() {alert(this.schoolName)}}})export default school/* 也可以这样写 export default Vue.extend({})*//* 或者这样写 export default { data() {}, methods: {} }即可 */</script><style>
/* 组件的样式 */
.demo {background-color: #f2f2f2;
}
</style><!-- webstorm默认的vue模板快捷键是 vbase-css 然后敲tab键 -->

index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>单文件组件的语法</title>
</head><body><div id="root"><App></App></div><!-- <script type="text/x-template" src="../js/vue.js"></script><script type="text/javascript" src="./index.js"></script> --><!-- 在VSCode 首选项设置扩展里 Trigger Expansion On Tab 勾选就可以切换标签了。 -->
</body></html>

App.vue

<template><div><school>    </school><student>    </student></div>
</template><script>    import School from './School.vue'import Student from './Student.vue'export default {name:'App',components: {School,Student}}
</script>

 main.js

javascript">import App from './App.vue'new Vue({el: '#app',template: '<App></App>',components: {App}
})

不放student.vue了 


http://www.ppmy.cn/news/1519788.html

相关文章

进程、线程的区别

进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是操作系统中的基本概念&#xff0c;它们在资源管理和任务执行方面有着本质的区别&#xff1a; 定义&#xff1a; 进程&#xff1a;进程是操作系统进行资源分配和调度的一个独立单位。每个进程都有自己…

ArcGIS Pro 3.1下载分享

在使用了很长一段时间ArcGIS Pro 3.0之后&#xff0c;终于迎来了ArcGIS Pro 3.1的更新&#xff0c;这里为你分享一下ArcGIS Pro 3.1的安装步骤。 软件介绍 ArcGIS Pro 3.1 是由Esri发布的地理信息系统 (GIS) 软件的较新版本&#xff0c;作为 ArcGIS 桌面应用程序家族中的核心…

【递归深搜之记忆化搜索算法】

1. 斐波那契数 解法一&#xff1a;递归 class Solution { public:int fib(int n) {return dfs(n);}int dfs(int n){if(n 0 || n 1)return n;return dfs(n - 1) dfs(n - 2);} }; 解法二&#xff1a;记忆化搜索 class Solution {int nums[31]; // 备忘录 public:int fib(int …

使用C++,仿照string类,实现myString

类由结构体演化而来&#xff0c;只需要将struct改成关键字class&#xff0c;就定义了一个类 C中类和结构体的区别&#xff1a;默认的权限不同&#xff0c;结构体中默认权限为public&#xff0c;类中默认权限为private 默认的继承方式不同&#xff0c;结构体的默认继承方式为p…

微型直线导轨高精度运行的工作原理

微型导轨是一种用于高精度定位和运动控制的传动装置&#xff0c;常用于微小化、高精密度化的机械设备中&#xff0c;如IC制造设备、半导体设备、高速移载的设备、精密测量、检测仪器、医疗设备、X-Y table&#xff0c;以及高速皮带驱动的设备等小型化设备。 微型导轨的构成相对…

单窗口IP代理设置指南:轻松搞定

在现代互联网生活中&#xff0c;IP代理已经成为了许多人日常上网的必备工具。单窗口IP代理是一种非常实用的代理方式&#xff0c;它允许你在同一个浏览器中为不同的窗口设置不同的IP地址&#xff0c;从而更好地保护隐私和实现多任务处理。今天&#xff0c;我们就来详细讲解一下…

在 macOS 上升级 Ruby 版本的几种方法

在 macOS 上升级 Ruby 版本通常有几种方法&#xff0c;以下是一些常用的方法&#xff1a; 使用系统自带的 Ruby: macOS 系统自带 Ruby&#xff0c;但通常不是最新版本。可以通过终端使用 softwareupdate 命令来更新系统自带的 Ruby。 使用 Homebrew: Homebrew 是 macOS 的包管…

字符串地指针表示方式

每日诗词&#xff1a; 人生自是有情痴&#xff0c;此恨不关风与月。 ——玉楼春尊前拟把归期说 【宋】欧阳修 目录 数组本身的值和数组储存的值一样吗 char[]和cahr*的区别 1. 类型 2. 内存分配 3. 使用方式 4. 字符串字面量 实例 变式 总结&#xff1a; 下期预告&a…

vue2+countup.js实现大屏数字滚动效果封装

很多大屏、官网或者展示类页面会用到数字跳动更新效果的需求&#xff0c;countup用起来就非常方便 一、官网 CountUp.js 二、效果图 三、安装countup与引入 npm install countup 进行安装依赖 import { CountUp } from countUp.js;//需要用到的页面引入&#xff0c;也可以…

生成式AI:创造性智能的新纪元

引言 随着人工智能技术的飞速发展&#xff0c;生成式AI&#xff08;Generative AI&#xff09;已经成为一个引人注目的领域。它不仅仅是模仿人类行为&#xff0c;而是通过学习大量的数据&#xff0c;创造出全新的内容&#xff0c;如文本、图像、音乐等。本文将探讨生成式AI的基…

同样128个内核,AMD霄龙9755性能翻倍:Zen 5架构下的性能飞跃

近日&#xff0c;AMD在服务器处理器领域再次展示了其强大的技术实力&#xff0c;随着AMD EPYC“Turin”处理器发布日期的临近&#xff0c;其基准测试结果也开始浮出水面。硬件爱好者博主9550pro近期分享了AMD 128核EPYC 9755“Turin”处理器在7zip压缩/解压缩基准测试中的跑分数…

力扣(可被三整除的最大和)

1262. 可被三整除的最大和 提示 给你一个整数数组 nums&#xff0c;请你找出并返回能被三整除的元素 最大和。 思路&#xff1a; 方法一&#xff1a;利用一个长度为3的数组&#xff0c;分别保存0到i内余数为0&#xff0c;1&#xff0c;2的最大和&#xff0c;这样对于一个进入…

通过 NestJS 实现与第三方接口的文件流无缝对接

引言 在当今的Web应用中&#xff0c;高效的文件上传至关重要。本文将介绍如何从前端页面调用NestJS提供的文件上传接口&#xff0c;并通过该接口将文件流直接上传至第三方服务&#xff0c;以此提升上传效率和用户体验。通过这一流程&#xff0c;我们将展示如何利用NestJS与外部…

Java泛型基础概念

Java 泛型是 Java SE 5 引入的一种特性&#xff0c;允许在编写代码时指定类、接口或方法的类型参数。通过泛型&#xff0c;你可以编写更具通用性、类型安全的代码&#xff0c;避免在运行时遇到不必要的类型转换错误。 1. 泛型的基本语法 泛型的基本形式如下&#xff1a; cla…

PHP房屋出售出租多端多平台预约系统小程序源码

&#x1f3e0;&#x1f511;「房屋出售出租多端运营系统」——房产管理新纪元&#xff0c;一键掌控所有&#xff01;&#x1f680; &#x1f3e1; 开篇直击&#xff1a;房产市场新利器&#xff0c;轻松管理不再是梦&#xff01; 亲们&#xff0c;还在为房屋出售或出租的繁琐流…

qt父类和子类转换的安全性问题

在 Qt 中&#xff0c;父类和子类之间的转换遵循 C 的类型转换规则。以下是关于父类和子类转换安全性的详细说明&#xff1a; 1. 向上转型&#xff08;Upcasting&#xff09; 定义&#xff1a;将子类对象转换为父类对象。安全性&#xff1a;这是安全的&#xff0c;因为子类对象…

C# 自动化抢购脚本:基于商品链接的实现方案

实现思路&#xff1a; 启动参数: options.AddArgument("start-maximized"); 用于启动浏览器时使其窗口最大化。 创建 EdgeDriver 实例: EdgeDriver driver new EdgeDriver(options); 用于初始化 WebDriver 实例。导航到 URL: driver.Navigate().GoToUrl("请输入…

vue3+el-tale封装(编辑、删除、查看详情按钮一起封装)

// 封装源码&#xff08;子组件&#xff09; <template><el-table :data"tableData" style"width: 100%"><el-table-columnv-for"(column, index) in tableDataHeader":label"column.label":key"index":prop…

测试:TestGRPCDiscovery

目录 测试:TestGRPCDiscovery 类定义 方法 async def asyncSetUp(self): async def asyncTearDown(self): async def test_discovery(self): 总结 这是一个关于算力共享中环形结构通讯机制的项目图的功能模型解释。以下是根据所给信息对项目功能的概述: 项目结构: 项…

Vue.js 样式绑定

Vue.js 样式绑定 Vue.js 是一种流行的前端框架&#xff0c;它提供了一种简洁而强大的方式来绑定样式到元素上。样式绑定允许开发者根据组件的状态动态地改变元素的样式。在 Vue 中&#xff0c;样式绑定可以通过多种方式实现&#xff0c;包括类绑定、内联样式绑定和计算属性样式…