如何根据业务封装自己的功能组件


Posted in Javascript onApril 19, 2019

查询回显input的封

最近有幸在做一个管理系统采用的是vue+element-ui, 表单页面非常多, 而且都出奇的大,在多页面开发的时候做大表单的优缺点我大概先说一下, 我们的任务是, 基于现在的工具, 使他更简洁, 功能也不差, 而且更利于开发, 维护

直接进入正题

功能是这样:

表单中常有的功能是一个input绑定一个按钮, 当我点击按钮的时候, 弹出查询框, 里面有个小列表, 查到数据后点一行再回显, 很简单的需求, 但是会有大量的应用地点, 所以肯定不能复制粘贴, 输入框我们每次都可以写, 但是弹出来的小查询如果每个表单, 每个独立的弹框再去重复写就麻烦了, 但是如果我们把它提出来我们就轻松很多, 通过数据去控制功能

如何根据业务封装自己的功能组件

有些人可能觉得都是废话, 而且就这么个简单的东西, 写这么多有必要么(我想尽量的把我想到的说出来, 手动滑稽)

要做的就是这个查询的小列表, 我们整理一下要做的事情, 先做规划再写代码, 避免边写边改, 不然会让代码越来越难维护, 写到下面发现上面不该那么写, 再去改又懒的改, 然后就郁闷着勉为其难的提交上去了, 虽然功能在但自己看着都......

1. 分析需求: 我们需要什么元素?

  1. a. 一个form表单, 一个table, 分页(布局)
  2. b. n个条件框, 查询按钮, 重置按钮, 其他功能按钮(form内部)

通过整理元素我们知道, 有几样东西是固定的, 一个form, 一个不知道几列的table, 一个分页功能,查询, 重置按钮

整理出这个我们就可以第一步把元素构建全, 可能有n个的我们就用一个先占个位置, 结构如下:

<div class="box">
 <div class="form">
  <form action="">
   <input type="text"> *n
  </form>
 </div>
 <div class="table">
  <table>
   <tr> *n
    <td></td>
   </tr>
  </table>
 </div>
 <div class="paging"></div>
 <div class="button">
  <button>查询</button>
  <button>重置</button>
  <button>其余功能</button> *n
 </div>
</div>

*n的地方代表了接下来我们要用循环创建

2. 我们需要实现什么方法并且那些是要外部传递的

  1. a. 查询
  2. b. 点击分页后查询数据
  3. c. 重置
  4. d. 选中一行时拿到数据
  5. e. 其余功能的触发

这样一梳理, 就很清晰了, 因为我们的查数据和分页在一个接口中我就讲分页查询, 和普通查询放到了一个函数里, 所以methods中实现剩下的四个方法

methods: {
 searchData(pageNum = 0) {
  //查询数据, ES6参数赋值默认为0页
 },
 selectRowData(row) {
  //选中单行是触发的函数, 在各个ui框架table中都应该有这个方法, 我们只要实现它就行了
 },
 resetSearchForm() {
  //重置form参数
 },
 doFunction(){
  //执行其他函数
 }
}

好了, 接下来看看那些需要是外部传入的方法, 以及为什么要从外部传入

i. 首先是一个查询数据的方法

理由: 我们需要从外部传入, 这是个查询列表的组件, 我们肯定不是只适用于一个接口, 而是尽量让他各种各样情形下都适用于我们

ii. 选中单行后要传给父组件的方法

在vue中, 子组件是不能修改父组件的, 在框架封装中大部分是作者自己封装了dispatch 和 broadcast, 但是我们就应用于自己的项目, 所以我们不用那么麻烦, 如果想用可以去ui框架源码中复制一份出来用, 我们就通过父组件传一个函数给子组件, 然后子组件调用这个函数回调给父组件就好了, 所以要传一个函数

iii. 其他的执行函数

3. 我们要vue的data参数了, 并确定哪些是在组件中, 哪些是外部传入

a. from表单的数据绑定(但是我们不确定要有几个框所以这里要多留一步)

没错就这一个就够了, 我们要做的是可动态配置所以更多的来自于传参

  1. a. 传入一个input数组, 决定有几个条件搜索框
  2. b. 传入table的列的数组, 附带上每列宽度, 列名
  3. c. 传入其他功能按钮列表数组
  4. d. 传入查询出来的分页参数
  5. e. 传入查询出来的数据列表数组

4. 有了这些我们接下来就是一一实现这些东西就好了

还是先从结构开始

