全局组件设计

全局组件设计

不管是React、还是Vue也好,只要是App都需要一些基础的组件,如一些弹出窗:提示框Toast、确认框Confirm、模态框Modal、警告框Alert等等。这些弹出窗在Z轴都是比较高的(z-index高),且都有一个有点透明的黑色背景打底。

打底背景一般样式(_PopBox.scss)如下。由于很多弹出窗都需要这种背景,且有这么一个功能是,点击黑色背景,就关闭弹出窗。那么我们可以设计一个可以存放弹出内容,且点击打底背景就关闭弹出窗的组件。

// 变量存在于专门记录全局变量的文件中,参考bootstrap的变量文件
$pop-z-index: 12 !default;
$pop-bg-color: rgba(0,0,0,0.7) !default;

// 弹出窗的背景
.pop-box{
    position: fixed;
    left: 0;
    top: 0;
    height: 100%;
    width: 100%;
    background-color: $pop-bg-color;
    z-index: $pop-z-index;
}

这里采用Vue的组件作示范

<template>
    <div class=‘pop-box‘ :style=‘{display: open ? "block" : "none"}‘
        @click.stop.self=‘$emit("close")‘>
        <slot></slot>
    </div>
</tempalte>

使用:用<pop-box>组合成<confirm>组件

<template>
    <pop-box :open=‘confirm_open‘ @close=‘confirm_close_fn‘>
        <div class=‘pop-confirm‘>...</div>
    <pop-box>
</template>

在设计组件布局中,我采用舞台/话剧布局(乱起名)。我们在看话剧或者舞台剧的时候,一般有如下三要素

  • 舞台
  • 幕帘
  • 背景

其中幕帘位于最前方,舞台在中间,背景位于最后方。

这三者对应组件那些部分?

一般用脚手架生成一个Vue项目的时候,都会有一个App.vue的组件。所有组件都是这个组件的childrenApp = 幕帘 + 舞台 + 背景。在单页面应用中,我们一般都会用到路由vue-router或者react-router。而 router = 舞台 + 背景 ,舞台就是页面组件。除了路由之外,剩下的就是幕帘了,所以,我们的那些弹出窗可以充当幕帘,在我们需要提示或者确认用户的操作,就调出弹出窗,这个操作和幕帘很像很像。

幕帘(舞台 + 背景)的一个特点是,他们都是独立的。这里没有将舞台背景独立,是由于每个路由代表一个页面,且一般背景用的都是同一个样式,就没有必要拆分出来,如果应用有多个背景,可以拆分出来。这样,不管切换了那个路由,都不会影响弹出窗,它一直存在于App的children中。那么,如果我要在某个路由,某个页面中想调出弹出窗那要怎么办?Vuex或者redux + react-redux

涉及到多个组件共享一个状态,且无关父子关系,这个时候考虑用Vuex 或者 Redux

以下使用Vuex

常量: pop-constant.js

// pop-constant.js
export const POP_CONFIRM_OPEN = ‘pop-confirm-open‘

状态模块module: pop.js

import * as types from ‘@/modules/pop-constant‘

const state = {
    confirm: {
        open: false,
        text: ‘‘,
        cb: null
    }
}

const mutations = {
    [types.POP_CONFIRM_OPEN] (state, confirm) {
        state.confirm = Object.assign({}, state.confirm, confirm)
    }
}

const actions = {
    setConfirm ({commit}, confirm) {
        commit(types.POP_CONFIRM_OPEN, confirm)
    }
}

export default {
    namespaced: true,
    state,
    mutations,
    actions
}

缓存模块的命名空间maps.js

import {createNamespacedHelpers} from ‘vuex‘

// 这里缓存模块`pop.js`命名空间
export const popMaps = createNamespacedHelpers(‘pop‘)

Confirm.vue组件的<script>中

import {popMaps} from ‘@/modules/maps‘

// 映射pop.js模块的state和actions到组件上
const popActions = popMaps.mapActions([‘setConfirm‘])
const popState = popMaps.mapState([‘confirm‘])

export default {
    computed: {
        ...popState
    },
    methods: {
        ...popActions,
        closeConfirm (e) {
            this.setConfirm({open: false, cb: null})
        },
        // 要调出confirm就在那个需要调这个的组件中映射setConfirm且创建这个函数
        // 或者使用mixins 全局添加(所有组件都添加了,注意)或者局部添加
        // 像这种高频率的弹出窗(Toast),可以添加到全局mixin中
        // cb中的this要指定Vue实例 在vue组件中可以箭头函数或者bind this.openConfirm(‘haha‘, () => {})
        openConfirm (text, cb = null) {
            this.setConfirm({text, open: true, cb})
        },
        submit (res) {
            if (res) {
                const {cb} = this.confirm
                cb && cb()
            }
            return this.closeConfirm()
        }
    }
}

Confirm.vue组件中的<template>

<template>
    <pop-box :open=‘confirm.open‘ @close=‘closeConfirm‘>
        <div class=‘pop-confirm‘>
            <div class=‘confirm-text‘>{{confirm.text}}</div>
            <!-- 下面是确认和取消按钮 -->
            <ul class=‘confirm-btns‘>
                <li class=‘btn‘ @click=‘submit(false)‘>取消</li>
                <li class=‘btn‘ @click=‘submit(true)‘>确认</li>
            </ul>
        </div>
    </pop-box>
<template>

