iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Vue的指令中如何实现传递更多参数
  • 326
分享到

Vue的指令中如何实现传递更多参数

2023-06-30 16:06:05 326人浏览 八月长安
摘要

本篇内容主要讲解“Vue的指令中如何实现传递更多参数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue的指令中如何实现传递更多参数”吧!基本原理本文介绍的指令扩展方法,主要以闭包为基础,并且使

本篇内容主要讲解“Vue的指令中如何实现传递更多参数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue的指令中如何实现传递更多参数”吧!

基本原理

本文介绍的指令扩展方法,主要以闭包为基础,并且使用了一些函数参数柯里化的方式来管理多个参数的传递过程。

我们以Vue2.0的指令定义方式为例,说明基本原理。本文所使用的指令定义方式,都已基于插件化的定义方式,在main.js中,通过use方法使用。

示例代码如下:

const myDirective = {    install(app,options){        app.directive("img-load", {            bind:function(el,binding,vnode){ },            inserted:function(el,binding,vnode){ },            update:function(el,binding,vnode){ },            componentUpdated:function(el,binding,vnode){ },            unbind:function(el,binding,vnode){ },        });    }};export default myDirective ;

按照上述标准的指令定义方式,无论使用哪个钩子函数,我们只能传递三个参数,指令所绑定的DOM元素,指令接收的APP中绑定参数和虚拟节点。

基于闭包的扩展方案

指令的钩子函数参数已经固定,我们无法修改。但是我们可以通过闭包设置钩子函数的作用域,让闭包函数来接收更多参数。

代码如下: 

export default function getMyDirective(Vue) {    return class MyDirective{        constructor(options) {            this.options = options;            this.bindDirective= this.bindDirective.bind(this);        }        bindDirective(el, bindings) {                                }    }}const myDirective = {    install(app,options){         const DirectiveClass = getMyDirective(app) ;        var myDirective = new DirectiveClass(options);        app.directive("my-dirctive", {            bind:myDirective.bindDirective        });    }};
  • 使用闭包函getMyDirective来包裹钩子函数bindDirective

  • 闭包函数是用户自定义函数,我们可以设置任意多个参数

  • 在闭包函数中定义类来封装指令的所有操作,构造方法也可以接收参数,从而将多个参数柯里化分割。

  • 通过bind方法强行将指令钩子函数绑定的bindDirective方法的this限定为MyDirective的实例,也就是说,bindDirective方法可以通过this访问更多的数据。

JS中函数具有独立作用域,所以指令的绑定方法bindDirective在执行过程中,可以在不受任何外界其他代码的干扰下,使用闭包函数传递的参数。

实例和代码实现

本文以一个图片自动加载的指令为例,介绍自定义指令的参数扩展方式。

自定义指令的基本功能是根据图片的URL地址加载并显示图片,具体实现包括:

  • 通过指令动态参数获取图片地址

  • 首先在页面中显示一个正在加载的图片

  • 加载指定地址图片,如果加载成功,正常显示

  • 加载失败,显示一张加载出错的图片

本文以自顶向下的方式来介绍该实例的代码实现

Main.js中将指令对应的插件全局化

使用use方法,在全局定义插件ImageLoad,该插件主要是功能是在全局定义一个图片加载指令,为该指令接收一个全局配置,即加载中图片地址和加载失败的图片地址。

Vue.use.use(ImageLoad, {  loading: "Http://localhost:4000/images/loading.gif",  error: "http://localhost:4000/images/error.jpeg",});

ImageLoad插件定义

ImageLoad插件和其他插件一样,既然要通过use使用,所以要定义install方法,install方法的第一个参数是当前App实例,第二个则是指令的全局配置。

import getImageLoad from './getImageLoad'const ImageLoad = {    install(app,options){        const ImGClass = getImageLoad(app) ;        var loadImage = new ImgClass(options);        app.directive("img-load", {            bind: loadImage.bindImage        });    }};export default ImageLoad;
  • install方法中,首先通过调用getImageLoad方法,获取加载图片的管理类,传入当前App实例。

  • 实例化图片加载管理类的对象loadImage ,传入图片加载的全局配置。

  • 定义自定义指令v-img-load,该指定的bind钩子方法指向loadImage中的bindImage方法。

  • bindImage方法的this是指向loadImage对象,因此可以使用到App实例,指令全局配置,loadImage对象内的数据。

图片加载管理类的定义

ImageLoadManagement定义了v-img-load指令的全部实现。

