浅谈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 相关文章推荐
div失去焦点事件实现思路
Apr 22 Javascript
node.js中的fs.existsSync方法使用说明
Dec 17 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
Oct 09 Javascript
详解Bootstrap插件
Apr 25 Javascript
详解Javascript函数声明与递归调用
Oct 22 Javascript
详解JavaScript模块化开发
Dec 04 Javascript
详解用vue.js和laravel实现微信授权登陆
Jun 23 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
Apr 17 Javascript
动态加载JavaScript文件的3种方式
May 05 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
May 30 Javascript
在实例中重学JavaScript事件循环
Dec 03 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 Vue.js
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
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
php对象工厂类完整示例
2018/08/09 PHP
编写Js代码要注意的几条规则
2010/09/10 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
jquery常用操作小结
2014/07/21 Javascript
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
实例浅析js的this
2016/12/11 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
ES6学习教程之模板字符串详解
2017/10/09 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
python入门基础之用户输入与模块初认识
2016/11/14 Python
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
Python人脸识别初探
2017/12/21 Python
python实现随机漫步算法
2018/08/27 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
python按比例随机切分数据的实现
2019/07/11 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
公共机构节能宣传周活动总结
2014/07/09 职场文书
工作经常出错的检讨书
2014/09/13 职场文书
安全守法证明
2015/06/23 职场文书
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS