浅谈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 相关文章推荐
懒就要懒到底——鼠标自动点击(含时间判断)
Feb 20 Javascript
JS 添加网页桌面快捷方式的代码详细整理
Dec 27 Javascript
jQuery中Ajax的load方法详解
Jan 14 Javascript
JS表格组件神器bootstrap table详解(基础版)
Dec 08 Javascript
zTree插件下拉树使用入门教程
Apr 11 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
Sep 13 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
Nov 21 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
Apr 26 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
Aug 17 Javascript
npm scripts 使用指南详解
Oct 08 Javascript
JS几个常用的函数和对象定义与用法示例
Jan 15 Javascript
用vue写一个日历
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使用者状态管理功能的应用
2006/10/09 PHP
php a simple smtp class
2007/11/26 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
实例详解ECMAScript5中新增的Array方法
2016/04/05 Javascript
javascript实现滚动效果的数字时钟实例
2016/07/21 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
Javascript中字符串和数字的操作方法整理
2017/01/22 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
一篇文章,教你学会Vue CLI 插件开发
2019/04/17 Javascript
JS自定义对象创建与简单使用方法示例
2020/01/15 Javascript
vue在响应头response中获取自定义headers操作
2020/07/24 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
Python使用sorted排序的方法小结
2017/07/28 Python
python发送告警邮件脚本
2018/09/17 Python
django 数据库连接模块解析及简单长连接改造方法
2019/08/29 Python
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
瑞士网球商店:Tennis-Point
2020/03/12 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
德尔福集团DELPHI的笔试题
2012/02/22 面试题
英语硕士生求职简历的自我评价
2013/10/15 职场文书
元旦晚会邀请函
2014/01/27 职场文书
毕业实习评语
2014/02/10 职场文书
OpenCV-Python实现油画效果的实例
2021/06/08 Python