当前位置 主页 > 网站技术 > 代码类 >

    vue 组件开发原理与实现方法详解

    栏目:代码类 时间:2019-11-29 15:10

    本文实例讲述了vue 组件开发原理与实现方法。分享给大家供大家参考,具体如下:

    概要

    vue 的一个特点是进行组件开发,组件的优势是我们可以封装自己的控件,实现重用,比如我们在平台中封装了自己的附件控件,输入控件等。

    组件的开发

    在vue 中一个组件,就是一个独立的.vue 文件,这个文件分为三部分。

    1.模板

    2.脚本

    3.样式

    我们看一个系统中最常用的组件。

    <template>
     <div >
       <div v-if="right=='r'" class="readOnlyBgColor">{{value}}</div>
       <div class="box-custom-component" v-else-if="right=='w'">
           <input 
             type="text"  
             @blur="blurHandler" 
             @focus="focusHandler" 
             :required="required" 
             v-model="currentValue" 
             :placeholder="placeholder"
           ></input>
            <a href="javascript:;" rel="external nofollow" class="yd-input-clear" tabindex="-1" @click="clearInput" v-show="showClear && !isempty"></a>
       </div>
     </div>
    </template>
    <script type="text/ecmascript-6">
    import { calcRight } from "@/assets/app.js";
    import {VTypes,RxUtil} from "@/assets/util.js";
    export default{
      name : "rx-input",
      props: {
        value:[String,Number],
        permission:Object,
        permissionkey:String,
        showClear:{
          type: Boolean,
        default: true
        },
        readonly: {
        type: Boolean,
        default: false
       },
       placeholder:{
        type: String,
        default: ""
       },
          required: {
        type: Boolean,
        default: false
        },
        /**
         * 验证表达式
         */
        vtype:{
          type: String,
        default: ""
        },
        onblur:Function,
        onfocus:Function,
        conf:Object
      },
      data(){
        return {
          currentValue: this.value,
          iserror:false,
          isempty:true,
          checkReq:true
        }
      },
      computed: {
        right :function () {
            return calcRight(this);  
        }
      },
      mounted(){
          this.valid(this.required);
      },
      methods: {
          valid(chkReq_) {
            var val=this.currentValue;
            if(chkReq_ && this.required){
              if(RxUtil.isEmpty(val)){
    //            this.iserror=true;
                return false;
              }
            }
            if(!this.vtype) {
    //          this.iserror=false;
              return true;
            } 
            var validFunc=VTypes[this.vtype];
            if(typeof validFunc=="undefined") {
    //          this.iserror=false;
              return true;
            }
            //验证
            var rtn= validFunc.valid(val);
    //        this.iserror=!rtn;
            return rtn; 
          },
          blurHandler(e) {
    //        this.iserror=!this.valid(this.checkReq);
            this.onblur && this.onblur(e);
          },
          focusHandler(e) {
        this.showClear = true;
        this.onfocus && this.onfocus(e);
        },
        clearInput(){
          this.currentValue = '';
          if(this.required){
    //       this.iserror=true; 
          }
        }
        },
      watch: {
        currentValue: function (val, oldVal){
            this.$emit('input', this.currentValue);
            //是否为空
            this.isempty=RxUtil.isEmpty(val);
          },
          value :function(val,oldVal){
            if(val!=oldVal){
              this.currentValue=this.value;
            }
          }
      }
    }
    </script>
    <style scoped>
    .box-custom-component::after{
      content: '';
      display: block;
      clear: both;
    }
    .box-custom-component input{
      float: left;
      width:calc(100% - .65rem);
    }
    .box-custom-component a{
      float: left;
      width: .65rem;
    }
    </style>