export default function getImageLoad(Vue) {    return class ImageLoadManagement {        constructor(options) {            this.options = options;            this.bindImage = this.bindImage.bind(this);            this.renderImage = this.renderImage.bind(this);        }        bindImage(el, bindings) {            const self = this;            Vue.nextTick(function(){                const src = bindings.value;                self.renderImage('loading', src, el);                self.loadImage(src).then(                    () => self.renderImage('', src, el),                    () => self.renderImage('error', src, el),                );            });                    }        loadImage(src) {            return new Promise((resolve, reject) => {                const img = new Image();                img.src = src;                img.onload = resolve;                img.onerror = reject;            });        }        renderImage(type, src, el) {            let _src;            const {                error,                loading            } = this.options;            switch (type) {                case 'loading':                    _src = loading;                    break;                case 'error':                    _src = error;                    break;                default:                    _src = src;                    break;            }            el.setAttribute("src", _src);        }    }}

为了避免参数过多,所以采用柯里化的方法,对参数进行了分割:

  • 在闭包函数getImageLoad中,定义了全局App实例参数;

  • ImageLoadManagement 类的构造方法中定义了图片加载指令需要的全局配置参数。

  • class 作为function的语法糖使用,其本质来时function,从而实现独立作用域。

  • bindImage方法中可以直接使用App实例的nextTick,无论该指令在父组件还是子组件中使用,都可以保证在指令中代码执行时,所有DOM元素加载完成。

  • loadImage方法用于检查指定URL的图片是否存在,如果存在则显示具体图片,否则则显示加载失败的图片。

  • renderImage方法用于设置指令绑定的Img元素的图片地址,图片的实际地址可以通过bindings参数的value属性获取。

通过上述方法,我们不仅扩展了指令的参数,使其可以支持更复杂的业务逻辑。

更重要的是。我们实现了指令的定义和实现逻辑的解耦,完全不再需要将所有的指令实现逻辑全部放在指令的注册方法中。通过ImageLoadManagement 的定义,将所有的指令实现逻辑都内聚在其中。

Vue 3.0的实现

Vue 3.0中,指令参数的扩展方法思路与2.0一致,只是因为Vue 3.0中指令的钩子函数名称与2.0不一致,造成一些区别。

具体代码如下:

import getImageLoad from './getImageLoad'const ImageLoad = {    install(app,options){        const ImgClass = getImageLoad(options) ;        var loadImage = new ImgClass();        app.directive("img-load", {            mounted: loadImage.bindImage        });    }};export default ImageLoad;
export default function getImageLoad(options) {    return class ImageLoadManagement {        constructor() {            this.options = options;            this.bindImage = this.bindImage.bind(this);            this.renderImage = this.renderImage.bind(this);        }        bindImage(el, bindings) {            const src = bindings.value;            this.renderImage('loading', src, el);            this.loadImage(src).then(                () => this.renderImage('', src, el),                () => this.renderImage('error', src, el),            );        }        loadImage(src) {            return new Promise((resolve, reject) => {                const img = new Image();                img.src = src;                img.onload = resolve;                img.onerror = reject;            });        }        renderImage(type, src, el) {            let _src;            const {                error,                loading            } = this.options;            switch (type) {                case 'loading':                    _src = loading;                    break;                case 'error':                    _src = error;                    break;                default:                    _src = src;                    break;            }            el.setAttribute("src", _src);        }    }}

到此,相信大家对“Vue的指令中如何实现传递更多参数”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Vue的指令中如何实现传递更多参数

