Vue-2

生命周期

Vue 生命周期

在这里插入图片描述

Vue 生命周期函数

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

在这里插入图片描述

  • created 应用演示
<body><div class="box"><ul v-for="item in list" :key="item.id"><li><img :src="item.img"></li><li>{{ item.title }}</li><li>{{ item.source }}</li><li>{{ item.time }}</li> <hr></ul></div><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script src="./js/vue.js"></script><script>const boxObj = new Vue({el: '.box',data: {list: []},// created 应用演示async created() {const res = await axios.get('http://hmajax.itheima.net/api/news/')this.list = res.data.data}})</script>
</body>
  • mounted 应用演示
<body><div class="box"><input type="text" v-model="words" class="search"><button @click=" words='' ">搜索一下</button></div><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script src="./js/vue.js"></script><script>const boxObj = new Vue({el: '.box',data: {words: ''},// mounted 应用演示// 等输入框渲染出来后,获取输入框焦点mounted() {document.querySelector('.search').focus()}})</script>
</body>

Vue CLI

基本介绍

Vue CLI 是 Vue 官方提供的一个全局命令工具,它可以帮助我们快速创建一个开发 Vue 项目的标准化基础架子(集成了 webpack 配置)

使用步骤

  1. 打开终端,全局安装 (一次):yarn global add @vue/clinpm i @vue/cli -g
  2. 查看 Vue 版本:vue --version
  3. 创建项目架子:vue create 项目名称 (项目名称不能用中文)
  4. 启动项目:yarn servenpm run serve (在 package.json 文件中可自定义命令)

目录文件介绍

在这里插入图片描述

组件化开发

认识组件化

  • 什么是组件化
一个页面可以拆分成一个个组件 (部分),每个组件有着自己独立的结构、样式、行为
  • 组件化的好处
便于维护,利于复用,提升了开发效率
  • 分类
1.根组件(App.vue)
2.普通组件

在这里插入图片描述

  • 组件的三个构成部分
template 结构 (有且只能有一个根元素)
script   行为 (写js逻辑)
style    样式 (可支持less,需要安装包)
在 style 中使用 less 语法的具体操作:1.安装依赖包 less 和 less-loader输入命令即可:	yarn add less less-loader -D其中 -D 的意思是只在开发时使用2.设置属性,例如: <style lang="less">...</style>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

组件的注册使用

方式分类

方式一:局部注册,只能在注册的组件内使用

  • 创建 .vue 文件(三个组成部分)
  • 在使用的组件内导入并注册

方式二:全局注册,所有组件内都能使用

注意事项

组件名规范,采用大驼峰命名法

局部注册

  • 文件路径:src/App.vue
<template><div class="App"><!-- 头部组件 --><Header></Header><!-- 主体组件 --><Main></Main><!-- 底部组件 --><Footer></Footer></div>
</template><script>
// 导入普通组件
import JackHeader from "./components/JackHeader.vue";
import JackMain from "./components/JackMain.vue";
import JackFooter from "./components/JackFooter.vue";// 导出的默认配置
export default {components: {// '组件名':组件对象Header: JackHeader,Main: JackMain,Footer: JackFooter},
};
</script><style>
.App {width: 600px;height: 700px;background-color: #87ceeb;margin: 0 auto;padding: 20px;
}
</style>
  • 文件路径:src/components/JackHeader.vue
<template><div class="header">头部</div>
</template><script>
export default {};
</script><style>
.header {height: 100px;line-height: 100px;text-align: center;font-size: 30px;background-color: #8064a2;color: white;
}
</style>
  • 文件路径:src/components/JackMain.vue
<template><div class="main">主体</div>
</template><script>
export default {};
</script><style>
.main {height: 400px;line-height: 400px;text-align: center;font-size: 30px;background-color: #f79646;color: white;margin: 20px 0;
}
</style>
  • 文件路径:src/components/JackFooter.vue
<template><div class="footer">底部</div>
</template><script>
export default {};
</script><style>
.footer {height: 100px;line-height: 100px;text-align: center;font-size: 30px;background-color: #4f81bd;color: white;
}
</style>

全局注册

  • 文件路径:src/main.js
// 本文件的核心作用:导入 App.vue 文件,基于 App.vue 文件创建结构渲染 index.html// 1. 导入 Vue 核心包
import Vue from 'vue'// 2. 导入 App.vue 根组件
import App from './App.vue'// 5. 导入组件
import JackButton from "./components/JackButton.vue"// 3. 提示:当前处于什么环境(生产环境 / 开发环境)
Vue.config.productionTip = false// 6. 对组件进行全局注册
// Vue.component(组件名, 组件对象)
Vue.component('MyButton', JackButton)// 4. Vue 实例化,提供 render 方法,基于 App.vue 创建结构渲染 index.html
// new Vue({
//   el: '#app',
//   render: (createElement) => { return createElement(App) }
// })
// 上面的代码等价于下面代码
new Vue({render: createElement => createElement(App)
}).$mount('#app')

组件的样式冲突

冲突问题

默认情况下,写在组件中的样式会"全局生效",因此,很容易造成多个组件之间的样式冲突问题发生

解决办法

可以给组件中的 style 标签加上 scoped 属性,这样可以让该组件的 style 样式只作用于当前组件,例如 `<style scoped>...</style>`

data 函数

<template><div><button @click="count--">-</button><span>{{ count }}</span><button @click="count++">+</button></div>
</template><script>
export default {// data 函数保证每一个组件实例,维护一个独立的数据对象data() {return {count: 99,};},
};
</script><style scoped>
div {margin: 20px;
}
span {margin: 10px;
}
</style>

组件通信

基本内容

含义介绍:组件通信,就是指"组件与组件"之间的数据传递

组件关系

  • 父子关系
  • 非父子关系

通信方案

  • 父子关系 =》使用 props & $emit
  • 非父子关系 =》使用 provide & inject 或者 event bus
  • 通用解决方案 =》使用 Vuex(适合复杂业务场景)

在这里插入图片描述

父子通信

  • 文件路径:src/App.vue
<template><div><!-- 通过"自定义属性"向子组件发送数据 --><BaseTesttitle="这是来自'父组件'的数据":username="username":age="age":isSingle="isSingle":hobby="hobby"@content="infoFn"></BaseTest><!-- 展示来自"子组件"的数据 --><div class="box">{{ something }}</div></div>
</template><script>
import BaseTest from "./components/BaseTest.vue";
export default {data() {return {something:'',// 假设从服务器端获得了数据username: "Jack",age: 30,isSingle: true,hobby: ["code", "run", "swim"],};},methods: {// 接收来自"子组件"的数据infoFn(info) {this.something = info},},components: {BaseTest,},
};
</script><style>
</style>
  • 文件路径:src/components/BaseTest.vue
<template><div><hr /><h3>{{ title }}</h3><p>姓名:{{ username }}</p><p>年龄:{{ age }}</p><p>是否单身:{{ isSingle ? "是" : "否" }}</p><p>兴趣爱好:{{ hobby.join("、") }}</p><button @click="func">确认收到</button><hr /></div>
</template><script>
export default {// prop 是在组件上注册的一些自定义属性// 通过 props 进行接收这些属性props: ["title", "username", "age", "isSingle", "hobby"],methods: {func() {// 通过 $emit 向"父组件"发送消息this.$emit("content", "子组件已确认收到消息");},},
};
</script><style scoped>
</style>

props 验证

  • 文件路径:src/App.vue
<template><div><!-- 通过"自定义属性"向子组件发送数据 --><BaseTest :w="width"></BaseTest></div>
</template><script>
import BaseTest from "./components/BaseTest.vue";
export default {data() {return {width: 300,};},components: {BaseTest,},
};
</script><style>
</style>
  • 文件路径:src/components/BaseTest.vue
<template><div><div class="base-progress"><div class="inner" :style="'width:' + w + '%'"></div></div><span>{{ w }}%</span></div>
</template><script>
export default {// 通过 props 接收自定义属性,然后对其进行校验,如果校验失败,则控制台报错// 1. 基础写法(类型校验)// props: {//   w: Number,  // 约束传递过来的数据的类型// },// 2. 完整写法(更多校验)props: {w: {type: Number, // 类型required: true, // 是否必须(非空判断)default: 0, // 默认值validator(value) {if (value < 0 && value > 100) return true;else {console.error("数据范围必须是0~100");return false; // false 代表没有通过校验}},},},
};
</script><style scoped>
.base-progress {height: 26px;width: 400px;border-radius: 15px;background-color: #272425;border: 3px solid #272425;box-sizing: border-box;margin-bottom: 10px;
}
.inner {height: 90%;background-color: rgb(124, 193, 246);border-radius: 15px;border: 1px solid #272425;
}
</style>

非父子通信

  • 文件路径:utils/EventBus.js
// 1. 创建一个事件总线(空的 Vue 实例)
import Vue from 'vue'
const Bus = new Vue()
// 2. 导出事件总线
export default Bus
  • 文件路径:src/App.vue
<template><div><BaseA></BaseA><BaseB></BaseB></div>
</template><script>
import BaseA from "./components/BaseA.vue"
import BaseB from "./components/BaseB.vue"
export default {components: {BaseA,BaseB,},
};
</script><style>
</style>
  • 文件路径:src/components/BaseB.vue
<template><div><span>BaseB</span><button @click="sendMsg">发布消息</button></div>
</template><script>
import Bus from "../utils/EventBus.js";
export default {methods: {sendMsg(){// 发布消息,该消息可以被多个组件同时接收Bus.$emit('B_Send_Msg','Hello, How are you?')}},
};
</script><style>
</style>
  • 文件路径:src/components/BaseA.vue
<template><div><span>BaseA</span></div>
</template><script>
import Bus from "../utils/EventBus.js";
export default {// 钩子函数(详情回顾:生命周期知识点)created() {// 监听 Bus 事件Bus.$on("B_Send_Msg", (msg) => {alert("来自B发送的信息: " + msg);});},
};
</script><style>
</style>

跨层级非父子通信

  • 文件路径:src/App.vue
<template><div><BaseA></BaseA></div>
</template><script>
import BaseA from "./components/BaseA.vue";
export default {// 所有的子孙后代都能共享这些数据provide() {return {color: this.color, // 传递"简单类型"是非响应式的,即数据不会更新userInfo: this.userInfo, // 传递"复杂类型"是响应式的,数据可以动态变化(推荐)};},data() {return {color: "pink",userInfo: {name: "Jack",age: 30,},};},components: {BaseA,},
};
</script><style>
</style>
  • 文件路径:src/components/BaseA.vue
<template><div><p>{{ color }}</p><p>{{ userInfo.name }}</p><p>{{ userInfo.age }}</p></div>
</template><script>
export default {inject: ["color", "userInfo"],
};
</script><style>
</style>

v-model 原理

原理解析

v-model 本质上是一个"语法糖"(即:value 属性 和 input 事件的合写)

作用:提供数据的双向绑定

  • 数据变化,视图跟着变化
  • 视图变化,数据跟着变化

注意:$event 用于模板中,获取事件的形参

<template><div><input v-model="msg" type="text" /><!-- 上面的代码本质是下面的代码 --><input :value="msg" @input="msg = $event.target.value" type="text" /></div>
</template>

表单类组件封装

数据绑定问题

在开发中,我们需要对"表单类组件"进行封装,而这个"子组件"的数据是来自"父组件"的,我们无法直接对"子组件"的"表单类标签"使用 v-model 进行双向的数据绑定,所以我们需要使用 `v-model拆解` 实现绑定数据

具体解决

  • 文件路径:src/App.vue
<template><div><BaseSelect:cityId="selectId"@changeId="selectId = $event"></BaseSelect></div>
</template><script>
import BaseSelect from "./components/BaseSelect.vue";
export default {data() {return {selectId: "102",	// 城市编号};},components: {BaseSelect,},
};
</script><style>
</style>
  • 文件路径:src/components/BaseSelect.vue
<template><div><select :value="cityId" @change="handleChange"><option value="101">北京</option><option value="102">上海</option><option value="103">广州</option><option value="104">深圳</option><option value="105">重庆</option></select></div>
</template><script>
export default {props: {cityId: String,},methods: {handleChange(e) {this.$emit("changeId", e.target.value);},},
};
</script><style>
</style>

组件数据双向绑定

.sync 修饰符

作用:可以实现"子组件"与"父组件"的双向绑定,简化代码

特定:prop 属性名,可以自定义,不用固定为 value

具体演示

  • 文件路径:src/App.vue
<template><div><button @click="isShow = true">确认付款</button><!-- <BaseDialog :visible="isShow" @update:visible="isShow = $event"></BaseDialog> --><!-- :visible.sync => :visible + @update:visible 化简后结果如下所示:--><BaseDialog :visible.sync="isShow"></BaseDialog></div>
</template><script>
import BaseDialog from "./components/BaseDialog.vue";
export default {data() {return {isShow: false,};},components: {BaseDialog,},
};
</script><style>
</style>
  • 文件路径:src/components/BaseDialog.vue
<template><div><div v-show="visible" class="dialog"><p>你是否确定要付款?</p><button @click="close">确定</button><button @click="close">取消</button></div></div>
</template><script>
export default {props: {visible: Boolean,},methods: {close() {this.$emit("update:visible", false);},},
};
</script><style>
.dialog {margin: 0 auto;width: 200px;border: 5px solid #000;border-radius: 10px;
}
</style>

ref 和 $refs

通过 ref 与 $refs 获取 dom 元素

<template><div><div class="box" ref="myBox"></div></div>
</template><script>
export default {mounted() {// 通过 ref 与 $refs 获取 dom 元素,防止 document.querySelector() 从全局中获取元素产生冲突const myBox = this.$refs.myBox;},
};
</script><style>
</style>

通过 ref 与 $refs 获取"组件实例"

  • 第一步:给目标组件添加 ref 属性
<BaseForm ref="hhh"></BaseForm>
  • 第二步:使用 this.$refs.xxx 获取目标组件(同时可以调用其方法)
this.$refs.hhh.组件方法

Vue 异步更新

问题解析:

Vue 为了提高性能,修改了 dom 并不会立即更新,而是会等待一会儿再集中一起更新。如果在 dom 还没有更新的时候,代码继续执行下去,可能会出现找不到某个 dom 元素的问题。 

解决方案:

使用 $nextTick 后,等 DOM 更新后,才会触发执行此方法里的函数体
this.$nextTick(()=>{// 这里写 DOM 更新后,要执行的代码
})

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

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

相关文章

景联文科技:引领战场数据标注服务,赋能态势感知升级

自21世纪初&#xff0c;信息化战争使战场环境变得更为复杂和难以预测&#xff0c;持续涌入的海量、多样化、多来源和高维度数据&#xff0c;加大了指挥员的认知负担&#xff0c;使其需要具备更强的数据处理能力。 同时&#xff0c;计算机技术和人工智能技术的飞速发展&#xff…

【算法训练营】:周测5

需要详细的实现代码实现请私信博主 考题10-5 题目描述 平面固定有一些全等的圆角矩形&#xff0c;不同的圆角矩形具有不同的位置和倾斜角。这些圆角矩形都通过将以原本四个直角处距离两条直角边均为 r&#xfffd; 的位置为圆心&#xff0c;半径为 r&#xfffd; 且与两条直…

CCF-CSP: 因子化简(100分)

第一次提交的时候90分&#xff0c;显示的超时&#xff0c;第一反应是难道有死循环? 检查一遍发现并没有&#xff0c;那就是真的超时了&#xff0c;然后翻阅blog,发现不需要去做判断是否是素数这一步&#xff0c;原因是任意一个非素数都是素数乘积构成&#xff0c;比如说&#…

dpdk协议栈之udp架构优化

dpdk优势 传统网络架构与 DPDK&#xff08;Data Plane Development Kit&#xff09;网络架构之间存在许多区别&#xff0c;而 DPDK 的优势主要体现在以下几个方面&#xff1a; 数据包处理性能&#xff1a;传统网络架构中&#xff0c;网络数据包的处理通常由操作系统的网络协议…

理想滤波器、巴特沃斯滤波器、高斯滤波器实现(包含低通与高通,代码实现与分析)

本篇博客聚焦理想滤波器、巴特沃斯滤波器、高斯滤波器进行原理剖析、代码实现和结果总结&#xff0c;代码含有详细注释&#xff0c;希望帮助大家理解。 以下将从理想低通滤波器、理想高通滤波器、巴特沃斯低通滤波器、巴特沃斯高通滤波器、高斯低通滤波器、高斯高通滤波器六个…

【GPTs分享】每日GPTs分享之Image Generator Tool

今日GPTs分享&#xff1a;Image Generator Tool。Image Generator Tool是一种基于人工智能的创意辅助工具&#xff0c;专门设计用于根据文字描述生成图像。这款工具结合了专业性与友好性&#xff0c;鼓励用户发挥创造力&#xff0c;同时提供高效且富有成效的交互体验。 主要功能…

Debezium发布历史153

原文地址&#xff1a; https://debezium.io/blog/2023/07/10/custom-http-signaling-notification/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium signaling and notifications - Part 2: Customisat…

<网络安全>《55 概念讲解<第二课 MAC地址>》

1 MAC地址是什么&#xff1f; MAC地址&#xff08;Media Access Control Address&#xff09;是一种标识网络设备的唯一地址&#xff0c;也被称为物理地址或硬件地址。它由网络设备制造商在生产过程中写入网卡的EPROM&#xff08;一种可擦写的闪存芯片&#xff09;。 IP地址和…

LabVIEW变压器振动信号数据采集与分析

LabVIEW变压器振动信号数据采集与分析 随着电力系统的快速发展&#xff0c;对变压器的安全监控和故障诊断需求日益增加。设计了一套基于LabVIEW的变压器振动信号数据采集与分析系统&#xff0c;提高变压器的运行安全性和可靠性&#xff0c;实现对变压器振动信号的实时监测和故…

产品经理学习-产品运营《什么是SOP》

目录 什么是SOP 如何执行SOP 执行SOP的重点 什么是SOP SOP就是项目流程操作的说明书 日常工作中的例行操作&#xff1a; 例行操作是指&#xff0c;在每一天&#xff0c;针对每一个用户&#xff0c;在每个项目之中&#xff0c;都必须完成的操作&#xff0c;这些必须完成的操…

微服务-微服务链路追踪组件Skywalking实战

自动化监控系统Prometheus&Grafana实战&#xff1a; 4 trem APM-性能监控项目班&#xff1a; https://vip.tulingxueyuan.cn/detail/p_602e574ae4b035d3cdb8f8fe/6 1. skywalking是什么 1.1 Skywalking主要功能特性 1.2 Skywalking整体架构 1.3 SkyWalking 环境搭建部…

用 SIL 和 PIL 仿真测试生成的代码

目录 PIL 的目标连接配置 对顶层模型运行 SIL 或 PIL 仿真 对 Model 模块运行 SIL 或 PIL 仿真 SIL 或 PIL 模块仿真 硬件实现设置 使用软件在环 (SIL) 和处理器在环 (PIL) 仿真,测试模型组件与从组件生成的生产代码之间的数字等效性。 使用 SIL 仿真,在您的开发…

【析】装卸一体化车辆路径问题的自适应并行遗传算法

0 引言 国内外有关 &#xff36;&#xff32;&#xff30;&#xff33;&#xff30;&#xff24;的文献较多&#xff0c;求解目标多以最小化车辆行驶距离为主&#xff0c;但现实中可能存在由租赁费用产生的单次派出成本&#xff0c;需要综合考 虑单次派车成本和配送路径成本。…

Doris实战——结合Flink构建极速易用的实时数仓

目录 一、实时数仓的需求与挑战 二、构建极速易用的实时数仓架构 三、解决方案 3.1 如何实现数据的增量与全量同步 3.1.1 增量及全量数据同步 3.1.2 数据一致性保证 3.1.3 DDL 和 DML 同步 Light Schema Change Flink CDC DML 和DDL同步 3.2 如何基于Flink实现多种数…

初学学习408之数据结构--数据结构基本概念

初学学习408之数据结构我们先来了解一下数据结构的基本概念。 数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。 本内容来源于参考书籍《大话数据结构》与《王道数据结构》。除去书籍中的内容&#xff0c;作为初学者的我会尽力详细直白地介绍数据结构的…

YOLOv7改进 | 更换主干网络之GhostNet

前言:Hello大家好,我是小哥谈。GhostNet是一种轻量级的卷积神经网络架构,它的设计目标是在保持高精度的同时,减少模型的参数和计算量,以便在资源受限的设备上进行高效推理。GhostNet通过引入Ghost模块来实现这一目标,该模块利用低成本的附加通道来学习主要特征,并通过信…

FMM 笔记:在colab上执行FMM

windows上配置FMM很麻烦&#xff0c;一直没整好&#xff0c;于是尝试了在colab上执行FMM 参考内容&#xff1a;jalal1/fmm_jupyter: Install Fast map matching (FMM) using Jupyter Notebook (github.com) 1 下载数据 # download file from GitHub ! wget https://raw.gith…

【ArcGIS】基于DEM/LUCC等数据统计得到各集水区流域特征

基于DEM/LUCC等数据统计得到各集水区流域特征 提取不同集水区各类土地利用类型比例步骤1&#xff1a;划分集水区为独立面单元步骤2&#xff1a;批量掩膜提取得到各集水区土地利用类型比例步骤3&#xff1a;导入各集水区LUCC数据并统计得到各类型占比 提取坡度特征流域面坡度河道…

Mysql 的高可用详解

Mysql 高可用 复制 复制是解决系统高可用的常见手段。其思路就是&#xff1a;不要把鸡蛋都放在一个篮子里。 复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上&#xff0c;备库本身也可以被配置成另外一台服务器的主库。主…