vue如何封装可复用组件?举例说明封装过的组件

本文介绍了如何在Vue中封装可复用组件,包括组件的导入、注册和使用步骤,强调组件的封闭性和开放性。通过组件通讯和slot插槽实现数据传递。此外,还讲解了路由自定义参数的设置和全局引用组件的方法,旨在提升项目的复用性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在src目录文件下新建一个components文件,在这个文件中可以创建复用的组件

在需要用的组件需要经过三步,一是导入要用的这个组件,二是:注册组件,三是使用组件

封闭性:当在组件定义好外部不能修改;开放性:将动态内容和组件通讯方式进行传递数据保证组件可扩展性;

总结:通过vue提供的组件通讯结合slot插槽来区分

封装的组件如下:

在components文件里创建一个你要封装的组件

在这个组件里面实现样式布局

在props接收数据,点击搜索按钮或回车时,触发this..$emit将数据传递给父组件

在父组件中导入注册使用组件

封装组件

html – headTips/index.vue

<template>
  <div class="headTips">
    <van-nav-bar :title="text" :left-arrow="shows">
      <template #right>
        <van-popover
          v-model="showPopover"
          theme="dark"
          trigger="click"
          :actions="actions"
          @select="onSelect"
          placement="bottom-end"
          :offset="[8, 20]"
        >
          <template #reference>
            <div class="rgimg" v-if="!showrg"></div>
          </template>
        </van-popover>
      </template>
    </van-nav-bar>
  </div>
</template>

js

<script>
import { NavBar, Popover } from "vant";

export default {
  // 按需引入vant
  components: {
    [NavBar.name]: NavBar,
    [Popover.name]: Popover,
  },
  // 接收父组件参数
  props: {
  // 标题名称
    text: {
      type: String,
      default: "",
    },
    // 是否显示左边样式
    shows: {
      type: Boolean,
      default: null,
    },
    // 是否显示右边样式
    showrg: {
      type: Boolean,
      default: null,
    },
  },
  data() {
    return {
      // 气泡弹出框
      showPopover: false,
      actions: [
        { text: "首页",
          icon: require("./images/icon_02.png"),
          url: "/"
        },
        { text: "信贷",
          icon: require("./images/icon_03.png"),
          url: "/credit"
        },
        {
          text: "理财",
          icon: require("./images/icon_04.png"),
          url: "/financial",
        },
        {
          text: "保险",
          icon: require("./images/icon_05.png"),
          url: "/myDetails",
        },
      ],
    };
  },
  methods: {
  // 选中事件
    onSelect(action) {
      this.$router.push({
        path: action.url,
      });
    },
  },
};
</script>

为了方便项目优化在 router.js 配置属性完成封装

路由自定义参数

  • 使用meta属性进行参数属性定义
import Vue from 'vue';
import VueRouter from 'vue-router';

Vue.use(VueRouter);

// 避免路由重复点击引起的报错
//获取原型对象上的push函数
const originalPush = VueRouter.prototype.push
//修改原型对象中的push方法
VueRouter.prototype.push = function push(location) {
  return originalPush.call(this, location).catch(err => err)
}

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      name: 'home',
      component: () => import(/* webpackChunkName: "home" */ '@/views/home'),
      meta: {
        // 不显示组件(可不写 默认为false)
        headTip: false,
      }
    },
    {
      path: '/noticeList',
      name: 'noticeList',
      component: () => import(/* webpackChunkName: "home" */ '@/views/noticeList'),
      meta: {
        // 是否显示组件
        headTip: true,
        // 组件名称
        headTipText: '公告通知',
        // 是否显示左边后退(可不填 默认true)
        showTiplf: true,
        // 是否显示右边更多(可不填 默认true)
        showTiprg: true,
      }
    },
  ]
});

export default router;

全局引用

  • 为方便实用,在 app.vue 中进行判断并引用
<template>
  <div id="app">
    <headTips
      v-if="$route.meta.headTip"
      :text="$route.meta.headTipText"
      :shows="$route.meta.showTiplf"
      :showrg="$route.meta.showTiprg"
    />
    <router-view />
  </div>
</template>

import headTips from "@/components/headTips";

export default {
  name: "App",
  components: {
    headTips,
  },
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值