Vue之插件的定义和使用

  • Post author:
  • Post category:vue




概述

学习本文之前,我们需要弄清楚何为插件?插件其实就是一段扩展程序,主要目的是用于扩展功能。就比如Idea家族和VSCode家族的插件,它们也是一段扩展程序,将其安装到IDE中就可以使用插件里面实现的功能了,Vue中的插件也是这样,通过插件,我们可以为Vue组件扩展功能和变量,并且让代码的可维护性和可扩展性更高,接下来我们看下Vue的插件如何定义和使用。



实例解析

Vue的插件定义和使用都非常简单,步骤如下:



1.定义插件

   const myPlugin = {
        install(app,options){
            app.provide('name','walt zhong'); // 提供一个全局的变量
            console.log(app,options);
             app.mixin({
                mounted(){
                    console.log('mixin');
                }
            });
            // 对Vue底层做扩展,扩展了一个全局属性
            app.config.globalProperties.$sayHello = 'hello world'; 
        }
    }

Vue定义插件时使用install(app,options)方法,第一个参数是Vue的app实例,第二个参数可以用来读取我们传递的参数。在上面的代码中我们扩展了一个全局变量和Vue的混入块(mixin),也对Vue的底层做了一个全局属性的扩展。


Vue的mixin混入块也是一种对程序做扩展的方法,这里不多介绍,混入的方式扩展会让代码的可读性降低,并且项目越大越难维护。一般都是和插件搭配使用,因为插件的可读性和可维护性比较好



2.使用插件

使用插件时,我们使用Vue的实例app.use(插件名,参数),代码如下:

app.use(myPlugin,{name1:'walt'});

然后我们就可以使用我们插件中扩展的变量了

   app.component('my-title',{
        inject:['name'],
        mounted(){
            console.log(this.$sayHello);
        },
        template: `<div>{{name}}</div>`
    });

上面的代码中,我们定义了一个名为

my-title

的组件,这时候我们就可以通过inject关键字去拿我们在插件中定义的name变量了,混入语法不用我们直接调用吗,因为mixin本来就是Vue实例的一个属性,所以当我们调用了

app.use()

方法后,mixin语法块中的相关方法会在合适的时机调用。我们扩展的全局属性需要使用

this.$xxxx

的方式调用,例如本例中的

this.$sayHello

的方式



3.实例展示



1.输入框自动聚焦

在前面的章节中我们实现过输入框自动聚焦的案例,我们输入框自动聚焦是使用Vue的自定义指令实现的,这里我们结合插件实现这一需求。代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>输入框自动聚焦</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
</body>
<script>
    const myPlugin = {
        install(app,options){
            app.provide('inputName','输入框名称'); // 提供输入框的名称全局变量
            app.directive('focus',{
                mounted(el){
                    el.focus();
                }
            });
        }
    }
 const app = Vue.createApp({
        template: 
        `
         <my-focus-input  />   
        `
    });  

    app.component('my-focus-input',{
        inject:['inputName'],
        template: `<div>{{inputName}} <input v-focus/></div>`
    });

    app.use(myPlugin);

    const vm = app.mount('#root');
</script>

运行结果:



2.自定义数据校验

本案例中我们使用插件和mixin混入语法实现一个校验功能,校验我们的姓名和年龄,加入年龄大于25岁,我们输出太老了,否则输出很年轻的提示,姓名的长度假如大于4,我们正常输出,否则输出姓名太短了。代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>使用插件做数据校验</title>
    <script src="https://unpkg.com/vue@next"></script>
</head>
<body>
    <div id="root"></div>
</body>
<script>

    const validatorPlugin=(app,options)=>{
        app.mixin({
         created(){
            console.log('mixin ready');
            console.log(this.$options.rules);
            for(let key in this.$options.rules){
                const item = this.$options.rules[key];
                console.log(this);
                this.$watch(key,(value)=>{
                    console.log("old: "+key + " ,new: " + value);
                    const result = item.validate(value);
                    if(!result){
                        console.log(item.message);
                    }

                });
                console.log(key,item);
            }
         }
    });
  }
 const app = Vue.createApp({
    data(){
        return{
            name:'walt',age:28
        }
    },
    rules:{
        age:{
            validate:(age)=>{return age > 25},
            message:'too young'
        },
        name:{
            validate:name=> name.length>=4,
            message:'name too short'
        }
    },
        template: 
        `
        <div>name: {{name}},age:{{age}}</div>
        `
    });  

    app.use(validatorPlugin);
    const vm = app.mount('#root');
</script>

运行结果:

在这里插入图片描述



# 总结

本文主要是介绍插件的定义和使用,插件的使用可以使我们的代码更具扩展性和可读性,正确的使用好插件能帮助我们写出非常优雅的代码,建议读者跟着上面的两个例子动手实现一遍,深刻掌握插件的使用以及其妙处所在。



版权声明:本文为zxj2589原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。