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 相关文章推荐
[原创]网络复制内容时常用的正则+editplus
Nov 30 Javascript
zTree插件之多选下拉菜单实例代码
Nov 06 Javascript
AngularJS基础 ng-csp 指令详解
Aug 01 Javascript
js实现浏览器倒计时跳转页面效果
Aug 12 Javascript
jquery操作ID带有变量的节点实例
Dec 07 Javascript
微信小程序实战之轮播图(3)
Apr 17 Javascript
JS数组操作之增删改查的简单实现
Aug 21 Javascript
jQuery 实现左右两侧菜单添加、移除功能
Jan 02 jQuery
微信小程序开发的基本流程步骤
Jan 31 Javascript
微信小程序新手教程之页面打开数量限制
Mar 03 Javascript
浅谈小程序globalData的那些事儿
Nov 01 Javascript
vue+canvas实现移动端手写签名
May 21 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文件上传主要代码讲解
2013/09/30 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
php日志函数error_log用法实例分析
2019/09/23 PHP
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
AngularJs 终极购物车(实例讲解)
2017/11/08 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
小程序实现带年月选取效果的日历
2018/06/27 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
2019/05/28 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
使用Python构建Hopfield网络的教程
2015/04/14 Python
Python3.2模拟实现webqq登录
2016/02/15 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
基于python 等频分箱qcut问题的解决
2020/03/03 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
详解CSS3开启硬件加速的使用和坑
2017/08/21 HTML / CSS
结构工程个人自荐信范文
2013/11/30 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
2015年试用期工作总结
2014/12/12 职场文书
华山导游词
2015/02/03 职场文书
详解GaussDB for MySQL性能优化
2021/05/18 MySQL
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python
html5实现点击弹出图片功能
2021/07/16 HTML / CSS
Python之matplotlib绘制饼图
2022/04/13 Python