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 date对象的减法处理实现代码
Dec 28 Javascript
JS 日期比较大小的简单实例
Jan 13 Javascript
jQuery事件之键盘事件(ctrl+Enter回车键提交表单等)
May 11 Javascript
JavaScript避免内存泄露及内存管理技巧
Sep 05 Javascript
JavaScript实现获得所有兄弟节点的方法
Jul 23 Javascript
微信小程序 wx.request方法的异步封装实例详解
May 18 Javascript
详解Vue学习笔记入门篇之组件的内容分发(slot)
Jul 17 Javascript
ES6新增数据结构WeakSet的用法详解
Aug 07 Javascript
一次记住JavaScript的6个正则表达式方法
Feb 22 Javascript
Vue 动态添加路由及生成菜单的方法示例
Jun 20 Javascript
Vue数据绑定实例写法
Aug 06 Javascript
vue 计算属性和侦听器的使用小结
Jan 25 Vue.js
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
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
PHP中读写文件实现代码
2011/10/20 PHP
PHP判断变量是否为0的方法
2014/02/08 PHP
php上传文件问题汇总
2015/01/30 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
2016/07/25 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
Angular.js基础学习之初始化
2017/03/10 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python统计日志ip访问数的方法
2015/07/06 Python
简述Python中的进程、线程、协程
2016/03/18 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
python 读写中文json的实例详解
2017/10/29 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
python 实现批量xls文件转csv文件的方法
2018/10/23 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
学习雷锋精神心得体会范文
2014/03/12 职场文书
自行车广告词大全
2014/03/21 职场文书
公证处委托书
2015/01/28 职场文书
个人催款函范文
2015/06/23 职场文书
Mysql文件存储图文详解
2021/06/01 MySQL