前端组件化设计——布局、逻辑、视图

1、拆分页面:将一个页面拆分红几个部分,如:父子包裹、左右或上下布局canvas

<!-- 上下布局 -->
<template>
  <el-card
    style="background: #fff;min-height: 800px"
    shadow="never">
    <div
      slot="header"
      style="height: 28px">
      <!-- 标题 -->
      <span>xxxx列表<span/>
    </div>
    <!--内容-->
    <div>
      <featureTable :parameters="parameters"/>
    </div>
  </el-card>
</template>

2、表格操做部分,属于中间件——处理复杂逻辑、数据转换数组

1.纯展现的表格app

<template>
  <el-card id="activityManage">
    <div slot="header">
      <el-button
        type="primary"
        @click="addRowDialog"
      >新建</el-button>
    </div>
    <el-row >
      <el-col>
        <CommonTable
          :table-data="tableData"
          :table-column="tableColumn"
          height="680"
          :loading="listLoading"
        >
          <el-table-column
            type="index"
            label="序号"
            align="center"
            width="60"
            slot="header">
            <template slot-scope="scope">
              {{ (currentPage-1)*pageSize+scope.$index+1 }}
            </template>
          </el-table-column>
          <el-table-column
            label="操做"
            align="center"
            width="150"
            slot="footer">
            <template slot-scope="scope">
              <el-button-group>
                <el-button
                  type="primary"
                  @click="editRowDialog(scope.$index, scope.row)">编辑</el-button>
                <el-button
                  type="danger"
                  @click="deleteRowDialog(scope.$index, scope.row)">删除</el-button>
              </el-button-group>
            </template>
          </el-table-column>
        </CommonTable>
        <!-- 分页 -->
        <Pagination
          style="margin-top:20px"
          :table-begin="tableBeigin"
          @changTable="getTablePage"/>
        <!-- 2.对话框 -->
        <el-dialog
          top='60px'
          :title="dialogTitle"
          :visible.sync="dialogVisible"
          :width="dialogWidth"
          :close-on-click-modal="false"
          :show-close="!showCancelButton"
        >
          <component
            :is='componentType'
            :show-btn='showCancelButton'
            :form-info='formInfo'
            @form-change='hanldeFormChange'
          />
        </el-dialog>
    </el-row>
  </el-card>
</template>

2.复杂的内容须要自定义编辑器

<template>
  <div>
    <!-- 新建+搜索 -->
    <el-row>
      <el-col :span="4">
        <el-button
          type="primary"
          @click="featureNew"
        >新建xxx</el-button>
      </el-col>
      <el-col
        :span="4"
        :offset="parameters.privatePage==='我的'?16:20">
        <el-input
          v-model="searchInfo"
          placeholder="关键字搜索"
          clearable
          @clear="searchInfoMatch"
          @keyup.enter.native="searchInfoMatch(searchInfo)">
          <el-button
            slot="append"
            icon="el-icon-search"
            @click="searchInfoMatch(searchInfo)"/>
        </el-input>
      </el-col>
    </el-row>
    <!-- 自定义表格合并 -->
    <el-table
      style='margin-top:20px'
      v-loading="parameters.loading"
      :data="tableData"
      border
      :span-method="colspanMethod"
    >
      <el-table-column
        show-overflow-tooltip
        width="120"
        align="center"
        prop="type"
        label="xx分类"
      />
      <!--操做-->
      <el-table-column
        align="center"
        label="操做"
        width="200">
        <template slot-scope="scope">
          <el-button-group>
            <el-button
              @click="tableRowChange(scope, 'edit')"
              type="primary"
              :disabled="scope.row.app_id===''">查看编辑</el-button>
          </el-button-group>
          <el-dropdown
            trigger="click">
            <el-button type="primary">
              更多<i class="el-icon-arrow-down el-icon--right"/>
            </el-button>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item
                style="padding:0"
                v-for="(item,index) in tableRowMore"
                :key='index'>
                <el-button
                  style="padding: 7px 15px;width:100%"
                  @click="tableRowChange(scope, item.action)"
                  type="text"
                  :disabled="scope.row.app_id===''">{{ item.name }}</el-button>
              </el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页组件 -->
    <el-pagination
        style="margin-top: 15px"
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        :current-page="currentPage"
        :page-sizes="pageSizes"
        :page-size="pageSize"
        layout="total, sizes, prev, pager, next, jumper"
        :total="pageTotal"/>
    <!-- 2.对话框 -->
    <el-dialog
      top='60px'
      :title="dialogTitle"
      :visible.sync="dialogVisible"
      :width="dialogWidth"
      :close-on-click-modal="false"
      :show-close="!showCancelButton"
    >
        xxx表单内容xxx
        <span slot="footer">
          <el-button
            @click="handleClose('ruleForm')">取消</el-button>
          <el-button
            type="primary"
            @click="submitNewActivity('ruleForm')">肯定</el-button>
        </span>
    </el-dialog>
</template>

3、展现组件:函数

好比通用表格组件、搜索框组件、分页组件、表单校验组件(若是大于1个使用component组件动态切换)、按钮弹框(放大编辑)、通用的编辑器组件、可视化图形组件等,固然通用的函数、数据配置等也能够抽离出来,或者使用第三方库实现:布局

import CommonTable from 'module-comp/table/CommonTable'
import _ from 'lodash' // 第三方库
import {getSpanArr} from '@/utils/xxxManage'// 公共的方法或数据配置
import canvasInstanceStatus from 'mixins/xxxStatus'// 插入实现方法,比较隐晦很差维护mixins:[xxx]
import Pagination from './Pagination'// 通用的分页组件或自定义须要的内容

化繁为简:spa

好比上面的表格操做比较繁琐,使用数组遍历输出菜单,设置通用的方法调用(设置一个type区分);code

又如:表格输出列自适应时,标题也能够设置成一个数组格式,经过遍历的形式进行输出,示例在下面component

 

    <el-table
      :max-height="height"
      ref="commonTable"
      :data="tableData"
      :size="size"
      :stripe="stripe"
      border
      highlight-current-row
      v-loading="loading"
      :row-class-name="tableRowClassName"
      @filter-change="filterChange"
      @selection-change="handleSelectionChange"
      :row-key="rowKey"
    >
      <!--自定义插入-->
      <slot name="header"/>
      <el-table-column
        v-for="(item, index) in tableColumn"
        :key="`key_${index}`"
        :prop="item.prop"
        :label="item.label"
        show-overflow-tooltip
        :sortable='sortable'
        align="center"
      >
        <template slot-scope="scope">
          <div v-if="tableColumn[index].prop === 'field_key'">
            <span>{{ keyOptionsObj[scope.row.field_key] }}</span>
          </div>
          <div v-else>
            <span>{{ scope.row[tableColumn[index].prop] }}</span>
          </div>
        </template>
      </el-table-column>
      <!--自定义插入-->
      <slot name="footer"/>
    </el-table>

 

须要注意的问题:组件的通信问题,一般组件须要进行联动效果,这须要注意传值的技巧(只传一个对象)、以及回调方法尽可能设置到中间件(连续回调2次以上就不利于维护了)......orm

相关文章
相关标签/搜索