Vue2基础七、refnextTick自定义指令

零、文章目录

Vue2基础七、ref&nextTick&自定义指令

1、ref

  • **作用:**利用 ref 和 $refs 可以用于 获取 dom 元素, 或 组件实例
  • **特点:**查找范围 → 当前组件内 (更精确稳定),用document.querySelect(‘.box’) 获取的是整个页面中的盒子

(1)获取 dom

  • 目标标签 – 添加 ref 属性
<div ref="chartRef">我是渲染图表的容器</div>
  • 恰当时机, 通过 this.$refs.xxx, 获取目标标签
mounted () {console.log(this.$refs.chartRef)
},

(2)获取组件

  • 目标组件 – 添加 ref 属性
<BaseForm ref="baseForm"></BaseForm>
  • 恰当时机, 通过 this.$refs.xxx, 获取目标组件,就可以调用组件对象里面的方法
this.$refs.baseForm.组件方法()

(3)代码演示

  • 安装echart
yarn add echarts
  • 父组件App.vue
<template><div class="app"><div class="base-chart-box">这是一个捣乱的盒子</div><BaseChart></BaseChart></div>
</template><script>
import BaseChart from './components/BaseChart.vue'
export default {components:{BaseChart}
}
</script><style>
.base-chart-box {width: 300px;height: 200px;
}
</style>
  • 子组件BaseChart.vue
