前端技术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.rhkb.cn/news/103699.html

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

相关文章

react-sortable-hoc 拖拽列表上oncick事件失效

const SortableItem SortableElement(({value, onChangePayment}) > {const onClickItem () > {// todo}return (<View className"-item" onClick{onClickItem}>xxxxxxx</View>) })问题&#xff1a;onClick 无效 解决&#xff1a;添加distance

java八股文面试[java基础]——接口和抽象类的区别

知识来源&#xff1a; 【基础】接口和抽象类_哔哩哔哩_bilibili 【2023年面试】Java中抽象类和接口有什么区别_哔哩哔哩_bilibili 【23版面试突击】抽象类和接口的区别&#xff0c;类可以继承多个类么&#xff0c;接口可以继承多个接口么,类可以实现多个接口么&#xff1f;_…

中文医学知识语言模型:BenTsao

介绍 BenTsao&#xff1a;[原名&#xff1a;华驼(HuaTuo)]: 基于中文医学知识的大语言模型指令微调 本项目开源了经过中文医学指令精调/指令微调(Instruction-tuning) 的大语言模型集&#xff0c;包括LLaMA、Alpaca-Chinese、Bloom、活字模型等。 我们基于医学知识图谱以及医…

Linux服务——http协议及nginx服务

目录 一、HTTP协议 1、跨网络的主机间通讯方式 套接字相关的系统调用 2、HTTP协议访问网站的过程 3、http协议状态码分类 常见的http协议状态码 4、MIME 5、URL组成 6、HTTP协议版本 7、系统处理http请求的工作模式 8、apache与nginx的区别 二、I/O模型 I/O模型相关…

javascript闭包

javascript闭包 函数getNum想访问内部函数fn中的变量fg&#xff0c;就形成了闭包。 用途&#xff1a; 增加了内部函数变量的寿命 缺点&#xff1a; 会造成内存泄露

使用VisualStudio制作上位机(二)

文章目录 使用VisualStudio制作上位机(二)第三部分:GUI内部函数设计使用VisualStudio制作上位机(二) Author:YAL 第三部分:GUI内部函数设计 事件添加 给窗体或窗体按钮相关的操作添加事件有两种方式,事件的名字直白的表面了这是什么事件。 直接双击界面,自动生成窗…

微信公众号关注/取消订阅事件一文详解

一、背景介绍 这周期的项目需求中需要做一个引导用户关注微信公众号的功能&#xff0c;但是引导用户关注的前提是需要实时获取当前用户是否已经关注微信公众号,如果光看官方文档还是对于一些小伙伴来说比较无从下手&#xff0c;所以我来分享以下我做的过程中遇到的问题以及解决…

HTTP与RPC的取舍

HTTP与RPC的取舍 HTTP和RPC都是常用的网络通信协议&#xff0c;它们各有优劣。选择何种协议&#xff0c;主要取决于应用的需求和场景。 HTTP和RPC都有各自的优点和缺点&#xff0c;首先我们对两种协议进行一个总结。 HTTP协议图 HTTP的优点&#xff1a; 广泛的支持&#xff1…

leetcode:338. 比特位计数(python3解法)

难度&#xff1a;简单 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a; 0…

在自定义数据集上使用 Detectron2 和 PyTorch 进行人脸检测

本文讲讲述如何使用Python在自定义人脸检测数据集上微调预训练的目标检测模型。学习如何为Detectron2和PyTorch准备自定义人脸检测数据集&#xff0c;微调预训练模型以在图像中找到人脸边界。 人脸检测是在图像中找到&#xff08;边界的&#xff09;人脸的任务。这在以下情况下…

【Java】树结构SQL数据的如何去实现搜索

这里写自定义目录标题 需要实现的效果前端需要的json格式&#xff1a;一定是一个完整的树结构错误错误的返回格式错误的返回格式实现的效果 正确正确的返回格式正确的展示画面 后端逻辑分析代码总览 数据库表结构 需要实现的效果 前端需要的json格式&#xff1a;一定是一个完整…

STM32F4X USART串口使用

STM32F4X USART串口使用 串口概念起始位波特率数据位停止位校验位串口间接线 STM32F4串口使用步骤GPIO引脚复用函数串口初始化函数串口例程 串口概念 串口是MCU与外部通信的重要通信接口&#xff0c;也是MCU在开发过程中的调试利器。串口通信有几个重要的参数&#xff0c;分别…

java8:HashMap的实现原理

一概述 这个哈希表是基于 Map 接口的实现的&#xff0c;它允许 null 值和null 键&#xff0c;它不是线程同步的&#xff0c;同时也不保证有序。 Map 的这种实现方式为 get&#xff08;取&#xff09;和 put&#xff08;存&#xff09;带来了比较好的性能。但是如果涉及到大量的…

如何使用自动化测试工具Selenium?

哈喽&#xff0c;大家好&#xff0c;我是小浪。那么有一段时间没有更新了&#xff0c;还是在忙实习和秋招的事情&#xff0c;那么今天也是实习正式结束啦&#xff0c;开始继续更新我们的学习博客&#xff0c;后期主要是开发和测试的学习博客内容巨多&#xff0c;感兴趣的小伙伴…

Qt 编译使用Bit7z库接口调用7z.dll、7-Zip.dll解压压缩常用Zip、ISO9660、Wim、Esd、7z等格式文件(一)

bit7z一个c静态库&#xff0c;为7-zip共享库提供了一个干净简单的接口 使用CMAKE重新编译github上的bit7z库&#xff0c;用来解压/预览iso9660&#xff0c;WIm&#xff0c;Zip,Rar等常用的压缩文件格式。z-zip库支持大多数压缩文件格式 导读 编译bit7z(C版本)使用mscv 2017编译…

【LeetCode-困难题】42. 接雨水

题目 题解一&#xff1a;暴力双重for循环&#xff08;以行计算水量&#xff09; 1.先找出最高的柱子有多高&#xff08;max 3&#xff09; 2.然后第一个for为行数&#xff08;1&#xff0c;2&#xff0c;3&#xff09; 3.第二个for计算每一行的雨水量&#xff08;关键在于去除…

Dubbo重启服务提供者或先启动服务消费者后启动服务提供者,消费者有时候会出现找不到服务的问题及解决

文章目录 [toc] 1.环境2.版本3.pom依赖3.1父工程的pom3.2子模块的pom 4.问题5.根本原因5.1根本原因说明5.2总入口5.3servletWeb容器初始化5.4 nacos服务注册监听点5.5 dubbo启动服务注册监听点 6.解决办法6.1降低springBoot版本为2.2.x6.2 修改源码6.2.1修改源码方式一6.2.2修改…

机器学习笔记之优化算法(十六)梯度下降法在强凸函数上的收敛性证明

机器学习笔记之优化算法——梯度下降法在强凸函数上的收敛性证明 引言回顾&#xff1a;凸函数与强凸函数梯度下降法&#xff1a;凸函数上的收敛性分析 关于白老爹定理的一些新的认识梯度下降法在强凸函数上的收敛性收敛性定理介绍结论分析证明过程 引言 本节将介绍&#xff1a…

探索PDF校对:为何这是现代数字文档的关键步骤

在今日的数字化浪潮中&#xff0c;文档的创建与分享从未如此频繁。尤其是PDF&#xff0c;作为一个普遍接受的标准文件格式&#xff0c;其在企业、学术和日常生活中的应用已经无处不在。但随之而来的挑战是如何确保文档的准确性和专业性。让我们深入探索PDF校对的重要性以及它为…

Linux 定时任务 crontab 用法学习整理

一、linux版本 lsb_release -a 二、crontab 用法学习 2.1&#xff0c;crontab 简介 linux中crontab命令用于设置周期性被执行的指令&#xff0c;该命令从标准输入设备读取指令&#xff0c;并将其存放于“crontab”文件中&#xff0c;以供之后读取和执行。cron 系统调度进程。…