本文链接: https://www.lsjlt.com/news/330435.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue的指令中实现传递更多参数
    目录概要基本原理基于闭包的扩展方案实例和代码实现Main.js中将指令对应的插件全局化ImageLoad插件定义图片加载管理类的定义Vue 3.0的实现概要 我们在使用Vue的开发项...
    99+
    2022-11-13
  • Vue的指令中如何实现传递更多参数
    本篇内容主要讲解“Vue的指令中如何实现传递更多参数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue的指令中如何实现传递更多参数”吧!基本原理本文介绍的指令扩展方法,主要以闭包为基础,并且使...
    99+
    2023-06-30
  • Vue在自定义指令绑定的处理函数中传递参数
    目录在自定义指令绑定的处理函数中传递参数需求背景方式一:包装函数方式二:利用动态参数在自定义指令中的传递参数时value和expression的区别注意点总结在自定义指令绑定的处理函...
    99+
    2023-03-10
    Vue自定义指令 Vue处理函数 Vue传递参数
  • Spring Boot/VUE中如何实现路由传递参数
    这篇文章将为大家详细讲解有关Spring Boot/VUE中如何实现路由传递参数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在路由时传递参数,一般有两种形式,一种是拼接...
    99+
    2022-10-19
  • 如何用vue实现组件间参数传递
    这篇文章主要介绍“如何用vue实现组件间参数传递”,在日常操作中,相信很多人在如何用vue实现组件间参数传递问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用vue实现组件间参数传递”的疑惑有所帮助!接下来...
    99+
    2023-07-04
  • Vue怎么在自定义指令绑定的处理函数中传递参数
    这篇文章主要介绍“Vue怎么在自定义指令绑定的处理函数中传递参数”,在日常操作中,相信很多人在Vue怎么在自定义指令绑定的处理函数中传递参数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue怎么在自定义指令...
    99+
    2023-07-05
  • Android中Okhttp3如何实现上传多张图片同时传递参数
    这篇文章给大家分享的是有关Android中Okhttp3如何实现上传多张图片同时传递参数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。最近做项目,打算换个方法上传图片。Andro...
    99+
    2022-10-19
  • vue中的get方法\post方法如何实现传递数组参数
    目录get方法\post方法如何传递数组参数第一部分:vue中get方法如何传递数组参数 下面列出我的接口格式及解决方法的源码vue get与post传参方式1.post:...
    99+
    2022-11-13
  • 如何实现Layui templet中a的onclick参数传递
    小编给大家分享一下如何实现Layui templet中a的onclick参数传递,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!以下是我的模板,主要用在列表页table中的按钮,点击弹窗展开...
    99+
    2022-10-19
  • vue组件中如何实现数据传递
    这篇文章给大家分享的是有关vue组件中如何实现数据传递的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:1、props:父组件 -->传值到子组件app.vue是父组...
    99+
    2022-10-19
  • vbs如何实现循环产生的参数传递
    小编给大家分享一下vbs如何实现循环产生的参数传递,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Set objFSO = Creat...
    99+
    2023-06-08
  • angular中如何实现控制器之间传递参数
    这篇文章将为大家详细讲解有关angular中如何实现控制器之间传递参数,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在angular中,每个controller(控制器)...
    99+
    2022-10-19
  • Angular中如何实现$state.go页面跳转并传递参数
    这篇文章给大家分享的是有关Angular中如何实现$state.go页面跳转并传递参数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。路由页面(注意这里要在路由上添加一个参数用于传...
    99+
    2022-10-19
  • vue如何实现兄弟组件的数据传递
    本篇内容介绍了“vue如何实现兄弟组件的数据传递”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在main.js里面设置data{eventH...
    99+
    2023-07-04
  • 微信小程序中如何实现页面跳转和参数传递
    这篇文章主要为大家展示了“微信小程序中如何实现页面跳转和参数传递”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序中如何实现页面跳转和参数传递”这篇文章吧...
    99+
    2022-10-19
  • 如何实现angularjs2中父子组件的数据传递
    这篇文章主要介绍如何实现angularjs2中父子组件的数据传递,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!父到子组件之间的数据传递父组件模板中引用子组件 // ...
    99+
    2022-10-19
  • MyBatis中动态sql实现传递多个参数并使用if进行参数的判断和实现like模糊搜索以及foreach实现in集合
    场景 在mapper接口层方法参数有id的数组和姓名的模糊搜索和类型的三个参数。 现在需要将这三个参数传递在动态sql的xml中接受并进行判断不为空。 然后查询数据库中记录在第一个参数id数组中的并且姓名是模糊搜索的并且类型是直接相等于的。...
    99+
    2020-04-27
    MyBatis中动态sql实现传递多个参数并使用if进行参数的判断和实现like模糊搜索以及foreach实现in集合 数据库入门 数据库基础教程 数据库 mysql
  • C++ Cartographer源码中关于传感器的数据传递如何实现
    今天小编给大家分享一下C++ Cartographer源码中关于传感器的数据传递如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2023-07-05
  • vue中如何实现filters传入两个参数和使用两个filters
    这篇文章主要为大家展示了“vue中如何实现filters传入两个参数和使用两个filters”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中如何实现fil...
    99+
    2022-10-19
  • vue中如何解决使用element组件时事件想要传递其他参数的问题
    小编给大家分享一下vue中如何解决使用element组件时事件想要传递其他参数的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作