前端项目公共组件封装思想

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 该文介绍了如何封装通用组件,如表单搜索、表格展示和分页器。首先,通过抽离出公共部分,创建`TableContainer`组件,利用具名插槽插入`navbar`和`table`,并通过props传递标题。然后在父组件中使用具名插槽和子组件实现具体功能。文中还展示了更复杂的组件封装示例,通过props实现数据双向绑定,以`el-pagination`为例,利用`sync`修饰符和`computed`属性监听并更新父组件状态,实现分页功能。文章最后提到了内容来源于哪。

1. 通用组件(表单搜索+表格展示+分页器)

在项目当中我们总会遇到这样的页面:页面顶部是一个表单筛选项,下面是一个表格展示数据。表格下方是一个分页器,这样的页面在我们的后台管理系统中经常所遇到,有时候可能不止一个页面,好几个页面的结构都是这种。如图:

本人记得,在react中的高级组件库中有这么一个组件,就实现了这么一个效果。就拿这个页面来说我们实现一下组件封装的思想:1.首先把每个页面的公共部分抽出来,比如标题等,用props或者插槽的形式传入到组件中进行展示 2. 可以里面数据的双向绑定实现跟新的效果 3. 设置自定义函数传递给父组件要做上面事情

1.将公共的部分抽离出来

js

复制代码

TableContainer组件
<template>
    <div class="container">
      <slot name="navbar"></slot>
      <div class="box-detail">
        <div class="detail-box">
          <div class="box-left">
            <div class="left-bottom">
              <div class="title-bottom">{{ title }}</div>
              <div class="note">  
                <div class="note-detail">
                  <slot name="table"></slot>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <el-backtop style="width: 3.75rem; height: 3.75rem" :bottom="10" :right="5">
        <div
          style="
             {
              width: 5.75rem;
              flex-shrink: 0;
              border-radius: 2.38rem;
              background: #fff;
              box-shadow: 0 0.19rem 1rem 0 #2b4aff14;
            }
          "
        >
          <i class="el-icon-arrow-up" style="color: #6e6f74"></i>
        </div>
      </el-backtop>
    </div>
  </template>

这里的话利用了具名插槽插入了navbar、table组件,title通过props的属性传入到子组件当中。进行展示,

js

复制代码

父组件
    <TableContainer title="资源审核">
        <template v-slot:navbar>
            <my-affix :offset="0">
                <Navbar/>
            </my-affix>
        </template>
        <template v-slot:table>
            <SourceAuditTable/>
        </template>
    </TableContainer>

当然这是一个非常非常简单的组件封装案例

接下来我们看一个高级一点的组件封装

父组件

js

复制代码

<template>
  <div>
    <hr>
    <HelloWorld :page.sync="page" :limit.sync="limit" />
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue';
export default {
  data() {
    return {
      page: 1,
      limit: 5
    }
  },
  components: {
    HelloWorld
  },


}
</script>


父组件传递给子组件各种必要的属性:total(总共多少条数据)、page(当前多少页)、limit(每页多少条数据)、pageSizes(选择每页大小数组)

子组件

js

复制代码

<template>
  <el-pagination :current-page.sync="currentPage" :page-size.sync="pageSize" :total="20" />
</template>

<script>
export default {
  name: 'HelloWorld',

  props: {
    page: {
      default: 1
    },
    limit: {
      default: 5
    },
  },
  computed: {
    currentPage: {
      get() {
        return this.page
      },
      set(val) {
        //currentPage 这里对currentPage做出来改变就会走这里
        //这边更新数据走这里
        console.log('currentPage', this.currentPage)
        this.$emit('update:page', val)
      }
    },
    pageSize: {
      get() {
        return this.limit
      },
      set(val) {
        this.$emit('update:limit', val)
      }
    }
  },
  methods: {
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->


这里的page.sync、limit.sync目的就是为了实现数据的双向绑定,computed中监听page和limit的变化,子组件接收的数据通过computed生成的currentPage通过sync绑定到了 el-pagination中, 点击分页器的时候会改变currentPage 此时会调用set函数设置新的值,通过代码 this.$emit(update:page,value) 更新父组件中的值,实现双向的数据绑定


转载来源:https://juejin.cn/post/7312353213347708940


相关文章
|
30天前
|
前端开发
Github项目分享——免费的画图工具drow,最新前端面试题整理
Github项目分享——免费的画图工具drow,最新前端面试题整理
|
3天前
|
JavaScript 前端开发 Java
【Vue实战项目】学完前端基础后,可能你还需要掌握这些才能接手开发项目
【Vue实战项目】学完前端基础后,可能你还需要掌握这些才能接手开发项目
12 0
|
3天前
|
Web App开发 运维 前端开发
从0开始搭建一个前端项目的架子
从0开始搭建一个前端项目的架子
8 1
|
4天前
|
缓存 前端开发 JavaScript
Webpack作为模块打包器,为前端项目提供了高度灵活和可配置的构建流程
【6月更文挑战第12天】本文探讨了优化TypeScript与Webpack构建性能的策略。理解Webpack的解析、构建和生成阶段是关键。优化包括:调整tsconfig.json(如关闭不必要的类型检查)和webpack.config.js选项,启用Webpack缓存,实现增量构建,代码拆分和懒加载。这些方法能提升构建速度,提高开发效率。
25 3
|
10天前
|
前端开发
前端react入门day02-React中的事件绑定与组件
前端react入门day02-React中的事件绑定与组件
|
10天前
|
存储 前端开发 Windows
对于莫名其妙使用smarttomcat上传前端项目失败,上传css等静态资源失败等原因,及解决方法
对于莫名其妙使用smarttomcat上传前端项目失败,上传css等静态资源失败等原因,及解决方法
|
16天前
|
JavaScript 前端开发 API
【前端--Vue】组件之间的多种通信方式,一文彻底搞懂组件通信!
【前端--Vue】组件之间的多种通信方式,一文彻底搞懂组件通信!
【前端--Vue】组件之间的多种通信方式,一文彻底搞懂组件通信!
|
16天前
|
资源调度 JavaScript 前端开发
【前端开发---Vue2】史上最详细的Vue入门教程(六) --- 工程化开发和脚手架、组件注册
【前端开发---Vue2】史上最详细的Vue入门教程(六) --- 工程化开发和脚手架、组件注册
【前端开发---Vue2】史上最详细的Vue入门教程(六) --- 工程化开发和脚手架、组件注册
|
18天前
|
前端开发 JavaScript
前端综合练手小项目
前端综合练手小项目
|
22天前
|
前端开发 网络架构
1天搞定SpringBoot+Vue全栈开发 (8)前端路由VueRouter(进行组件切换)
1天搞定SpringBoot+Vue全栈开发 (8)前端路由VueRouter(进行组件切换)