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


Posted in Javascript onNovember 29, 2019

本文实例讲述了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>

定义好组件后,使用方法如下:

1.import 组件

import RxInput from '@/components/common/form/RxInput';

2.注册组件

Vue.component(RxInput.name, RxInput);

3.使用组件

<rx-input v-model="data.email" permissionkey="email" :required="true" vtype="email" :readonly="false" :permission="" ></rx-input>

这里我们定义了v-model 我们通过将数据绑定到组件上实现数据的双向绑定。

实现双向绑定,需要注意两点:

1.定义一个value 的属性。

在上面组件的代码中,我们可以看到我们定义了一个value属性。

在只读的情况下 直接绑定显示。

<div v-if="right=='r'" class="readOnlyBgColor">{{value}}</div>

另外我们在data定义上,将value 赋值给了 currentValue 。这个值绑定到输入控件上。

2.数据改变时调用方法。

this.$emit('input', this.currentValue);

这样就实现了数据的双向绑定。

希望本文所述对大家vue.js程序设计有所帮助。

Javascript 相关文章推荐
Javascript中的数学函数集合
May 08 Javascript
jQuery获取css z-index在各种浏览器中的返回值
Sep 15 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
Jun 05 Javascript
js实现拉伸拖动iframe的具体代码
Aug 03 Javascript
JS的Document属性和方法小结
Sep 17 Javascript
JQuery each打印JS对象的方法
Nov 13 Javascript
Javascript动画的实现原理浅析
Mar 02 Javascript
JQuery中DOM事件绑定用法详解
Jun 13 Javascript
javascript中不易分清的slice,splice和split三个函数
Mar 29 Javascript
AngularJS 依赖注入详解及示例代码
Aug 17 Javascript
原生javascript上传图片带进度条【实例分享】
Apr 06 Javascript
JS求解两数之和算法详解
Apr 28 Javascript
vue ajax 拦截原理与实现方法示例
Nov 29 #Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
Nov 29 #Javascript
js中关于Blob对象的介绍与使用
Nov 29 #Javascript
js blob类型url的视频下载问题的解决
Nov 29 #Javascript
JavaScript之Blob对象类型的具体使用方法
Nov 29 #Javascript
VuePress 中如何增加用户登录功能
Nov 29 #Javascript
Vue.directive 实现元素scroll逻辑复用
Nov 29 #Javascript
You might like
php封装json通信接口详解及实例
2017/03/07 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
iis6+javascript Add an Extension File
2007/06/13 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
JavaScript中伪协议 javascript:使用探讨
2014/07/18 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
javascript实现鼠标拖动改变层大小的方法
2015/04/30 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
JS产生随机数的用法小结
2016/12/10 Javascript
原生js实现可拖拽效果
2017/02/28 Javascript
详解用vue.js和laravel实现微信支付
2017/06/23 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
Python contextlib模块使用示例
2015/02/18 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
Python实现的自定义多线程多进程类示例
2018/03/23 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
详解python中init方法和随机数方法
2019/03/13 Python
eclipse创建python项目步骤详解
2019/05/10 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
Django用户认证系统 Web请求中的认证解析
2019/08/02 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
深入了解Python 变量作用域
2020/07/24 Python
python集合的新增元素方法整理
2020/12/07 Python
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
GOOD AMERICAN官网:为曲线性感而设计
2017/12/28 全球购物
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
工商治理实习生的自我评价
2014/01/15 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
六年级学生期末评语
2014/12/26 职场文书
小学体育教学随笔
2015/08/14 职场文书