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 相关文章推荐
基于javascript滚动图片具体实现
Nov 18 Javascript
对比分析json及XML
Nov 28 Javascript
JavaScript获取当前日期是星期几的方法
Apr 06 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
Nov 05 Javascript
Javascript页面跳转常见实现方式汇总
Nov 28 Javascript
D3.js实现柱状图的方法详解
Sep 21 Javascript
jQuery鼠标事件总结
Oct 13 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
May 31 Javascript
javascript实现点击星星小游戏
Dec 24 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
Mar 16 Javascript
vue的webcamjs集成方式
Nov 16 Javascript
vue 在单页面应用里使用二级套嵌路由
Dec 19 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
如何开始收听短波广播
2021/03/01 无线电
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
2015/11/19 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
DOM精简教程
2006/10/03 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
2018/07/26 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
2019/09/24 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
2020/01/16 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
python中使用enumerate函数遍历元素实例
2014/06/16 Python
python中的错误处理
2016/04/10 Python
Python实现调度算法代码详解
2017/12/01 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
python 高效去重复 支持GB级别大文件的示例代码
2018/11/08 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
售前工程师职业生涯规划
2014/03/02 职场文书
党员目标管理责任书
2014/07/25 职场文书
预备党员半年考察意见
2015/06/01 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
python面向对象版学生信息管理系统
2021/06/24 Python
python​格式化字符串
2022/04/20 Python
关于vue-router-link选择样式设置
2022/04/30 Vue.js