UI组件

Vue开发插件流程

本来是昨天要写总结的,感觉自己写不好,就放弃了。今天看到了iview和element有一些摩擦,是关于代码借鉴的问题(哈哈),不做评价。谁下生会写组件,我仿(chao)写了radonUI,这个组件体量比较小,好仿写。就是以这个为切入口写UI组件,先自己写,然后在仿写。看看别人写的比如bootstrap,这样提高挺快的。其实UI组件套路差不多,写过一遍就有感觉了。不像以前没想法、没思路。

概述

大部分组件我都写了一遍,剩下的要参考iview和element组件。这些组件中表格、表单、tree还是比较有难度的,前俩个还没有实践。下面是我的总结

全局插件notification

  1. 思考:在全局组件中要做到像window.alert()一样调用,在代码任何的地方调用,就有收集‘调用结果’的地方。
  2. 这时候插件思想就出现了,就像把alert写在window上,把调用的方法写在Vue上

代码:

// plugins.js

import Vue from 'vue'
import Notification from './Notification.js' export default { // install是Vue写插件固有方法
install: function (Vue, {
notification=true
}={}) {
if ( notification ) {
Notification(Vue);
}
}
};

{notification=true}={}

是options,写插件的时候可以提供这个选项,他的作用决定组件是否自动加载。这样的调用插件可以

import myPlugin from './plugins/plugins.js'
Vue.use(myPlugin)

如果{notification=false}={}就改变调用方式

import myPlugin from './plugins/plugins.js'
Vue.use(myPlugin, {
notification: true
})
// Notification.js

import Vue from 'vue'
import { olNotification } from "../components/index" // 注册全局的组件
// 创建一个div 把olNotification组件挂在到div中,就可以调用组件中方法了,把‘调用结果’放到组件(olNotification)中,来展示视图 const div = document.createElement('div');
div.innerHTML = `<ol-notification></ol-notification>`;
document.body.appendChild(div);
const notification = new Vue({
el: div,
components: { olNotification }
}).$children[0]; export default function() {
Vue.prototype.$Notification = {
remove (item, duration){
setTimeout(() => {
notification.closeItem(item)
}, duration)
},
create(type, title, content, duration){
let data = {
title,
content,
duration
} // 把‘调用结果’放到组件
notification.addItem(data)
if(duration){ // 一段时间(duration)把‘调用结果’移除组件
this.remove(data, duration)
}
}, // 四种组件形态
success (title, content, duration) {
this.create('success', title, content, duration)
},
info (title, content, duration) {
this.create('info', title, content, duration)
},
warning (title, content, duration) {
this.create('warning', title, content, duration)
},
failed (title, content, duration) {
this.create('failed', title, content, duration)
}
}
}
// olNotification.vue
<style lang = "sass" >
.ol-notification-container {
position: fixed;
top: 1rem;
right: 1rem;
z-index: 9999;
}
.ol-notification{
position: relative;
width: 20rem;
background-color: #fff;
margin-right: 1rem;
border: 1px solid #eaf8fe;
border-radius: 4px;
padding: 1rem 1.5rem;
margin-bottom: 1rem;
&.success,
&.warning,
&.failed,
&.info {
padding-left: 4rem;
}
&.success {
.rd-notification-icon {
color: #87d068;
}
}
&.info {
.rd-notification-icon {
color: #2db7f5;
}
}
&.warning {
.rd-notification-icon {
color: #fa0;
}
}
&.failed {
.rd-notification-icon {
color: #f50;
}
}
}
.ol-notification-title {
font-size: .9rem;
}
.ol-notification-content {
color: #999;
font-size: .8rem;
line-height: 1.5;
margin: 0;
}
.ol-notification-close {
position: absolute;
top: .2rem;
right: .5rem;
font-size: .8rem;
color: #ccc;
}
.ol-notification-close:hover {
color: #969696;
}
.ol-notification-icon{
position: absolute;
top: 50%;
font-size: 1.5rem;
left: 1rem;
margin-top: -.75rem;
line-height: 1.5rem;
}
.notification-enter {
opacity: 0;
}
.notification-enter-active, .notification-leave {
transition: opacity .5s ease;
}
.notification-leave-active {
opacity: 0;
position: absolute;
}
.notification-move {
transition: transform .5s cubic-bezier(.55,0,.1,1);
}
</style>
<template>
<div class="ol-notification-container" >
<transition-group name="notification">
<div
class="ol-notification"
v-for="(item, index) in allItem"
v-bind:key="item"
>
<span class="ol-notification-title">{{item.title}}</span>
<p class="ol-notification-content">{{item.content}}</p>
<span class="ol-notification-close ion-close-round" @click="closeItem(item)"></span>
</div>
</transition-group >
</div>
</template>
<script>
export default {
computed: {
},
components: {
},
data () {
return {
allItem: []
}
},
mounted() {
},
methods:{
closeItem (item) {
this.allItem = this.allItem.filter(function(current) {
return current !== item
})
},
addItem (item) {
this.allItem.push(item);
}
}
}
</script>

