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 相关文章推荐
js键盘上下左右键怎么触发function(实例讲解)
Dec 14 Javascript
javascript中的括号()用法小结
Apr 14 Javascript
jQuery实现的多选框多级联动插件
May 02 Javascript
jquery获取一个元素下面相同子元素的个数代码
Jul 31 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
Aug 08 Javascript
Jquery api 速查表分享
Jan 12 Javascript
基于AngularJS前端云组件最佳实践
Oct 20 Javascript
微信小程序 解决swiper不显示图片的方法
Jan 04 Javascript
移动端效果之IndexList详解
Oct 20 Javascript
JS实现的ajax和同源策略(实例讲解)
Dec 01 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
Aug 01 Javascript
vue3 源码解读之 time slicing的使用方法
Oct 31 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
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
PHP获取url的函数代码
2011/08/02 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
JS双击变input框批量修改内容
2016/12/12 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
Python中集合类型(set)学习小结
2015/01/28 Python
初步解析Python中的yield函数的用法
2015/04/03 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
Python使用OpenCV进行标定
2018/05/08 Python
Python字符串匹配之6种方法的使用详解
2019/04/08 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
Python实现Linux监控的方法
2019/05/16 Python
pycharm 安装JPype的教程
2019/08/08 Python
python os.path.isfile 的使用误区详解
2019/11/29 Python
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
人事主管的岗位职责
2013/11/16 职场文书
致400米运动员广播稿
2014/02/07 职场文书
腾讯广告词
2014/03/19 职场文书
大三学习计划书范文
2014/05/02 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
2014年保密工作总结
2014/11/22 职场文书
民事上诉状范文
2015/05/22 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
Python爬虫基础之初次使用scrapy爬虫实例
2021/06/26 Python
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL
A22国内电台短波广播频率表
2022/05/10 无线电