当前位置: 首页 > news >正文

Vue 组件 - 指令

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue指令

 

目录

指令写法

自定义指令

简单封装指令

指令传递字符串

update事件

指令应用

指令实现轮播

指令函数简写

指令函数列表

bind

inserted

update

componentUpdated

unbind

Vue3指令轮播

nextick

总结


指令写法

指令:为了操作底层dom。

实际应用:可以通过指令知道什么时候dom创建完成,从而进行依赖dom的库初始化工作。

自定义指令

对普通dom元素进行底层操作。

编写一个输入框,当被绑定的元素插入到dom中时,

输入框获取焦点。

示例如下:

<div id="box"><input v-focus name="name" />
</div>
<script src="../lib/vue.js"></script>
<script>// 注册一个全局自定义指令 'v-focus'Vue.directive("focus", {// 当被绑定的元素插入到dom中时inserted:function(el) {// 聚焦元素el.focus()}})new Vue({el:"#box"})
</script>

 

简单封装指令

做一个简单的指令封装。

示例如下:

<div id="box"><div v-hello>你好 vue</div>
</div>
<script src="../lib/vue.js"></script>
<script>Vue.directive("hello", {// 指令的生命周期inserted(el) {console.log("inserted", el)el.style.background = "red"}})new Vue({el:"#box"})
</script>

 

指令传递字符串

如果在参数中不包含单引符号,则识别为状态,需要提前定义好。

示例如下:

<div id="box"><div v-hello=" 'yellow'">你好 vue</div><div v-hello=" 'blue'">你好 vue</div>
</div>
<script src="../lib/vue.js"></script>
<script>Vue.directive("hello", {// 指令的生命周期inserted(el, binging) {console.log("inserted", binging)el.style.background = binging.value}})new Vue({el:"#box"})
</script>

inserted事件,是在第一次插入到父节点时触发。

update事件

可以在update触发事件中修改值进行指令赋值。

示例如下:

<div id="box"><div v-hello=" 'yellow'">你好 vue</div><div v-hello=" 'blue'">你好 vue</div><div v-hello="whichColor">你好 vue</div>
</div>
<script src="../lib/vue.js"></script>
<script>Vue.directive("hello", {// 指令的生命周期inserted(el, binging) {console.log("inserted", binging)el.style.background = binging.value},update(el, binging) {console.log("update")el.style.background = binging.value}})let vm = new Vue({el:"#box",data : {whichColor: "red"}})
</script>

效果:

指令应用

指令实现轮播

使用指令来完成轮播。

因为不知道什么时候数据什么时候插入的,直接绑定一个指令。

给指令传递对象参数。

示例如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="../lib/swiper-bundle.css"><style>.swiper-container {width: 600px;height: 300px;}</style>
</head>
<body>
<div id="box"><header>导航</header><div class="swiper-container demo"><div class="swiper-wrapper"><div class="swiper-slide" v-for="(data, index) in datalist" :key="data" v-swiper="{index:index,length:datalist.length}"><img :src="data" alt=""/></div></div><!-- 如果需要分页器 --><div class="swiper-pagination"></div></div><footer>底部内容</footer>
</div>
<script src="../lib/swiper-bundle.js"></script>
<script src="../lib/vue.js"></script>
<script>Vue.directive("swiper", {// 指令的生命周期inserted(el, binging) {let {index,length} = binging.valueif (index === length - 1) {new Swiper(".demo", {// 如果需要分页器pagination: {el: '.swiper-pagination',},loop:true,autoplay: {delay: 2500,disableOnInteraction:false}})}}})new Vue({el: '#box',data: {datalist:[],},mounted() {// ajaxsetTimeout(()=> {this.datalist = ["https://tsj.youdubook.com/cover/book_cover_1372.jpg","https://tsj.youdubook.com/cover/book_cover_6.jpg","https://tsj.youdubook.com/cover/book_cover_265.jpg","https://tsj.youdubook.com/cover/book_cover_2819.jpg","https://tsj.youdubook.com/cover/book_cover_219.jpg"]}, 2000)}})
</script>
</body>
</html>

 

指令函数简写

这种方式,更新和创建都会触发,如果两种触发都是同样的处理可以使用简写方式。

示例如下:

Vue.directive("hello", ()=> {console.log("创建或者更新都会执行")
})

 

指令函数列表

bind

只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

inserted

被绑定元素插入父节点时调用(仅保证父节点存在,但不一定已被插入文档中)。

update

所在组件的VNode更新时调用,但是可能发生在其子VNode更新之前。指令的值可以发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。

componentUpdated

指令所在组件的VNode及其子VNode全部更新后调用。

unbind

只调用一次,指令与元素解绑时调用。

Vue3指令轮播

使用app.directive()定义指令

生命周期需要更换inserted更换为mounted

示例如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="../lib/swiper-bundle.css"><style>.swiper-container {width: 600px;height: 300px;}</style>
</head>
<body>
<div id="box"><header>导航</header><div class="swiper-container demo"><div class="swiper-wrapper"><div class="swiper-slide" v-for="(data, index) in datalist" :key="data" v-swiper="{index:index,length:datalist.length}"><img :src="data" alt=""/></div></div><!-- 如果需要分页器 --><div class="swiper-pagination"></div></div><footer>底部内容</footer>
</div>
<script src="../lib/swiper-bundle.js"></script>
<script src="../lib/vue.next.js"></script>
<script>let obj = {data() {return {datalist:[]}},mounted() {// ajaxsetTimeout(()=> {this.datalist = ["https://tsj.youdubook.com/cover/book_cover_1372.jpg","https://tsj.youdubook.com/cover/book_cover_6.jpg","https://tsj.youdubook.com/cover/book_cover_265.jpg","https://tsj.youdubook.com/cover/book_cover_2819.jpg","https://tsj.youdubook.com/cover/book_cover_219.jpg"]}, 2000)}}let app = Vue.createApp(obj)// app.component()// app.component()app.directive("swiper", {// 指令的生命周期mounted(el, binging) {let {index,length} = binging.valueif(index === length - 1) {new Swiper(".demo", {// 如果需要分页器pagination: {el: '.swiper-pagination',},loop:true,autoplay: {delay: 2500,disableOnInteraction:false}})}}})app.mount("#box")
</script>
</body>
</html>

 

nextick

当数据更新到dom中时,会触发一次性的监听事件。

示例如下:

let obj = {data() {return {datalist:[]}},mounted() {// ajaxsetTimeout(()=> {this.datalist = ["https://tsj.youdubook.com/cover/book_cover_1372.jpg","https://tsj.youdubook.com/cover/book_cover_6.jpg","https://tsj.youdubook.com/cover/book_cover_265.jpg","https://tsj.youdubook.com/cover/book_cover_2819.jpg","https://tsj.youdubook.com/cover/book_cover_219.jpg"]}, 2000)this.$nextTick(() => {console.log("比updated执行的都晚,而且只执行一次")})}
}

可以在tick中处理实例化,会在数据源更新后,触发一次实例化。

示例如下:

let obj = {data() {return {datalist:[]}},mounted() {// ajaxsetTimeout(()=> {this.datalist = ["https://tsj.youdubook.com/cover/book_cover_1372.jpg","https://tsj.youdubook.com/cover/book_cover_6.jpg","https://tsj.youdubook.com/cover/book_cover_265.jpg","https://tsj.youdubook.com/cover/book_cover_2819.jpg","https://tsj.youdubook.com/cover/book_cover_219.jpg"]}, 2000)this.$nextTick(() => {console.log("比updated执行的都晚,而且只执行一次")new Swiper(".demo", {// 如果需要分页器pagination: {el: '.swiper-pagination',},loop:true,autoplay: {delay: 2500,disableOnInteraction:false}})})}
}

总结

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue指令介绍及应用示例

相关文章:

  • Python中re模块结合正则表达式的应用
  • springboot拦截器的基本配置
  • OSCP备战-SickOs1.2靶场详细步骤
  • WPF 按钮悬停动画效果实现
  • 大数据如何赋能市场情报分析?——精准决策,从数据开始
  • Bently Nevada 135473-01振动监控模块3500系列状态系统
  • 强化学习极简入门笔记
  • 技术文档撰写指南:从结构到细节的全流程解析
  • 小白玩串口控制的ASCII避坑
  • 计算机网络常见体系结构、分层必要性、分层设计思想以及专用术语介绍
  • MySQL 查询语句的执行顺序
  • 在 WSL Ubuntu-24.04 上安装 Nacos 2.5.1 并使用 MySQL 数据库
  • Knife4j框架的使用
  • HOW - 简历和求职面试宝典(二)
  • 基于MATLAB实现SFA(Slow Feature Analysis,慢特征分析)算法
  • 湖北理元理律师事务所债务优化实践:在还款与生活间寻找平衡支点
  • 网络摄像机POE交换机选型指南:技术参数与场景适配深度解析
  • 多语种OCR识别系统,引领文字识别新时代
  • 深入剖析网络协议:七层协议与四层协议详解
  • 本地socket间通信,可以直接使用read读取socket中的结构体
  • 国外前端 网站/哈尔滨网站建设
  • 温州网站建设制作/培训心得总结
  • 为拟建设的网站申请一个域名/推广是什么意思
  • 网站正在建设模板/西安网站设计
  • 网站建设进度/宁波免费seo排名优化
  • 济南高新网站建设/石家庄最新消息今天