浅谈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 相关文章推荐
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
Jan 09 Javascript
纯文字版返回顶端的js代码
Aug 01 Javascript
javascript预加载图片、css、js的方法示例介绍
Oct 14 Javascript
10分钟学会写Jquery插件实例教程
Sep 06 Javascript
JavaScript判断undefined类型的正确方法
Jun 30 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
Nov 03 Javascript
bootstrap下拉列表与输入框组结合的样式调整
Oct 08 Javascript
jQuery获取table表中的td标签(实例讲解)
Jul 28 jQuery
在iframe中使bootstrap的模态框在父页面弹出问题
Aug 07 Javascript
JS实现数组去重及数组内对象去重功能示例
Feb 02 Javascript
vue.js实现三级菜单效果
Oct 19 Javascript
antd form表单数据回显操作
Nov 02 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 5.0对象模型深度探索之对象复制
2008/03/27 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
php遍历CSV类实例
2015/04/14 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
多广告投放代码 推荐
2006/11/13 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
js this函数调用无需再次抓获id,name或标签名
2014/03/03 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
vue.js删除动态绑定的radio的指定项
2017/06/02 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
vue登录注册实例详解
2019/09/14 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
python处理按钮消息的实例详解
2017/07/11 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
python opencv实现运动检测
2018/07/10 Python
django的ORM模型的实现原理
2019/03/04 Python
Python split() 函数拆分字符串将字符串转化为列的方法
2019/07/16 Python
Python实现大数据收集至excel的思路详解
2020/01/03 Python
python matplotlib库的基本使用
2020/09/23 Python
Python Pandas数据分析工具用法实例
2020/11/05 Python
会议开幕词
2015/01/28 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript