前端技术Vue学习笔记--005

Vue学习笔记

一、非父子通信-event bus 事件总线

作用:非父子组件之间,进行简易消息传递。(复杂场景用----Vuex)

使用步骤:

请添加图片描述

  1. 创建一个都能访问的事件总线 (空Vue实例)-----utils/EventBus.js
// 1.创建一个都能访问你的时间总线(空闲的Vue实例)
import Vue from "vue"const Bus = new Vue()export default Bus
  1. A组件(接受方),监听Bus的 $on事件
<script>
import Bus from '../utils/EventBus'
export default {created(){// 2.在A组件(接收方),进行监听Bus的事件(订阅消息)Bus.$on('sendMsg',(msg) => {consloe.log(msg)})}
}
</script>
  1. B组件(发送方),触发Bus实例的事件
<script>
//导入事件总线
import Bus from '../utils/EventBus'
export default {methods:{clickSend(){// 3.B组件(发送方)触发事件的方式来传递参数(发布消息)Bus.$emit('sendMsg','今日天气不错')}}
}
</script>

二、非父子通信(拓展)----provide&indect(跨层级共享数据)

provide&indect作用:跨层级共享数据

语法:

  1. 父组件 provide提供数据
export default {provide () {return {// 普通类型【非响应式】color: this.color, // 复杂类型【响应式】userInfo: this.userInfo, }}
}
  1. 子/孙组件 inject获取数据
export default {inject: ['color','userInfo'],created () {console.log(this.color, this.userInfo)}
}

注意:

  • provide提供的简单类型的数据不是响应式的复杂类型数据是响应式推荐提供复杂类型数据
  • 子/孙组件通过inject获取的数据,不能在自身组件内修改

三、子组件与父组件之间的双向绑定

3.1、原理介绍

v-model本质上是一个 语法糖(语法的简写)。例如应用在输入框上,就是value属性 和 input事件 的合写(不同的表单元素会有所不同)

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

  1. 数据发生改变,页面就会自动变 :value(v-bind:value=‘实例中的数据’)
  2. 页面输入改变,数据会自动变化 @input

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

下面两种写法等价:

<template><div class="app">1:<input v-model="msg1"  type="text"/><br><!-- 模版中获取事件的形参  ->  $event获取 -->2:<input :value="msg2" @input=" msg2 = $event.target.value" type="text"/></div>
</template>

不同的表单元素, v-model在底层的处理机制是不一样的。比如给checkbox使用v-model
底层处理的是 checked属性和change事件。

3.2、表单类组件封装&v-model简化代码

  1. 表单类组件封装—>实现了子组件和父组件数据的双向绑定
    • 父传子数据 应该是父组件props传递过来的,v-model拆解绑定数据
    • 子传父监听输入,子传父值给父组件修改

在这里插入图片描述
App.vue

<template><div class="app"><!-- $event就可以拿到当前子传父的形参 --><BaseSelect :cityId="selectId" @changeId=" selectId = $event"></BaseSelect></div>
</template><script>
import BaseSelect from './components/BaseSelect.vue'
export default {data(){return{selectId: '102'}},components:{BaseSelect:BaseSelect}
}

BaseSelect

<template><div><!-- 父传子 ::value="cityId" --><select :value="cityId" @change="handlerChange" ><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:{handlerChange(e){//e.target.value 获取下拉菜单的值// alert(e.target.value)this.$emit('changeId',e.target.value)}}}
</script><style>
</style>

注意:不是自己的数据不能用v-model实现双向绑定,只能通过将v-model拆解,利用父子通信的手段进行修改。

  1. 父组件v-model简化代码实现子组件和父组件的双向绑定

相比与上述代码并没有大致区别,只是将子组件的一些名字替换为value与input,从而在父组件中利用v-model实现数据绑定

v-model其实就是 :value和@input事件的简写
步骤:

  • 子组件:props通过value接收数据事件触发 input
  • 父组件v-model直接绑定数据
    在这里插入图片描述

输入框子组件通信

App.vue

<template><div class="app"><!-- <BaseSelect :value="inputValue" @input="inputValue = $event"></BaseSelect> --><!-- :value="inputValue" @input="inputValue = $event" 等价于v-model="inputValue" --><BaseSelect v-model="inputValue"></BaseSelect></div>
</template><script>
import BaseSelect from './components/BaseSelect.vue'
export default {data(){return{inputValue: 'i love china'}},components:{BaseSelect:BaseSelect}}
</script><style></style>

BaseSelect

<template><div><!-- 父传子 ::value="cityId" --><input type="text" :value="value" @change="handleChange"></div>
</template><script>
export default {props:{value: String },methods:{handleChange(e){//e.target.value 获取下拉菜单的值// alert(e.target.value)this.$emit('input',e.target.value)}}}
</script><style>
</style>

四、.sync修饰符(重要)

作用:可以实现子组件父组件双向绑定,简化代码
特点:prop属性名,可以自定义,非固定为value(用v-model)
场景:封装弹框类的基础组件,visible属性 true显示 false隐藏
本质:就是 :属性名@update:属性名 合写
子父组件的使用方式
在这里插入图片描述
弹出框数据
App.vue

<template><div class="app"><button @click=" isShow = true ">退出按钮</button><!-- :visible.sync 等价于  :visible  和@update:visible整合 --><!-- <BaseDialog :visible.sync="isShow"></BaseDialog> --><!-- $event用来接收  this.$emit('update:visible',false)的参数 --><BaseDialog :visible="isShow"  @update:visible=" isShow = $event"></BaseDialog></div>
</template><script>
import BaseDialog from './components/BaseDialog.vue'
export default {data() {return {isShow: false,}},components: {BaseDialog,}
}
</script><style>
</style>

BaseDialog

<template><div class="base-dialog-wrap" v-show="visible"><div class="base-dialog"><div class="title"><h3>温馨提示:</h3><button class="close" @click="close">x</button></div><div class="content"><p>你确认要退出本系统么?</p></div><div class="footer"><button @click="close">确认</button><button @click="close">取消</button></div></div></div>
</template><script>
export default {props: {visible: Boolean,},methods:{close(){this.$emit('update:visible',false)}}
}
</script><style scoped>
.base-dialog-wrap {width: 300px;height: 200px;box-shadow: 2px 2px 2px 2px #ccc;position: fixed;left: 50%;top: 50%;transform: translate(-50%, -50%);padding: 0 10px;
}
.base-dialog .title {display: flex;justify-content: space-between;align-items: center;border-bottom: 2px solid #000;
}
.base-dialog .content {margin-top: 38px;
}
.base-dialog .title .close {width: 20px;height: 20px;cursor: pointer;line-height: 10px;
}
.footer {display: flex;justify-content: flex-end;margin-top: 26px;
}
.footer button {width: 80px;height: 40px;
}
.footer button:nth-child(1) {margin-right: 10px;cursor: pointer;
}
</style>

五、ref和$ref

5.1、获取dom

在这里插入图片描述

BaseChart

<template><div class="base-chart-box"  ref="myCharts">子组件</div><!--  -->
</template><script>
// yarn add echarts 或者 npm i echarts
import * as echarts from 'echarts'
// import echarts from 'echarts'export default {mounted() {// 基于准备好的dom,初始化echarts实例// this.$refs.myCharts替代document.querySelector('.base-chart-box')查找范围是当前页面的盒子var myChart = echarts.init(this.$refs.myCharts)// 绘制图表myChart.setOption({title: {text: 'ECharts 入门示例',},tooltip: {},xAxis: {data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子'],},yAxis: {},series: [{name: '销量',type: 'bar',data: [5, 20, 36, 10, 10, 20],},],})},
}
</script><style scoped>
.base-chart-box {width: 400px;height: 300px;border: 3px solid #000;border-radius: 6px;
}
</style>

5.2、获取组件实例

在这里插入图片描述
App.vue

<template><div class="app"><h4>父组件 -- <button @click="getData">获取组件实例</button></h4><BaseFromVue ref="fromVue"></BaseFromVue><div><button @click="getData">获取数据</button><button @click="resetData">重置数据</button></div></div>
</template><script>
import BaseFromVue from './components/BaseFrom.vue'export default {components: {BaseFromVue :BaseFromVue},data(){return{user :{username : '',password : ''}}},methods: {getData(){var user =this.$refs.fromVue.getFromValue()// alert(user.username)this.user=user},resetData(){this.$refs.fromVue.resetFrom()}}
}
</script><style>
</style>

BaseFrom.vue

<template><div class="app"><div>账号: <input v-model="username" type="text"></div><div>密码: <input v-model="password" type="text"></div></div>
</template><script>
export default {data(){return{//定义数据username : '',password : ''}},methods:{//获取到表单数据并返回getFromValue(){console.log("用户名:"+this.username)return{username : this.username,password : this.password}},resetFrom(){this.username=''this.password=''}}
}
</script><style scoped>
.app {border: 2px solid #ccc;padding: 10px;
}
.app div{margin: 10px 0;
}
.app div button{margin-right: 8px;
}
</style>

六、Vue异步更新、$nextTick

需求:点击编辑按钮,显示编辑框,并让编辑框自动聚焦

this.isShowEdit = true   //控制显示this.$refs.inp.focus()  //利用ref得到Dom聚焦

问题:“显示后”,立即获取焦点失败
原因:Vue是异步更新Dom(提升性能)

解决方法:
$nextTick:等Dom更新后,才会触发方法里的函数体
语法:this. $ nextTick

 methods: {editFn() {// 显示输入框(异步dom更新)---this.$refs.inp获取不到Domthis.isShowEdit = true  //$nextTick()this.$nextTick(()=>{// 获取焦点this.$refs.inp.focus() })//setTimeout等待的时间不精准 -------- 推荐使用 $nextTick()//    setTimeout(() => {//      this.$refs.inp.focus() //    }, 100);}  }

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

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

相关文章

两个数组的交集-C语言/Java

描述 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。&#xff08;1 < nums1.length, nums2.length < 1000&#xff0c;0 < nums1[i], nums2[i] < 1000&#xff09; 示例1 输入…

一键批量修改文件夹名称,中文瞬间变日语,轻松搞定重命名

大家好&#xff01;现在为了更好地适应全球化发展&#xff0c;许多人都有了海外交流、旅行、学习的需求。但是难免遇到一个问题&#xff1a;在电脑中的中文文件夹名称如何快速翻译成日语&#xff1f; 首先&#xff0c;第一步&#xff0c;我们需要打开文件批量改名&#xff0c;…

AWS EKS 集群自动扩容 Cluster Autoscaler

文章目录 一&#xff0c;需求工作需求说明 二&#xff0c;部署精简命令执行1&#xff0c;要求2&#xff0c;查看EC2 Auto Scaling groups Tag3&#xff0c;创建Serviceaccount需要的Policy&#xff0c;Role4&#xff0c;部署Cluster Autoscaler5&#xff0c;验证6&#xff0c;常…

zotero在不同系统的安装(win/linux)

1 window系统安装 zotero 官网&#xff1a; https://www.zotero.org/ 官方文档 &#xff1a;https://www.zotero.org/support/ (官方)推荐常用的插件: https://www.zotero.org/support/plugins 入门视频推荐&#xff1a; Zotero 文献管理与知识整理最佳实践 点击 exe文件自…

【环境配置】Windows 10 安装 PyTorch 开发环境,以及验证 YOLOv8

Windows 10 安装 PyTorch 开发环境&#xff0c;以及验证 YOLOv8 最近搞了一台Windows机器&#xff0c;准备在上面安装深度学习的开发环境&#xff0c;并搭建部署YOLOv8做训练和测试使用&#xff1b; 环境&#xff1a; OS&#xff1a; Windows 10 显卡&#xff1a; RTX 3090 安…

DeepSort:基于检测的目标跟踪的经典

本文来自公众号“AI大道理” DeepSORT在SORT的基础上引入了深度学习的特征表示和更强大的目标关联方式&#xff0c;有效地减少了身份切换的数量&#xff0c;缓解了重识别问题。 ​ 1、DeepSORT简介 DeepSORT的主要思想是将目标检测和目标跟踪两个任务相结合。 首先使用目标检…

硬件产品经理:从入门到精通(新书发布)

目录 简介 新书 框架内容 相关课程 简介 在完成多款硬件产品从设计到推向市场的过程后。 笔者于2020年开始在产品领域平台输出硬件相关的内容。 在这个过程中经常会收到很多读者的留言&#xff0c;希望能推荐一些硬件相关的书籍或资料。 其实&#xff0c;笔者刚开始做硬…

10. 实现业务功能--退出登录

目录 1. 实现 Controller 2. 单体测试 3. 实现前端界面 退出的具体实现逻辑如下&#xff1a; 1. 用户访问退出接口 2. 服务器注销 Session( 在 Controller 中可以直接进行处理 &#xff09; 3. 返回成功或失败 4. 如果返回成功浏览器跳转到相应页面 5. 结束 一般来说&#…

使用VS2015打开.pro文件后,编译报错

编译报错内容&#xff1a; MSB8036 找不到 Windows SDK 版本10.0.18362.0。请安装所需的版本的 Windows SDK 或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更改 SD 方法&#xff1a; 1.右键点击 Solution上&#xff0c;在弹出的框中点击“Retarget…

调整数组使奇数全部都位于偶数前面

题目内容&#xff1a; 输入一个整数数组&#xff0c;实现一个函数&#xff0c; 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c; 所有偶数位于数组的后半部分。 题目思路&#xff1a; 将奇数部分放在前半部分&#xff0c;偶数部分放在后半部分&am…

学习笔记230804---restful风格的接口,delete的传参方式问题

如果后端提供的删除接口是restful风格&#xff0c;那么使用地址栏拼接的方式发送请求&#xff0c;数据放在主体中&#xff0c;后端接受不到&#xff0c;当然也还有一种可能&#xff0c;后端在这个接口的接参设置上是req.query接参。 问题描述 今天遇到的问题是&#xff0c;de…

新榜 | CityWalk本地生活商业价值洞察报告

如果说现在有人问&#xff0c;最新的网络热词是什么? “CityWalk”&#xff0c;这可能是大多数人的答案。 近段时间&#xff0c;“CityWalk”刷屏了各种社交媒体&#xff0c;给网友们带来了一场“城市漫步”之旅。 脱离群体狂欢&#xff0c;这个在社交媒体引发热议的词汇背后又…

首发 | FOSS分布式全闪对象存储系统白皮书

一、 产品概述 1. 当前存储的挑战 随着云计算、物联网、5G、大数据、人工智能等新技术的飞速发展&#xff0c;数据呈现爆发式增长&#xff0c;预计到2025年中国数据量将增长到48.6ZB&#xff0c;超过80%为非结构化数据。 同时&#xff0c;数字经济正在成为我国经济发展的新…

锐捷无线产品运维(Web登录、 命令行登录)

目录 登录AP产品 Console登录&#xff08;只可以现场登录&#xff09; Web/Telnet/SSH登录&#xff08;可以现场、远程登录&#xff09; 配置AP的管理地址 通过Web界面远程登录 通过Telnet、SSH等命令行的方式登录 登录AC产品 Console登录&#xff08;只可以现场登录&a…

[bug] 记录version `GLIBCXX_3.4.29‘ not found 解决方法

在使用mediapipe 这个库的时候&#xff0c;首次使用出现 GLIBCXX_3.4.29’ not found 错误&#xff0c; 看起来是安装mediapipe 的时候自动升级了 matplotlib 这个库&#xff0c;导致依赖的 libstd.so 版本不满足了&#xff0c;GLIBCXX_3.4.29 is an object from libstdc.so.…

【c语言】字符函数与字符串函数(上)

大家好呀&#xff0c;今天给大家分享一下字符函数和字符串函数&#xff0c;说起字符函数和字符串函数大家会想到哪些呢&#xff1f;&#xff1f;我想到的只有求字符串长度的strlen,拷贝字符串的strcpy,字符串比较相同的strcmp,今天&#xff0c;我要分享给大家的是我们一些其他的…

Photoshop制作漂亮光泽感3D按钮

原文链接(https://img-blog.csdnimg.cn/45472c07f29944458570b59fe1f9a0e0.png)

性能测试技术之基础篇(精华)

目录 一、什么是性能&#xff1f; 二、什么是性能测试&#xff1f; 三、性能测试结果需要记录哪些参数&#xff1f; 四、如何做性能测试&#xff08;性能测试流程&#xff09;&#xff1f; 1、指标建模 2、诊断调优 五、常见性能测试工具 一、什么是性能&#xff1f; …

【C语言】字符函数和字符串函数

目录 1.求字符串长度strlen 2.长度不受限制的字符串函数 字符串拷贝strcpy 字符串追加strcat 字符串比较strcmp 3.长度受限制的字符串函数介绍strncpy strncat ​编辑strncmp 4.字符串查找strstr 5.字符串分割strtok 6.错误信息报告 strerror perror 7.字符分类函…