热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

antdesignvue2.0递归菜单_Vue前端开发——组件篇

业务开发的过程中,经常会进行一些组件化的开发,组件常处理的一般有以下几种全局组件局部组件动态组件递归组件全局组件一般很多地方都会用到的一些功能我们一般封

业务开发的过程中,经常会进行一些组件化的开发,组件常处理的一般有以下几种

  1. 全局组件
  2. 局部组件
  3. 动态组件
  4. 递归组件

全局组件

一般很多地方都会用到的一些功能我们一般封装成全局组件去使用,常规的建立一个全局组件的方法是,公共组件放到components 目录文件下使用Vue.component去注册组件,然后在main.js 中去导入这个公共文件夹

// demoimport Vue from "vue";import layoutDemo from "./layoutDemo"Vue.component("tao-layout-demo", layoutDemo);// main.js 中导入components文件夹然后页面中就可以直接使用这个组件了

组件少的时候这样使用没啥意见,如果声明的组件多了每个都要这样去导入注册代码就有点不简洁了,我们可以使用require.context 去遍历文件自动注册

f9aea9f8ad37f3f621715af80e4d7f31.png

require.context 遍历

通过require.context 遍历目录下component.vue 或者component.js 的文件,根据组件name 属性作为组件名称,动态注册,当然了如果不规矩文件名为component 可以扫描所有的.vue文件,require.context这个还挺实用的,很多场景会遇到如注册遍历api、全局过滤器等

局部组件

一些只服务当前页面的功能,一般拆分成局部组件去使用,至于什么样的功能需要拆分组件使用,可根据功能结构拆分,比如你的页面整体结构有上中下三层每层中有会有其他的功能交互,这样的建议拆分,如果页面单一也没有业务交互,没必要拆分。

import designPage from "./designPage"export default { components: { designPage }}// 或者export default { components: { designPage: () => import('./designPage') }}

动态组件

常见的在列表界面中有增删改查详情的功能操作,不同操作对于不同的组件,这个时候如果普通组件加载的话你要在界面中每个组件都加入还要加if判断要操作的相应的那个组件就比较复杂繁琐了

.... 业务 ....

动态组件就比较爽了,根据你is 指定的名称渲染组件

cccee2d48e26e50a2198ade0db628f3b.png

根据不同的域名显示不同的登录页

递归组件

这个的场景在后台管理软件中最常见,如侧边栏菜单渲染的时候,递归就是根据一个条件自己掉自己,vue中每个页面都可以作为自身的组件调用,组件名称就是name 属性指定的名字,需要注意name 属性一定要加,不然没作用,下面示例渲染侧边菜单

49740d671918347b2ec1476c1c4e432c.png

渲染侧边菜单

组件通讯及事件处理

父子组件通讯

-简单一句话就是:父组件v-bing 绑定子组件props接收 this.$emit 触发时间父组件v-on 接收

  1. 父组件传递

// 传递所有属性// 传递指定参数// 也可以通过ref 直接赋值this.$refs.demo.name ="xxx" // 前提是子组件中 一定有name 这个字段属性

  1. 子组件接收

子组件通过pops 接收父组件传递过来的值,props 有两种方式数组和对象

export default { props: { name: { type: String , default:"默认值" } }}

  1. 子组件传值给父组件

export default { methods: { handleAdd() {this.$emit('click','add') } }}

其他组件传值处理一般采用事件总线或者vuex,事件总线一般就是说是一个所有组件共用的事件中心,所有组件你要发还是接收数据都平行的通过我去处理

怎样使用事件总线

  1. 创建eventBus.js 文件

import Vue from 'vue'export const eventBus = new Vue()

  1. 把这个js 挂载到原型链上

Vue.prototype.$eventBus = new Vue()

  1. 使用: 我们一个组件触发了add方法,另一个组件中需要得到这个值//

// 发送handleAdd(data) { this.$eventBus.$emit('add', data) }// 接收mounted() { this.$eventBus.$on('add', val => { console.log(val, 'val') }) }

vuex后面计划单独拿出来写一篇文章,本文不写了

混入(mixins)和继承(extends)

这两个几乎相同,又有点不同,混入可以多个,继承只能一个,都能把公共的一些属性及方法提取出来

mixins: [ initData ]----------------------------- extends: initData

比如你好几个组件都要用到v-model 绑定参数,可以新建个extends-config.js

import vueJsonEditor from "vue-json-editor";export default { props: { value: {} }, components: { vueJsonEditor }, computed: { schemaConfig: { get() { return this.value; }, set(val) { this.$emit("input", val); } }, options() { return this.$attrs.options; } }, methods: { event(type, value) { this.$emit(type, value); } }};

这样在组件中就可以继承这个文件了,不用单独的定义变量和函数方法了

最后再说下组件生命周期执行顺序吧

- 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted- 父beforeUpdate->子beforeUpdate->子updated->父updated- 影响到子组件: - 父beforeUpdate -> 子beforeUpdate->子updated -> 父updted- 不影响子组件: - 父beforeUpdate -> 父updated- 父beforeDestroy->子beforeDestroy->子destroyed->父destroyed



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了如何使用vue-awesome-swiper组件,包括在main.js中引入和使用swiper和swiperSlide组件,以及设置options和ref属性。同时还介绍了如何在模板中使用swiper和swiperSlide组件,并展示了如何通过循环渲染swipes数组中的数据,并使用picUrl属性显示图片。最后还介绍了如何添加分页器。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
author-avatar
hushuoni_133
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有