原文地址:https://www.cnblogs.com/lantuoxie/p/9044983.html

时间: 2024-10-18 03:09:22

全局组件设计的相关文章

【转载】COM 组件设计与应用(一)——起源及复合文件

原文:http://vckbase.com/index.php/wv/1201.html 一.前言 公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:“小杨呀,以后写程序就和搭积木一样啦.你赶快学习一些OLE的技术吧......”,当时我心里就寻思 :“开什么玩笑?搭积木方式写程序?再过100年吧......”,但作为一名听话的好学生,我开始在书店里“踅摸”(注1)有关OLE的书籍(注2).功夫不负有心人,终于买到了我的第一本COM书<OLE2 高级编程技术>,这本800多页的大布头花费了

HT图形组件设计之道(三)

上篇我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动,这类案例后续文章还会继续以便大家掌握更多的矢量应用场景,本篇我们先切换个话题,谈谈模型-视图-事件之间的关系. 图形组件设计架构上主要就是在规划Data模型,View视图和Event事件之间的关系,这些年业界逐渐将各种GUI设计模式提炼成理论归类,MVC.MVP和MVVM的主要大类常被统称为MV*,有很多文章进行各种设计模式的定义和比较,本篇不打算深入展开理论的讨论,不同图形

COM组件设计与应用(一)——起源及复合文件

本文摘自:http://blog.vckbase.com/teacheryang/archive/2005/06/27/8883.html 一.前言 公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:"小杨呀,以后写程序就和搭积木一样啦.你赶快学习一些OLE的技术吧......",当时我心里就寻思 :"开什么玩笑?搭积木方式写程序?再过100年吧......",但作为一名听话的好学生,我开始在书店里"踅摸"(注1)有关OLE的书籍(注2).功

【转载】COM 组件设计与应用(四)——简单调用组件

原文:http://vckbase.com/index.php/wv/1211.html 一.前言 同志们.朋友们.各位领导,大家好. VCKBASE 不得了, 网友众多文章好. 组件设计怎么学? 知识库里闷头找! 摘自---杨老师打油集录 在 VCKBASE 的顶力支持下,在各位网友回帖的鼓励下,我才能顺利完成系列论文的前三回.书到本回,我们终于开始写代码啦.写点啥那?恩,有了!咱们先从如何调用现成的简单的组件开始吧,同时也顺便介绍一些相关的知识. 二.组件的启动和释放 在第三回中,大家用“小

HT图形组件设计之道(一)

HT for Web简称HT提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方式.正如Hightopo官网所表达的我们希望提供:Everything you need to create cutting-edge 2D and 3D visualization. 这个愿景从功能上是个相当长的战线,从设计架构上也是极具挑战性的,事实上HT团队是很保守的,我们从不贪多图大,仅仅做我们感觉自己能得更好,能给用户综合体验更佳的功能,在这样理念驱动下我们慢慢形成了这种愿景,慢慢实现了几个有意义

【转载】COM 组件设计与应用(十七)——持续性

原文:http://vckbase.com/index.php/wv/1264.html 一.前言 我们写程序,经常需要实现这样的需求: 例一.程序运行产生一个窗口,用户关闭的时候需要记录窗口的位置,以便下次运行时保持位置不变: 例二.由于程序运行时间很长,今天执行一部分,明天继续执行.那么在下次运行前要恢复前次的状态: ... ... ... ... 智慧的老师:以上这些需求,如何实现呢? 懵懂的学生:这个简单,只要在程序退出前提取必要的信息保存到文件中,下次运行时再从文件中读出来,设置一下就

【转载】COM 组件设计与应用(九)——IDispatch 接口 for VC6.0

原文: http://vckbase.com/index.php/wv/1224.html 一.前言 终于写到了第九回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用.非常有用.非常精彩的一个 COM 功能.由于 WORD.EXCEL 等 OFFICE 软件提供了“宏”的功能,就连我们使用的VC开发环境也提供了“宏”功能,更由于 HTML.ASP.JSP 等都要依靠脚本(Script)的支持,更体现出了自动化接口的重要性. 如果你使用 vc6.0 的开发环境,

【转载】COM 组件设计与应用(八)——实现多接口

原文:http://vckbase.com/index.php/wv/1219.html 一.前言 从第五回开始到第七回,咱们用 ATL 写了一个简单的 COM 组件,之所以说简单,是因为在组件中,只实现了一个自定义(custom)的接口 IFun.当然如果想偷懒的话,我们可以把 200 个函数都加到这一个接口中, 果真如此的话,恐怕就没有人喜欢使用我们这个组件了.一个组件既然可以提供多个接口,那么我们在设计的时候,就应该按照函数的功能进行分类,把不同功能分类的函数用多个接口表现出来.这样可以有

【转载】COM 组件设计与应用(十一)—— IDispatch 及双接口的调用

原文:http://vckbase.com/index.php/wv/1236.html 一.前言 前段时间,由于工作比较忙,没有能及时地写作.其间收到了很多网友的来信询问和鼓励,在此一并表示感谢.咳......我也需要工作来养家糊口呀...... 上回书介绍了两种方法来写自动化(IDispatch)接口的组件程序,一是用 MFC 方式编写“纯粹”的IDispatch 接口:二是用 ATL 方式编写“双接口”的组件. 二.IDispatch 接口和双接口 使用者要想调用普通的 COM 组件功能,