<div class="searchAlert">
   <div class="inputBox">
    <el-form :inline="true" :model="searchForm" class="searchAlertForm" ref="searchForm">
    <!--循环创建条件搜索框-->
     <el-form-item v-for="item in inputarr" :key="item.label" :prop="item.dataName">
      <el-tooltip :content="item.label" placement="top">
       <el-input v-model="searchForm[item.dataName]" :placeholder="item.label" size="mini"></el-input>
      </el-tooltip>
     </el-form-item>
    </el-form>
   </div>
   <div class="tableBox">
    <el-table :data="searchdatalist" style="width: 100%" size="mini" highlight-current-row
     @current-change="selectrowdata" :border="true">
     <!--循环创建table列-->
     <el-table-column v-for="item in coleumarr" :key="item.label" :prop="item.prop" :label="item.label"
      :width="item.width">
     </el-table-column>
    </el-table>
   </div>
   <!--判断是否显示页码条-->
   <div class="pagination" v-if="searchpaging">
    <el-pagination layout="prev, pager, next" :total="searchpaging.totalPage" :small="true"
     :page-size="searchpaging.pageSize" @current-change="searchdata">
    </el-pagination>
   </div>
   <div class="buttonBox">
    <el-button size="mini" @click="resetsearchform">重置</el-button>
    <el-button size="mini" @click="searchdata" type="primary">搜索</el-button>
    <el-button size="mini" v-for="btn in buttonArr" :key="btn.name" size="mini" @click="doFunction(btn.name)" :type="btn.type">btn.name</el-button>
   </div>
  </div>

5. 实现可供循环创建的数组结构

a. form(先创建一个, 然后放到数组中就好了)

{
 label:"输入框的名称"
 dataName:"作为双向数据绑定的名字, 同时作为绑定prop的名字"
}

 现在来看我们是不能在这个组件中直接定义好form的model结构的, 我们就要动态创建, 在组件中我们只要创建一个空的对象就好了

b. table-col

{
 label:"列名称"
 prop:"对应列内容的字段名"
 width:"单列宽度"
}

c. button

{
 name:"事件和按钮名字",
 type:"按钮类型"
}

6. 接下来我们去实现我们要传入的方法

//回显功能, 可以拿到单选数据
  searchCbFn(rowData) {
   console.log(rowData)
  },
  //查询功能, 分页等
  searchFn(formData, pageNum = 0) {
   api({formData:formData, pageData:pageNum}).then(res => {
    console.log(res.data)
    this.searchDataList = res.data.dataList
    //页面展示 分页大小控制
    this.searchPaging = { ...pagInfo, pageSize: 5 }
   }).catch(err => {
    throw err;
   })
  }

7. 最后我们就要补齐所有传入参数

searchDataList:{}
  searchPaging:{}

最后总结

这是我第一次写分享问, 所以应该还欠缺写逻辑, 如果什么不懂, 或者建议, 请多多告诉我, 代码我放在:https://github.com/wqliusong/happy有组件, 有可以直接运行的单页面

再说一下我遇到的问题吧, 一个就是vue的双向数据绑定是可以动态的,提醒一下大家, 对象后加动态的名字要用[], 不能用.的, 注意我的input那里就懂了, data里的参数也可以动态创建的, 有了这些我们可以解决很多问题, 所以我们不用很在意他的初始数据格式

接下来我还会写一个多行编辑的组件, 虽然很多ui中也有, 但是功能都略显单一, 可能我们程序员就是只要会1+1=2, 就能解决所有数学难题了的一帮人, 我要尝试让他功能丰富一点, 在一个就是关于动态增加验证条件的一些实现, 希望大家能有点收获

以上所述是小编给大家介绍的Vue封装功能组件详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
方便实用的jQuery checkbox复选框全选功能简单实例
Oct 09 Javascript
jQuery取消特定的click事件
Feb 29 Javascript
checkbox批量选中,获取选中项的值的简单实例
Jun 28 Javascript
ajax的分页查询示例(不刷新页面)
Jan 11 Javascript
js实现适合新闻类图片的轮播效果
Feb 05 Javascript
js实现增加数字显示的环形进度条效果
Feb 05 Javascript
node+express+ejs使用模版引擎做的一个示例demo
Sep 18 Javascript
vue 配置多页面应用的示例代码
Oct 22 Javascript
JavaScript寄生组合式继承原理与用法分析
Jan 11 Javascript
Node.js动手撸一个静态资源服务器的方法
Mar 09 Javascript
uploadify插件实现多个图片上传并预览
Sep 30 Javascript
微信小程序实现点赞业务
Feb 10 Javascript
vue项目打包上传github并制作预览链接(pages)
Apr 19 #Javascript
vue组件之间的数据传递方法详解
Apr 19 #Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
Apr 19 #Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
Apr 19 #Javascript
基于javascript的拖拽类封装详解
Apr 19 #Javascript
Bootstarp在pycharm中的安装及简单的使用方法
Apr 19 #Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
Apr 19 #Javascript
You might like
常用的php ADODB使用方法集锦
2008/03/25 PHP
PHP调用VC编写的COM组件实例
2014/03/29 PHP
单台服务器的PHP进程之间实现共享内存的方法
2014/06/13 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
JS获取节点的兄弟,父级,子级元素的方法
2014/01/09 Javascript
jquery无刷新验证邮箱地址实现实例
2014/02/19 Javascript
javascript中的五种基本数据类型
2015/08/26 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
JavaScript中SetInterval与setTimeout的用法详解
2015/11/10 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
Avalonjs 实现简单购物车功能(实例代码)
2017/02/07 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
python实现将文本转换成语音的方法
2015/05/28 Python
Python实现的简单dns查询功能示例
2017/05/24 Python
python使用super()出现错误解决办法
2017/08/14 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
Python 处理文件的几种方式
2019/08/23 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
医院总经理岗位职责
2014/02/04 职场文书
求职信怎么写范文
2014/05/26 职场文书
长江三峡导游词
2015/01/31 职场文书