仿写vue UI 组件总结 (自己练习,仿照现有的UI组件)
UI组件
Vue开发插件流程
本来是昨天要写总结的,感觉自己写不好,就放弃了。今天看到了iview和element有一些摩擦,是关于代码借鉴的问题(哈哈),不做评价。谁下生会写组件,我仿(chao)写了radonUI,这个组件体量比较小,好仿写。就是以这个为切入口写UI组件,先自己写,然后在仿写。看看别人写的比如bootstrap,这样提高挺快的。其实UI组件套路差不多,写过一遍就有感觉了。不像以前没想法、没思路。
概述
大部分组件我都写了一遍,剩下的要参考iview和element组件。这些组件中表格、表单、tree还是比较有难度的,前俩个还没有实践。下面是我的总结
全局插件notification
- 思考:在全局组件中要做到像window.alert()一样调用,在代码任何的地方调用,就有收集‘调用结果’的地方。
- 这时候插件思想就出现了,就像把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组件)的更多相关文章
- vue 专题 vue2.0各大前端移动端ui框架组件展示
Vue 专题 一个数据驱动的组件,为现代化的 Web 界面而生.具有可扩展的数据绑定机制,原生对象即模型,简洁明了的 API 组件化 UI 构建 多个轻量库搭配使用 请访问链接: https://ww ...
- 使用 vue 仿写的一个购物商城
在学习了 vue 之后,决定做一个小练习,仿写了一个有关购物商城的小项目.下面就对项目做一个简单的介绍. 项目源码: github 项目的目录结构 -assets 与项目有关的静态资源,包括 css, ...
- ElementUI(vue UI库)、iView(vue UI库)、ant design(react UI库)中组件的区别
ElementUI(vue UI库).iView(vue UI库).ant design(react UI库)中组件的区别: 事项 ElementUI iView ant design 全局加载进度条 ...
- 仿ElementUI构建自己的Vue组件库用babel-plugin-component按需加载组件及自定义SASS主题
最近使用ElementUI做项目的时候用Babel的插件babel-plugin-component做按需加载,使得组件打包的JS和CSS包体积大大缩小,加载速度也大大提升,所有想模仿做一个组件库也来 ...
- vue-class-component 以class的模式写vue组件
vue英文官网推荐了一个叫vue-class-component的包,可以以class的模式写vue组件.vue-class-component(以下简称Component)带来了很多便利: 1.me ...
- vue+element UI + axios封装文件上传及进度条组件
1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...
- 使用Vue CLI 3将基于element-ui二次封装的组件发布到npm
前言:之前在网上找的好多都是基于vue-cli 2.x的,而使用vue-cli 3的文章比较少,Vue CLI 3 中文文档,所以我在自己尝试的时候把几篇文章结合了一下,调出来了我想要的模式,也就是V ...
- 安卓开发笔记(三十三):Android仿写微信发现
首先我们来看看仿写之后的效果: 看到是这个界面我们首先应该思考这些按钮是怎么做出来的?有了一个整体的思路之后才知道该怎么办.最开始我想的就直接利用button控件上面直接加上png的图片就可以形成一个 ...
- 安卓开发学习笔记(七):仿写腾讯QQ登录注册界面
这段代码的关键主要是在我们的相对布局以及线性布局上面,我们首先在总体布局里设置为线性布局,然后再在里面设置为相对布局,这是一个十分常见的XML布局模式. 废话不多说,直接上代码:一.activity. ...
随机推荐
- 品Spring:SpringBoot发起bean定义注册的“二次攻坚战”
上一篇文章整体非常轻松,因为在容器启动前,只注册了一个bean定义,就是SpringBoot的主类. OK,今天接着从容器的启动入手,找出剩余所有的bean定义的注册过程. 具体细节肯定会颇为复杂,同 ...
- 【THE LAST TIME】彻底吃透 JavaScript 执行机制
前言 The last time, I have learned [THE LAST TIME]一直是我想写的一个系列,旨在厚积薄发,重温前端. 也是给自己的查缺补漏和技术分享. 欢迎大家多多评论指点 ...
- SpringSecurity原理剖析与权限系统设计
Spring Secutity和Apache Shiro是Java领域的两大主流开源安全框架,也是权限系统设计的主要技术选型.本文主要介绍Spring Secutity的实现原理,并基于Spring ...
- redis-分布式锁-刷新信号量
为什么需要刷新信号量呢,因为信号量有过期时间: 为什么信号量需要过期时间呢,因为需要利用超时特性,解决分布式锁存在的一些固有缺陷. 而对于类似流式API来说,一般10秒的过期时间是远远不够的.因此我们 ...
- 一个网站完整的SEO优化方案,方法,怎么做seo优化?
SEO优化主要分为站内优化,站外优化.如果非得说一套完整的SEO优化方案,那就是需要4名专业人员:前端人员,内容编辑,网络推广人员,和数据分析人员.那以下就详细介绍这四个岗位各自负责的工作有哪些: 一 ...
- linux下搭建nginx+mysql+apache
对于开发人员来说,进行Web开发时可以用Apache进行网站测试,然而当一个Web程序进行发布时,Apache中并发性能差就显得很突出,这时配置一台Nginx服务器显得尤为重要. 以下是配置Nginx ...
- Java 学习笔记之 线程安全
线程安全: 线程安全的方法一定是排队运行的. public class SyncObject { synchronized public void methodA() { try { System.o ...
- Activity初学乍练
1.Activity的概念与Activity的生命周期图: 注意事项: onPause()和onStop()被调用的前提是: 打开了一个新的Activity!而前者是旧Activity还可见的状态:后 ...
- java中不创建使用第三方变量,交换两个数的值
1.直接使用算术运算法交换 先把两个数的和赋值给其中一个,然后做减法.例如num1=num1+num2; 此时num2(交换之后)就等于num1减去num2:废话不多说,直接上代码 public cl ...
- 【TencentOS tiny】深度源码分析(6)——互斥锁
互斥锁 互斥锁又称互斥互斥锁,是一种特殊的信号量,它和信号量不同的是,它具有互斥锁所有权.递归访问以及优先级继承等特性,在操作系统中常用于对临界资源的独占式处理.在任意时刻互斥锁的状态只有两种,开锁或 ...