自己写个vue.js插件(2):手动挂载子组件

前面我们使用原始的方法写了一个验证插件
1、学会了插件的创建的方式
2、学会了自定义指令
3、通过自定义指令返回true或false,来控制外部label的显示和隐藏
(注意:外部的label是我们预先写好的)

下面我们使用自动插入label
手动挂载插件:https://vuefe.cn/api/#Vue-extend

动手写代码

1、先移除user-name.vue 里显示错误的label,因为我们要手动插入

<label class="label label-danger">用户不合法</label>

2、先看一下我们插件validate.js的全部代码,然后我们再分析

export default{
    install(Vue){

        Vue.prototype.checkUserName = (value) => {
            if(value == ""){
                return true; // 如果没有填写,默认为true
            }

            if(/\w{6,20}/.test(value)){
                return true;
            }else{
                return false;
            }
        }

        Vue.prototype.errorLabel = null;
        Vue.prototype.hasError = false;

        Vue.directive("uname",{
            bind(){
                let errorTpl = Vue.extend({
                    template:'<label class="label label-danger">用户不合法</label>'
                });
                // 实例化并挂载
                Vue.errorLabel = (new errorTpl()).$mount().$el;
            },
            update(el,binding,vnode){
                if(/\w{6,20}/.test(el.value)){
                    // 验证通过
                    if (Vue.hasError){
                        el.parentNode.removeChild(Vue.errorLabel);
                        Vue.hasError = !Vue.hasError;
                    }
                }else{
                    // 验证没有通过
                    if (!Vue.hasError){
                        el.parentNode.appendChild(Vue.errorLabel);
                        Vue.hasError = ! Vue.hasError;
                    }

                }
            },
        })
    }
}

3、定义了2个prototype

Vue.prototype.errorLabel = null;
Vue.prototype.hasError = false;

errorLabel错误提示模板,我们在要bind() 方法中创建,然后挂载到它上面;hasError 是辅助属性,方便我们用来判断当前是有错误还是没有错误。
4、在update() 方法中,实时监听用户的输入,然后移除/添加 错误模板

 update(el,binding,vnode){
     if(/\w{6,20}/.test(el.value)){
         // 验证通过
         if (Vue.hasError){
             el.parentNode.removeChild(Vue.errorLabel);
             Vue.hasError = !Vue.hasError;
         }
     }else{
         // 验证没有通过
         if (!Vue.hasError){
             el.parentNode.appendChild(Vue.errorLabel);
             Vue.hasError = ! Vue.hasError;
         }
     }
 },

5、演示效果如下图
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值