浅谈Vue内置component组件的应用场景


Posted in Javascript onMarch 27, 2018

官方的说明

渲染一个“元组件”为动态组件。依 is 的值,来决定哪个组件被渲染。

<!-- 动态组件由 vm 实例的属性值 `componentId` 控制 -->
<component :is="componentId"></component>

具体可以官网文档中的

动态组件

 内置的组件component

场景

这里通过一个业务场景来阐述vue内置component组件的应用。 如图所示,这里展示经典注册页面,注册分为邮箱注册和手机注册,弹窗顶部有标签可以切换注册类型,中间是注册表单信息,邮箱注册和手机注册有着不一样的表单内容,底部是注册按钮以及其他操作。 经过分析手机注册界面与邮箱注册除了中间的表单内容不一致之外,其他的界面内容是一样的。

浅谈Vue内置component组件的应用场景

实际项目代码设计中,为了保证复用性和可维护性,是会有一些可行的方案。这里我们采用vue内置的component组件来实现这一点。

核心代码实现

顶部tab切换的时候,type值发生改变,对应的表单的组件也发生了变化

<template>
 <div>
	<a href="javascript:;" rel="external nofollow" rel="external nofollow" @click.prevent="handleCloseBtnClick"></a>
	<div>
	 <h3>新用户注册</h3>
	 <div>
		<span :class="{active: type === 'mobileForm'}" @click="type = mobileForm">手机注册</span>
		<span :class="{active: type === 'emailForm'}" @click="type = emailForm">邮箱注册</span>
	 </div>
	</div>
	<component :is="type" ref="form">
	 <button @click="handleRegisterBtnClick">注册</button>
	 <div ><span ><span>注册视为同意</span><a> 《法律条款和隐私说明》</a></span></div>
	 <div><span>已有账号<a href="javascript:;" rel="external nofollow" rel="external nofollow" @click.prevent="handleLoginBtnClick">直接登入>></a></span></div>
	</component>
 </div>
</template>
<script>
 export default {
 	methods: {
		handleRegisterBtnClick () {
		 	this.$refs.form.validateData().then(() => {
				this.$refs.form.getFormData()
			})
		 }
	}
 }
</script>

mixins混合

用Vue内置component组件情况下,一般实际被渲染的组件具有一定的共性,比如相同的属性,相同的方法或者相同的初始化销毁过程。比如目前这个场景中邮箱表单和手机表单都具有校验方法(validateData)和获取表单数据方法(getFormData)。 这种情况下可以使用vue提供的混合的功能。进一步抽离 mixins.js

export default {
 methods: {
  validateData() {
   return Promise.resolve()
  },
  getFormData() {
   return {}
  }
 }
}

email-form.vue

<script>
import minx from './mixins'
export default {
 mixins: [mixins],
 methods: {
  getFormData() {
   return { email: 'example@example.com' }
  }
 }
}
</script>

如果有自定义的需求,可以重写mixins中的方法。

表格的应用

在管理后台项目中,表格经常会被用到。我们希望表格的td是文本、进度条、checkbox等等,且希望通过传一个json配置就可以渲染出。使用vue内置的component组件可以起到很赞的作用。

浅谈Vue内置component组件的应用场景 

比如这样的一个table使用方式

<template>
 <vue-table ref="table" :columns="columns" :datum="datum"></vue-table>
</template>
<script>
export default {
  data () {
   return {
    columns: [
     { title: 'ID', width: '30', dataKey: 'id' },
     { title: '进度组件', dataKey: 'progress', render: { type: 'progress2', max: 100, precision: 2 } }
    ],
    datum: [{ id: '1', name: '进度0', progress: 10 }]
   }
  }
 }
</script>

table中使用component的实现

<td v-for="column of columns">
	<component :is="`${TYPE_PRE}${columns.render.type}`" :row-data="rowData" :params="columns.render"></component>
</td>

表单的应用

在管理后台项目中,表单也经常需要用到,我们也同样希望表单的某一项是文本框,下拉框,时间选择框,富文本等等等等,且希望通过传一个json配置就可以渲染出。vue内置的component组件可以依然可以实现这样一个美好的愿景。

浅谈Vue内置component组件的应用场景 

比如这样的一个form使用方式

<template>
  <c-form :cells="cells" ref="form">
   <button class="button is-primary" :class="{ 'is-disabled': isSubmitBtnDisabled }" @click.prevent="submit">提交</button>
  </c-form>
</template>
<script>
  export default {
  computed: {
   cells () {
    return [
     {
      field: 'name',
      label: '名称',
      type: 'textfield',
      attrs: { placeholder: '名称' },
      validate: { required: { message: '请输入名称'} }
     },
     {
      field: 'enable',
      label: '启用标志',
      type: 'dropdown',
      extra: {options: [{ label: '启用', value: 1 }, { label: '禁用', value: 2 }] }
     }
    ]
   }
  }
 }
</script>

form中使用component的实现

<form>
 <c-form-cell v-for="cell of cellList" :key="cell.field" :field="cell.field">
  <component
	 :is="`${TYPE_PRE}${cell.type}`"
	 :field="cell.field"
	 :attrs="cell.attrs"
	 :extra="cell.extra"
	 :validate="cell.validate"
	 :cells="cell.cells">
  </component>
 </c-form-cell>
</form>

表单和表格在 基于VUE的后台引擎 开源项目中都有实现,欢迎star和fork。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js下利用控制器载入对应脚本
Jul 17 Javascript
jq选项卡鼠标延迟的插件实例
May 13 Javascript
JS验证身份证有效性示例
Oct 11 Javascript
JavaScript函数作用域链分析
Feb 13 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
Apr 16 Javascript
js实现模拟计算器退格键删除文字效果的方法
May 07 Javascript
js实现新浪微博首页效果
Oct 16 Javascript
再谈javascript注入 黑客必备!
Sep 14 Javascript
Less 安装及基本用法
May 05 Javascript
CSS3 动画卡顿性能优化的完美解决方案
Sep 20 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
Nov 19 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
Sep 21 Javascript
js中apply和Math.max()函数的问题及区别介绍
Mar 27 #Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
Mar 27 #Javascript
Angular使用操作事件指令ng-click传多个参数示例
Mar 27 #Javascript
JavaScript代码实现txt文件的上传预览功能
Mar 27 #Javascript
Angularjs实现控制器之间通信方式实例总结
Mar 27 #Javascript
Angular中使用better-scroll插件的方法
Mar 27 #Javascript
使用node打造自己的命令行工具方法教程
Mar 26 #Javascript
You might like
在PHP中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
PHP7匿名类用法分析
2016/09/26 PHP
laravel 实现根据字段不同值做不同查询
2019/10/23 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
NodeJS使用jQuery选择器操作DOM
2015/02/13 NodeJs
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
php常见的页面跳转方法汇总
2015/04/15 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
angularjs指令之绑定策略(@、=、&amp;)
2017/04/13 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
2020/08/08 Javascript
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
简单解析Django框架中的表单验证
2015/07/17 Python
遗传算法python版
2018/03/19 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
python对离散变量的one-hot编码方法
2018/07/11 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
Python hashlib模块的使用示例
2020/10/09 Python
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
应届专科生个人的自我评价
2014/01/05 职场文书
创业计划书——互联网商机
2014/01/12 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
党建工作先进材料
2014/05/02 职场文书
2014年最新领导班子整改方案
2014/09/27 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
观后感格式
2015/06/19 职场文书