<template><div class="base-chart-box" ref="baseChartBox">子组件</div>
</template><script>
import * as echarts from 'echarts'export default {mounted() {// 基于准备好的dom,初始化echarts实例// document.querySelector 会查找项目中所有的元素// $refs只会在当前组件查找盒子// var myChart = echarts.init(document.querySelector('.base-chart-box'))var myChart = echarts.init(this.$refs.baseChartBox)// 绘制图表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>
  • 效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmBy90dR-1690447474327)(https://bluecusliyoupicrep.oss-cn-hangzhou.aliyuncs.com/202307131641861.png)]

2、nextTick

(1)异步更新问题

  • 需求:编辑标题, 编辑框自动聚焦

    • 点击编辑,显示编辑框
    • 让编辑框,立刻获取焦点
    this.isShowEdit = true // 显示输入框
    this.$refs.inp.focus() // 获取焦点
    
  • 问题:“显示之后”,立刻获取焦点是不能成功的!

  • 原因:Vue 是 异步更新 DOM (提升性能)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1BdzLqJY-1690447474329)(https://bluecusliyoupicrep.oss-cn-hangzhou.aliyuncs.com/202307131654743.png)]

(2)$nextTick解决问题

  • $nextTick:等 DOM 更新后, 才会触发执行此方法里的函数体
  • 语法: this.$nextTick(函数体)
this.$nextTick(() => {
this.$refs.inp.focus()
})
  • 注意:$nextTick 内的函数体 一定是箭头函数,这样才能让函数内部的this指向Vue实例

(3)代码实现

<template><div class="app"><div v-if="isShowEdit"><input type="text" v-model="editValue" ref="inp" /><button>确认</button></div><div v-else><span>{{ title }}</span><button @click="editFn">编辑</button></div></div>
</template><script>
export default {data() {return {title: '大标题',isShowEdit: false,editValue: '',}},methods: {editFn() {// 显示输入框this.isShowEdit = true  // // 获取焦点// this.$refs.inp.focus() this.$nextTick(() => {this.$refs.inp.focus()})}  },
}
</script> 

3、自定义指令

(1)指令分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJamBXtu-1690447474330)(https://bluecusliyoupicrep.oss-cn-hangzhou.aliyuncs.com/202307141042338.png)]

(2)自定义指令

  • 自定义指令:自己定义的指令, 可以封装一些 dom 操作, 扩展额外功能

  • 自定义指令语法:

    • 全局注册
    //在main.js中
    // 1. 全局注册指令
    Vue.directive('focus', {// inserted 会在 指令所在的元素,被插入到页面中时触发inserted (el) {// el 就是指令所绑定的元素// console.log(el);el.focus()}
    })
    
    • 局部注册
    //在Vue组件的配置项中
    directives: {"指令名": {inserted () {// 可以对 el 标签,扩展额外功能el.focus()}}
    }
    
    • 使用指令

      • 在使用指令的时候,一定要先注册,再使用,否则会报错
      • 使用指令语法: v-指令名。如:<input type="text" v-focus/>
      • 注册指令时不用加v-前缀使用时要加v-前缀
      <input v-focus type="text">
      
    • 指令中的配置项介绍

      • inserted:被绑定元素插入父节点时调用的钩子函数
      • el:使用指令的那个DOM元素
  • 完整代码实现:

    • 需求:当页面加载时,让元素获取焦点(autofocus在safari浏览器有兼容性
<template><div><h1>自定义指令</h1><input v-focus type="text"></div>
</template><script>
export default {// 2. 局部注册指令directives: {// 指令名:指令的配置项focus: {inserted (el) {el.focus()}}}
}
</script><style></style>

(3)自定义指令的值

  • 需求:实现一个 color 指令 - 传入不同的颜色, 给标签设置文字颜色

  • 语法:

    • v-指令名 = "指令值" ,通过 等号 可以绑定指令的值
    <div v-color="color">我是内容</div>
    
    • 通过 binding.value 可以拿到指令值,通过 update 钩子,可以监听指令值的变化,进行dom更新操作
    directives: {color: {inserted (el, binding) {el.style.color = binding.value},update (el, binding) {el.style.color = binding.value}}
    }
    
  • 完整代码实现:

<template><div><h1 v-color="color1">指令的值1测试</h1><h1 v-color="color2">指令的值2测试</h1></div>
</template><script>
export default {data () {return {color1: 'red',color2: 'orange'}},directives: {color: {// 1. inserted 提供的是元素被添加到页面中时的逻辑inserted (el, binding) {// console.log(el, binding.value);// binding.value 就是指令的值el.style.color = binding.value},// 2. update 指令的值修改的时候触发,提供值变化后,dom更新的逻辑update (el, binding) {console.log('指令的值修改了');el.style.color = binding.value}}}
}
</script><style></style>

(4)v-loading 指令封装

  • 场景:实际开发过程中,发送请求需要时间,在请求的数据未回来时,页面会处于空白状态 => 用户体验不好
  • 需求:封装一个 v-loading 指令,实现加载中的效果

image-20230714110226535

  • 分析:

    • 本质 loading 效果就是一个蒙层,盖在了盒子上
    • 数据请求中,开启loading状态,添加蒙层
    • 数据请求完毕,关闭loading状态,移除蒙层
  • 实现思路:

    • 准备一个 loading 类,通过伪元素定位,设置宽高,实现蒙层
    • 开启关闭 loading 状态(添加移除蒙层),本质只需要添加移除类即可
    • 结合自定义指令的语法进行封装复用
  • 代码实现:

<template><div class="main"><div class="box" v-loading="isLoading"><ul><li v-for="item in list" :key="item.id" class="news"><div class="left"><div class="title">{{ item.title }}</div><div class="info"><span>{{ item.source }}</span><span>{{ item.time }}</span></div></div><div class="right"><img src="./assets/img/news.png" alt=""></div></li></ul></div></div>
</template><script>
export default {data () {return {list: [],isLoading: true}},created () {// 更新到 list 中,用于页面渲染 v-forthis.list = [{id:1,title:'testtitle1',source:'testsource1',time:'testtime1'},{id:2,title:'testtitle2',source:'testsource2',time:'testtime2'}]//三秒后loading移除setTimeout(()=>{this.isLoading = false}, 3000);},directives: {loading: {inserted (el, binding) {binding.value ? el.classList.add('loading') : el.classList.remove('loading')},update (el, binding) {binding.value ? el.classList.add('loading') : el.classList.remove('loading')}}}
}
</script><style>
.loading:before {content: '';position: absolute;left: 0;top: 0;width: 100%;height: 100%;background: #fff url('./assets/img/loading.gif') no-repeat center;
}.box2 {width: 400px;height: 400px;border: 2px solid #000;position: relative;
}.box {width: 800px;min-height: 500px;border: 3px solid orange;border-radius: 5px;position: relative;
}
.news {display: flex;height: 120px;width: 600px;margin: 0 auto;padding: 20px 0;cursor: pointer;
}
.news .left {flex: 1;display: flex;flex-direction: column;justify-content: space-between;padding-right: 10px;
}
.news .left .title {font-size: 20px;
}
.news .left .info {color: #999999;
}
.news .left .info span {margin-right: 20px;
}
.news .right {width: 160px;height: 120px;
}
.news .right img {width: 100%;height: 100%;object-fit: cover;
}
</style>

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

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

相关文章

nacos安装与基础配置

源码 https://github.com/alibaba/nacos https://gitee.com/mirrors/Nacos 编译 git clone https://github.com/alibaba/nacos.git cd nacos/ mvn -Prelease-nacos -Dmaven.test.skiptrue clean install -U ls -al distribution/target/// change the $version to your ac…

【数据结构】实验八:树

实验八 树 一、实验目的与要求 1&#xff09;理解树的定义&#xff1b; 2&#xff09;掌握树的存储方式及基于存储结构的基本操作实现&#xff1b; 二、 实验内容 题目一&#xff1a;采用树的双亲表示法根据输入实现以下树的存储&#xff0c;并实现输入给定结点的双亲结点…

基于罪名法务智能知识图谱(含码源):基于280万罪名预测、20W法务问答与法律资讯问答功能

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

如何构建适合自己的DevOps软件测试改进方案

​目录 DevOps成熟度模型分析 构建适合企业自身性能的测试过程改进框架 资料获取方法 根据2022年的DevOps全球调查报告显示&#xff0c;主流软件企业采用或部分采用DevOps且已获得良好成效的占比已达70%&#xff0c;DevOps俨然成为当下软件开发研究的重要方向。 测试作为软…

uni-app 微信小程序:启用组件按需注入

uni-app 微信小程序&#xff1a;启用组件按需注入 文章目录 uni-app 微信小程序&#xff1a;启用组件按需注入一、官方文档按需注入注意事项 二、HBuilder X 设置三、效果 一、官方文档 https://developers.weixin.qq.com/miniprogram/dev/framework/ability/lazyload.html 按…

内存泄漏是什么?有什么危害

内存泄漏是什么&#xff1f;有什么危害 1. 前言1.内存泄漏是什么&#xff1f;2. 为什么会发生内存泄漏3. 内存泄漏的危害4. 总结 1. 前言 在各种项目开发中&#xff0c;内存泄漏是一个很严重的问题。对资源管理、性能优越、系统稳定性&#xff0c;以及是否安全产生极大印象。本…

CCD光斑图像质量分析仪的作用和工作原理

激光光斑的成型在激光加工中起着至关重要的作用&#xff0c;在实际加工中激光可以被变换成各种形状以满足加工需求&#xff0c;激光光斑的形状大致可以被分为四种&#xff1a;矩形、环形、椭圆形、线形。矩形的激光光斑适用于激光切割、激光焊接&#xff0c;环形的激光光斑适用…

【Python入门系列】第十八篇:Python自然语言处理和文本挖掘

文章目录 前言一、Python常用的NLP和文本挖掘库二、Python自然语言处理和文本挖掘1、文本预处理和词频统计2、文本分类3、命名实体识别4、情感分析5、词性标注6、文本相似度计算 总结 前言 Python自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&…

注解和反射02--Java反射

反射 动态和静态语言获取反射对象Java反射机制提供的功能Java反射优缺点反射相关的主要API 动态和静态语言 要学习反射&#xff0c;首先我们需要了解一下静态和动态语言。 动态语言&#xff1a;是一类在运行时可以改变其结构的语言&#xff1a;例如新的函数、对象、甚至代码可…

C语言习题练习

C语言习题练习 一、offsetof宏二、交换奇偶位三、原地移除数组总结 一、offsetof宏 首先我们要了解什么是offsetof宏&#xff1a; . 此具有函数形式的宏返回数据结构或联合类型中成员成员的偏移值&#xff08;以字节为单位&#xff09;。 . 返回的值是size_t类型的无符号整数…

Is Mapping Necessary for Realistic PointGoal Navigation 论文阅读和代码分析

论文 论文信息 题目&#xff1a;Is Mapping Necessary for Realistic PointGoal Navigation? 作者&#xff1a;Ruslan Partsey、 Erik Wijmans 代码地址&#xff1a;rpartsey.github.io/pointgoalnav 来源&#xff1a;CVPR Abstract 目标&#xff1a;证明显式地图不是成功…

【数据结构】实验九:二叉树

实验九 二叉树 一、实验目的与要求 1&#xff09;理解二叉树的类型定义&#xff1b; 2&#xff09;掌握二叉树的存储方式及基于存储结构的基本操作实现&#xff1b; 二、 实验内容 1. 二叉树的结点定义如下&#xff1a; struct TreeNode { int m_nvalue; TreeNode* m_…

多源BFS-- 矩阵距离

关于多源BFS&#xff0c;基本上就是单源BFS的简单升级了一下&#xff0c;比如在queue中队头开始时只有一个&#xff0c;我们通过这一个队头去推导其他的东西。而多源最短路就是队头一开始有1-n个可能的数&#xff0c;一个一个去BFS。 题目思路&#xff1a; 这个题就直接把所有的…

HummerRisk V1.3.0 发布

HummerRisk V1.3.0发布&#xff1a; 大家好&#xff0c;HummerRisk 1.3.0和大家见面了&#xff0c;在这个版本中我们继续在多云接入管理、多云检测方式、云资源态势方面提供新的能力&#xff0c;并增加了新的镜像仓库支持类型&#xff0c;并优化了云的区域选择、优化规则组内容…

C#时间轴曲线图形编辑器开发1-基本功能

目录 一、前言 1、简介 2、开发过程 3、工程下载链接 二、基本功能实现 1、绘图面板创建 &#xff08;1&#xff09;界面布置 &#xff08;2&#xff09;显示面板代码 &#xff08;3&#xff09; 面板水平方向、竖直方向移动功能实现 &#xff08;4&#xff09;面板放…

【数据结构】实验五:栈

实验五 栈 一、实验目的与要求 1&#xff09;熟悉栈的类型定义和基本操作&#xff1b; 2&#xff09;灵活应用栈解决具体应用问题。 二、实验内容 1、判断回文数&#xff0c;回文是指正读反读均相同的字符序列&#xff0c;如“1221”和“12321”均是回文&#xff0c;但“…

与传统透明屏相比,BOE透明屏有哪些特点优势?

BOE透明屏是一种新型的显示技术&#xff0c;它能够实现透明度高达90%以上的显示效果。这种屏幕可以应用于各种领域&#xff0c;如商业展示、智能家居、汽车行业等&#xff0c;具有广阔的市场前景。 BOE透明屏采用了先进的光学技术&#xff0c;通过控制光的传播和折射&#xff…

自建纯内网iot平台服务,软硬件服务器全栈实践

基于以下几个考虑&#xff0c;自制硬件设备&#xff0c;mqtt内网服务器。 1.米家app不稳定&#xff0c;逻辑在云端或xiaomi中枢网关只支持少部分在本地计算。 2.监控homeassistant官方服务有大量数据交互。可能与hass安装小米账户有关。 3.硬件&#xff1a;原理图&#xff0c;l…

【KVC补充 Objective-C语言】

一、KVC补充 好,那么接下来,再给大家说一下这个KVC 1.首先我们说,这个KVC,就是指的什么 key value coding 吧 全称就是叫做(Key Value Coding),这是它的全称 那么,你在帮助文档里面搜的时候,你就搜key-value coding 是不是这个啊,key-value coding 然后点击,进…

Unity XML3——XML序列化

一、XML 序列化 ​ 序列化&#xff1a;把对象转化为可传输的字节序列过程称为序列化&#xff0c;就是把想要存储的内容转换为字节序列用于存储或传递 ​ 反序列化&#xff1a;把字节序列还原为对象的过程称为反序列化&#xff0c;就是把存储或收到的字节序列信息解析读取出来…