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. 微服务SpringCloud之注册中心Consul

    Consul 介绍 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发 ...

  2. 暑期——第九周总结(1,林子雨老师关于hdfs eclipse案例报错问题【已解决】)

    所花时间:7天 代码行:1000(Java)+500(Python)+300(C++) 博客量:1篇 了解到知识点 : 一: 解决"Class org.apache.hadoop.hdfs. ...

  3. Flutter免费(视频)教程汇总

    Flutter学习导航 Flutter简介: Flutter可以轻松快速地构建漂亮的移动应用程序. Flutter是谷歌的移动应用SDK,用于短时间内在iOS和Android上制作高质量的原生界面应用 ...

  4. 关于json字符串与实体之间的严格验证

    在一个项目中要求严格验证传入的json字符串与定义的 类匹配,否则不记录.感觉这个严格验证找了好多资料才找到,可能用的人比较少,特摘出来给大家分析,直接上代码了:   using Newtonsoft ...

  5. Spring boot 梳理 - SpringBoot中注入ApplicationContext对象的三种方式

    直接注入(Autowired) @Configuration public class OAConfig { @Autowired private ApplicationContext applica ...

  6. Spring 梳理 - AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)

    Spring  AOP那些学术概念—通知.增强处理连接点(JoinPoint)切面(Aspect)   1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是 ...

  7. CentOS 安装lsof命令

    1.在控制台上输入:# yum install lsof,安装过程中按y进行确认 2.使用lsof -i :port 可以产看端口的进程信息

  8. 多tomcat服务和nginx负载均衡配置

    1.nginx服务安装及配置,详见:linux 配置之安装nginx 2.多个tomcat服务安装及配置,详见:linux 配置多个tomcat 3.关键配置nginx.conf文件 http { i ...

  9. Java源码解析|String源码与常用方法

    String源码与常用方法 1.栗子 代码: public class JavaStringClass { public static void main(String[] args) { Strin ...

  10. MySql一个生产死锁案例分析

    接到上级一个生产环境MySQL死锁日志信息文件,需要找出原因并解决问题.我将死锁日志部分贴出如下: 在mysql中使用命令:SHOW ENGINE INNODB STATUS;总能获取到最近一些问题信 ...