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将文本转化成JSON对象需要注意的问题
May 09 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
May 27 Javascript
javascript实现Table排序的方法
May 15 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
May 15 Javascript
javascript实现给定半径求出圆的面积
Jun 26 Javascript
js style.display=block显示布局错乱问题的解决方法
Sep 21 Javascript
详解javascript事件绑定使用方法
Oct 20 Javascript
基于jQuery Ajax实现下拉框无刷新联动
Dec 06 jQuery
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 Javascript
Angular中sweetalert弹框的基本使用教程
Jul 22 Javascript
Vue全家桶入门基础教程
May 14 Vue.js
原生JS实现分页
Apr 19 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并发访问实例代码
2012/09/06 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
2014/11/15 PHP
PHP正则验证Email的方法
2015/06/15 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
JS控制一个DIV层在指定时间内消失的方法
2014/02/17 Javascript
js中flexible.js实现淘宝弹性布局方案
2020/06/23 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
详解RequireJs官方使用教程
2017/10/31 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
Vue-cli打包后如何本地查看的操作
2020/09/02 Javascript
[48:20]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
Python 函数基础知识汇总
2018/03/09 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
Python中如何使用if语句处理列表实例代码
2019/02/24 Python
python opencv实现图像边缘检测
2019/04/29 Python
python3中eval函数用法使用简介
2019/08/02 Python
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
英国航空官网:British Airways
2016/09/11 全球购物
家长写给老师的建议书
2014/03/13 职场文书
小学语文业务学习材料
2014/06/02 职场文书
团干部培训方案
2014/06/03 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
军训个人总结
2015/03/03 职场文书
婚庆主持词大全
2015/06/30 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书