createObjectURL

window.URL.createObjectURL(blob|| file) 方法会根据传入的参数创建一个指向该对象的URL,这个URL 的生命周期仅仅存在于被创建的文档里面新的对象URL指向执行的File对象或者是Blob对象.

File对象或者Blob对象

这里大概说下File对象和Blob对象:

File对象,就是一个文件,比如我用input type="file"标签来上传文件,那么里面的每个文件都是一个File对象.

Blob对象,就是二进制数据,比如通过new Blob()创建的对象就是Blob对象.又比如,在XMLHttpRequest里,如果指定responseType为blob,那么得到的返回值也是一个blob对象.

注意点:

每次调用createObjectURL的时候,一个新的URL对象就被创建了.即使你已经为同一个文件创建过一个URL. 如果你不再需要这个对象,要释放它,需要使用URL.revokeObjectURL()方法. 当页面被关闭,浏览器会自动释放它,但是为了最佳性能和内存使用,当确保不再用得到它的时候,就应该释放它.

二.URL.revokeObjectURL

URL.revokeObjectURL()方法会释放一个通过URL.createObjectURL()创建的对象URL. 当你要已经用过了这个对象URL,然后要让浏览器知道这个URL已经不再需要指向对应的文件的时候,就需要调用这个方法.

具体的意思就是说,一个对象URL,使用这个url是可以访问到指定的文件的,但是我可能只需要访问一次,一旦已经访问到了,这个对象URL就不再需要了,就被释放掉,被释放掉以后,这个对象URL就不再指向指定的文件了.

比如一张图片,我创建了一个对象URL,然后通过这个对象URL,我页面里加载了这张图.既然已经被加载,并且不需要再次加载这张图,那我就把这个对象URL释放,然后这个URL就不再指向这张图了.

