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 相关文章推荐
jQuery中创建实例与原型继承揭秘
Dec 21 Javascript
javascript 正则表达式相关应介绍
Nov 27 Javascript
jquery解析xml字符串示例分享
Mar 25 Javascript
JQuery标签页效果的两个实例讲解(4)
Sep 17 Javascript
JS获取数组最大值、最小值及长度的方法
Nov 24 Javascript
JavaScript Uploadify文件上传实例
Feb 28 Javascript
JavaScript实现的数字与字符串转换功能示例
Aug 23 Javascript
详解require.js配置路径的用法和css的引入
Sep 06 Javascript
利用原生的JavaScript实现简单拼图游戏
Nov 18 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
Sep 03 jQuery
js+springMVC 提交数组数据到后台的实例
Sep 21 Javascript
node.js中fs文件系统模块的使用方法实例详解
Feb 13 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
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
PHP多态代码实例
2015/06/26 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
WordPress开发中的get_post_custom()函数使用解析
2016/01/04 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
PHP日志LOG类定义与用法示例
2018/09/06 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
js AspxButton的客户端操作
2009/06/26 Javascript
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
JavaScript实现页面滚动图片加载(仿lazyload效果)
2011/07/22 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
微信小程序签到功能
2018/10/31 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
Python中的作用域规则详解
2015/01/30 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
Python实现FM算法解析
2019/06/18 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
2014年小班元旦活动方案
2014/02/16 职场文书
庆祝国庆节演讲稿2014
2014/09/19 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
班干部竞选演讲稿(精选5篇)
2019/09/24 职场文书