仿写vue UI 组件总结 (自己练习,仿照现有的UI组件)的更多相关文章

  1. vue 专题 vue2.0各大前端移动端ui框架组件展示

    Vue 专题 一个数据驱动的组件,为现代化的 Web 界面而生.具有可扩展的数据绑定机制,原生对象即模型,简洁明了的 API 组件化 UI 构建 多个轻量库搭配使用 请访问链接: https://ww ...

  2. 使用 vue 仿写的一个购物商城

    在学习了 vue 之后,决定做一个小练习,仿写了一个有关购物商城的小项目.下面就对项目做一个简单的介绍. 项目源码: github 项目的目录结构 -assets 与项目有关的静态资源,包括 css, ...

  3. ElementUI(vue UI库)、iView(vue UI库)、ant design(react UI库)中组件的区别

    ElementUI(vue UI库).iView(vue UI库).ant design(react UI库)中组件的区别: 事项 ElementUI iView ant design 全局加载进度条 ...

  4. 仿ElementUI构建自己的Vue组件库用babel-plugin-component按需加载组件及自定义SASS主题

    最近使用ElementUI做项目的时候用Babel的插件babel-plugin-component做按需加载,使得组件打包的JS和CSS包体积大大缩小,加载速度也大大提升,所有想模仿做一个组件库也来 ...

  5. vue-class-component 以class的模式写vue组件

    vue英文官网推荐了一个叫vue-class-component的包,可以以class的模式写vue组件.vue-class-component(以下简称Component)带来了很多便利: 1.me ...

  6. vue+element UI + axios封装文件上传及进度条组件

    1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...

  7. 使用Vue CLI 3将基于element-ui二次封装的组件发布到npm

    前言:之前在网上找的好多都是基于vue-cli 2.x的,而使用vue-cli 3的文章比较少,Vue CLI 3 中文文档,所以我在自己尝试的时候把几篇文章结合了一下,调出来了我想要的模式,也就是V ...

  8. 安卓开发笔记(三十三):Android仿写微信发现

    首先我们来看看仿写之后的效果: 看到是这个界面我们首先应该思考这些按钮是怎么做出来的?有了一个整体的思路之后才知道该怎么办.最开始我想的就直接利用button控件上面直接加上png的图片就可以形成一个 ...

  9. 安卓开发学习笔记(七):仿写腾讯QQ登录注册界面

    这段代码的关键主要是在我们的相对布局以及线性布局上面,我们首先在总体布局里设置为线性布局,然后再在里面设置为相对布局,这是一个十分常见的XML布局模式. 废话不多说,直接上代码:一.activity. ...

随机推荐

  1. Python集训营45天—Day07 (面向对象编程进阶)

    目录 1. @property装饰器 2. 魔法方法 3. 类属性和实例属性 4.静态方法和类方法 5. 单继承和多继承 6. 多态 7. del 方法 序言:上个章节我们了解了面向对象的基础知识,这 ...

  2. execl开发 新接触

    https//www.baidu.com/home/news/data/newspage?nid=3186684148848912913&n_type=0&p_from=1&d ...

  3. ReactNative实现GridView

    ReactNative内置了ListView组件但是没有类似GridView这样的组件.利用一些已经有的属性是可以实现GridView的,利用ContentContainerStyle的属性然后配合样 ...

  4. IDEA新建一个多maven模块工程(有图)

    对于一些大型的项目来说,将项目的各个模块理清并进行管理,便于后续项目的维护,使用maven管理是很方便的,它可以很好的构建模块来设计项目的整体结构,对一些小型的项目不建议使用 1.新建父maven模块 ...

  5. 2019-ccpc秦皇岛现场赛

    https://www.cnblogs.com/31415926535x/p/11625462.html 昨天和队友模拟了下今年秦皇岛的区域赛,,,(我全程在演 题目链接 D - Decimal 签到 ...

  6. 深入理解SpringCloud之Gateway

    虽然在服务网关有了zuul(在这里是zuul1),其本身还是基于servlet实现的,换言之还是同步阻塞方式的实现.就其本身来讲它的最根本弊端也是再此.而非阻塞带来的好处不言而喻,高效利用线程资源进而 ...

  7. 自己写的Weblogic的poc

    """ 暂时只试用于Linux,先试试用一下反弹shell CVE-2017-10271的EXp """ import requests i ...

  8. BF算法(蛮力匹配)

    输入主串a,模式b b在a中的位置 1.在串a和串b中设置比较的下标i=0,j=0: 2.重复下述操作,直到a或b的所有字符均比较完毕: 2.1如果a[i]等于b[i],继续比较a和b的下一对字符: ...

  9. python 安装pyqt

    ---恢复内容开始--- 一.安装 1.官网:www.riverbankcomputing.com 2.使用命令安装,可以自动去官网查找与Python版本号相同的程序进行下载,比较方便,如果不是这样也 ...

  10. 初识域渗透利器Empire

    Empire 是一款类似Metasploit 的渗透测试框架,基于python 编写,Empire是一个纯粹的PowerShell 后开发代理,建立在密码安全通信和灵活的架构上.Empire 实现了无 ...