vue删除对象的某个属性_vue中删除一条数据
2024-11-10 09:55 - 立有生活网
jascript如何去除对象的某个属性
js中其实是有delete这个关键字的
vue删除对象的某个属性_vue中删除一条数据
vue删除对象的某个属性_vue中删除一条数据
vue删除对象的某个属性_vue中删除一条数据
var obj = {key1: 'value1', key2: 'value2'};
delete obj.key1;这样就能删除obj中的key1了。
不过delete不能删除直接使用var定义的变量。
表单元素常用 input select radio checkbox textarea 等,v-model有三个修饰符,例如input元素 v-model.trim去掉输入值的前后空格和v-model.number,将输入的字符串转换为number,v-model.lazy 输入的数据不再实时更新,而是数据失去焦点的时候再更新输入的数据比如:
var varresources/ability.js1 = 'value1';
delete var1;
Vue中使用v-for渲染数据为何要添加key属性?(原理及作用)
依赖收集和触发依赖更新主要由两个类来完成, Dep 和 Watcher 。在Vue中使用v-for进行列表渲染的时候,它会默认使用“就地更新”的策略。
当Vue在进行列表渲染的时候,Vue会直接对已有的标签就地更新,并不会将所有的标签全部重新删除和重建,只会重新渲染数据,然后再创建新的元素直到数据渲染完为止。
key属性可以用来提升v-for渲染的效率,vue中使用v-for渲染数据的时候,并不会去改变原有的元素和数据,而是创建新的元素,再把新的数据渲染进去。
下面举个例(1)将vue中的data中的内容绑定到输入文本框和文本中子看看加key属性和不加key属性的区别:
注意:key属性的取值必须是 number 或者 string,不能是对象,而且使用 v-for 循store.$subscribe() 的方法的第二个参数options对象,是各种配置参数,包括环的每一项的值,都必须保证性。
在VueJS中如何设置用户权限
本篇文章主要给大家讲述了VueJS应用中管理用户权限的详细过程和方法,以及相关的代码展示,需要的朋友参考下吧。
在需要身份验证的前端应用里,我们经常想通过用户角色来决定哪些内容可见。比如,游客身份可以阅读文章,但注册用户或才能看到编辑按钮。
在前端中管理权限可能会有点麻烦。你之前可能写过这样的代码:
if (user.type === || user.auth && t.owner === user.id ) {
...
}作为代替方案,一个简洁轻量的库——CASL——可以让管理用户权限变得非常简单。只要你用CASL定义了权限,并设置了当前用户,就可以把上面的代码改为这样:
if (abilities.can('update', 'Post')) {
...
}在这篇文章里,我会展示如何在前端应用里使用Vue.js和CASL来管理权限。
比如,CASL规则能够标明用户可以对给定的资源和实例(帖子、文章、评论等)进行哪些CRUD(Create, Read, Update和Delete)作。
设我们有分类广告网站。最显而易见的规则就是:
游客可以浏览所有帖子
可以浏览所有帖子,并且可以更新或删除
使用CASL,我们用AbilityBuilder来定义规则。调用can来定义一条新规则。例如:
onst { AbilityBuilder } = require('casl');
export function(type) {
AbilityBuilder.define(can => {
switch(type) {
case 'guest':
can('read', 'Post');
break;
case 'admin':
can('read', 'Post');
break;
// Add more roles here
};现在,就可以用定义的规则来检查应用权限了。
let currentUser = {
id: 999,
name: "Julie"
type: "registered",
};
let abilities = defineAbilitiesFor(currentUser.type);
Vueponent({
template: `
Please log in
`,
props: [ 't' ],
comd: {
showPost() {
return abilities.can('read', 'Post');
});Demo 课程作为演示,我做了一个用来展示分类广告帖子的/客户端应用。这个应用的规则是:用户能够阅读帖子或发帖,但是只能更新或删除自己的帖子。
我用Vue.js和CASL来方便地运行和扩展这些规则,即使以后添加新的作或实例也将很方便。
现在我就带你一步步搭建这个应用。如果你想一睹为快,请戳这个Github repo。
定义用户权限我们在 resources/ability.js中定义用户权限。CASL的一个优点是与环境无关,也就是说它既能在Node中运行,也能在浏览器中运行。
我们会把权限定义写到一个CommonJS模块里来保证Node的兼容性(Webpack能让这个模块用在客户端)。
const casl = require('casl');
module.exports = function defineAbilitiesFor(user) {
return casl.AbilityBuilder.define(
{ subjectName: => .type },
can => {
can(['read', 'create'], 'Post');
can(['update', 'delete'], 'Post', { user: user });
});
};下面我们来剖析这段代码。
define方法的第二个参数,我们通过调用can来定义了权限规则。这个方法的个参数是你要允许的CRUD作,第二个是资源或实例,在这个例子中是Post。
注意第二个can的调用,我们传了一个对象作为第三个参数。这个对象是用来测试user属性是否匹配我们提供的user对象。如果我们不这么做,那不光创建者可以删帖,谁都可以随便删了。
...
casl.AbilityBuilder.define(
...
can => {
can(['read', 'create'], 'Post');
can(['update', 'delete'], 'Post', { user: user });
});CASL检查实例来分配权限时,需要知道实例的type。一种解决方式是把具有subjectName方法的对象,作为define方法的个参数,subjectName方返回实例的类型。
我们通过在实例中返回type来达成目的。我们需要保证,在定义Post对象时,这个属性是存在的。
...
casl.AbilityBuilder.define(
{ subjectName: => .type },
...
);,我们把我们的权限定义封装到一个函数里,这样我们就可以在需要测试权限的时候直接传进一个user对象。在下面的函数中会更易理解。
const casl = require('casl');
module.exports = function defineAbilitiesFor(user) {
...
};Vue 中的访问权限规则现在我们想在前端应用中检查一个对象中,用户具有哪些CRUD权限。我们需要在Vue组件中访问CASL规则。这是方法:
引入Vue和 abilities plugin。这个插件会把CASL加到Vue的原型上,这样我们就能在组件内调用了。
在Vue 应用内引入我们的规则(例: resources/abilities.js)。
定义当前用户。实战中,我们是通过来获取用户数据的,在这个例子中,我们简单地硬编码到到项目里。
牢记,abilities模块export一个函数,我们把它称为defineAbilitiesFor。我们会向这个函数传入用户对象。现在,无论何时,我们可以通过检测一个对象来得出当前用户拥有何种权限。
添加abilities插件,这样我们就可以在组件中像这样来进行测试了:this.$can(...)。
src/main.js
import Vue from 'vue';
import abilitiesPlugin from './ability-plugin';
const defineAbilitiesFor = require('../resources/ability');
let ability = defineAbilitiesFor(user.id);
Vue.use(abilitiesPlugin, ability);Post 实例我们的应用会使用分类广告的帖子。这些表述帖子的对象会从数据库中检索,然后被传给前端。比如:
我们的Post实例中有两个属性是必须的:
type属性。CASL会使用 abilities.js中的subjectName回调来检查正在测试的是哪种实例。
user属性。这是发帖者。记住,用户只能更新和删除他们发布的帖子。在 main.js中我们通过defineAbilitiesFor(user.id)已经告诉了CASL当前用户是谁。CASL要做的就是检查用户的ID和user属性是否匹配。
let ts = [
{type: 'Post',
user: 1,
content: '1 used cat, good condition'
},
{type: 'Post',
user: 2,
content: 'Second-hand bathroom wall'
}];这两个t对象中,ID为1的George,拥有个帖子的更新删除权限,但没有第二个的。
在对象中测试用户权限帖子通过Post组件在应用中展示。先看一下代码,下面我会讲解:
src/components/Post.vue
点击Delete按钮,捕获到点击,会调用del处理函数。
我们通过this.$can('delete', t)来使用CASL检查当前用户是否具有作权限。如果有权限,就进一步作,如果没有,就给出错误提示“只有发布者可以删除!”
端测试在真实项目里,用户在前端删除后,我们会通过 Ajax发送删除指令到接口,比如:
src/components/Post.vue
if (this.$can('delete', t)) {
axios.get(`/delete/${t.id}`, ).then(res => {
...
});
}不应信任客户端的CRUD作,那我们把CASL测试逻辑放到:
server.js
app.get("/delete/:id", (req, res) => {
let tId = parseInt(req.params.id);
let t = ts.find(t => t.id === tId);
if (ability.can('delete', t)) {
ts = ts.filter(cur => cur !== t);
res.json({ success: true });
} else {
res.json({ success: false });
}});CASL是同构(isomorphic)的,上的ability对象就可以从abilities.js中引入,这border-radius: x;样我们就不必任何代码了!
封装此时,在简单的Vue应用里,我们就有非常好的方式管理用户权限了。
我认为this.$can('delete', t) 比下面这样优雅得多:
...
相关文章:
JS中的单例模式实现对数据增删改查
使用Vue仿制今日(详细教程)
React开发如何配置eslint
js遍历对象的几种方法以及 删除对象中的某个元素的方法
运行结果:注意:这里容易与遍历数pinia store 支持扩展,通过 pinia 插件我们可以实现以下组的for of 方法混淆
1、存在一个名为obj的元素DeleteAttr(obj,"attributeName");//删除名称为attributeName的属性。理解VUE2双向数据绑定原理和实现
CASL 速成课程CASL可以让你定义一系列规则来限制哪些资源对用户可见。1.vue 双向数据绑定是通过 数据劫持 结合 发布模式的方式来实现的, 也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变;
然后,在向碎片化文档中添加时,每个都处理一下。2.核心:关于VUE双向数据绑定,其核心是 Object.defineProperty()方法;
11.v-once: 指令指的是元素仅仅绑定一次,只是渲染一次3.介绍一下Object.defineProperty()方法
(1)Object.defineProperty(obj, prop, descriptor) ,这个语法内有三个参数,分别为 obj (要定义其上属性的对象) prop (要定义或修改的属性) descriptor (具体的改变方法)
这样我们就能实现js的双向数据绑定,也对这个方法有初步的了解 ;
这个例子实现的效果是:随着文本框输入文字的变化,span中会同步显示相同的文字内容;这样就实现了 model => view 以及 view => model 的双向绑定。
通过添加keyup来触发set方法,而set再修改了访问器属性的同时,也修改了dom样式,改变了span标签内的文本。
1.实现效果
先来看一下vue双向数据绑定是如何进行的,以便我们确定好思考方向
2.任务拆分
拆分任务可以让我们的思路更加清晰:
(2)当文本框的内容改变时,vue实例中的data也同时发生改变
(3)当data中的内容发生改变时,输入框及文本的内容也发生变化
3.开始任务1——绑定内容
我们先了解一下 DocuemntFragment(碎片化文档) 这个概念,你可以把他认为一个dom收容器,当你创造了10个,当每个都插入到文档当中都会引发一次浏览器的回流,也就是说浏览器要回流10次,十分消耗资源。
而使用碎片化文档,也就是说我把10个都先放入到一个容器当中,我再把容器直接插入到文档就可以了!浏览器只回流了1次。
注意:还有一个很重要的特性是,如果使用appendChid方法将原dom树中的添加到DocumentFragment中时,会删除原来的。
举个例子:
但是,当我通过DocumentFragment 劫持数据一下后
注意:我的碎片化文档是将子都劫持了过来,而我的id为app的div内已经没有内容了。
同时要主要我while的判断条件。判断是否有子,因为我每次appendChild都把node中的个子劫持走了,node中就会少一个,直到没有的时候,child也就变成了undefined,也就终止了循环。
来实现内容绑定
我们要考虑两个问题,一个是如何绑定要input上,另一个是如何绑定要文本中。
这样思路就来了,我们已经获取到了div的所以子了,就在DocumentFragment里面,然后对每一个进行处理,看是不是有跟vm实例中有关联的内容,如果有,修改这个的内容。然后重新添加入DocumentFragment中。
首先,我们写一个处理每一个的函数,如果有input绑定v-model属性或者有{{ xxx }}的文本出现,就进行内容替换,替换为vm实例中的data中的内容
创建Vue的实例化函数
效果图如下:
我们成功将内容都绑定到了输入框与文本上!
4、实现任务2——【view => model
对于此任务,我们从输入框考虑,输入框的问题,输入框如何改变data。我们通过keyup,input等,来获取到的value,然后通过Object.defineProperty将获取的的value,赋值给实例vm的text,我们把vm实例中的data下的text通过Object.defineProperty设置为访问器属性,这样给vm.text赋值,就触发了set。set函数的作用一个是更新data中的text,另一个等到任务三再说。
首先实现一个响应式属性的函数。一旦有赋新值就发生变化
然后,实现一个观察者,对于一个实例 每一个属性值都进行观察。
改写编译函数,注意由于改成了访问器属性,访问的方法也产生变化,同时添加了,把实例的text值随时更新
实例函数中,观察data中的所有属性值,注意增添了observe
最终我们改变input中的内容能改变data中的数据,单页面却没有刷新
4、实现任务3——【model => view】
通过修改vm实例的属性 该改变输入框的内容 与 文本的内容。
这里涉及到一个问题 需要我们注意,当我们修改输入框,改变了vm实例的属性,这是1对1的。
但是,我们可能在页面中多处用到 data中的属性,这是1对多的。也就是说,改变1个model的值可以改变多个view中的值。
这就需要我们引入一个新的知识点:
/发布者模式
发布模式(又称观察者模式)定义了一种一对多的关系,让多个观察者同时某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察者对象。
发布者发出通知 => 主题对象收到通知并推送给者 => 者执行相应作
1举个例子:
之前提到的set函数的第二个作用 就是来提醒者 进行noticy作,告诉他们:“我的text变了!” 文本变成了者,接到消息后,立马进行update作
回顾一下,每当 new 一个 Vue,主要做了两件事:个是数据:observe(data),第二个是编译 HTML:nodeToFragement(id)。
在编译 HTML 的过程中,会为每个与数据绑定相关的生成一个者 watcher,watcher 会将自己添加到相应属性的 dep 容器中。
接下来我们要实现的是:发出通知 dep.notify() => 触发者的 update 方法 => 更新视图。
这里的关键逻辑是:如何将 watcher 添加到关联属性的 dep 中。
注意: 我把直接赋值的作改为了 添加一个 Watcher 者
那么,Watcher又该做些什么呢?
首先,将自己赋给了一个全局变量 Dep.target;
其次,执行了 update 方法,进而执行了 get 方法,get 的方法读取了 vm 的访问器属性,从而触发了访问器属性的 get 方法,get 方法中将该 watcher 添加到了对应访问器属性的 dep 中;
再次,获取属性的值,然后更新视图。
,将 Dep.target 设为空。因为它是全局变量,也是 watcher 与 dep 关联的桥梁,任何时刻都必须保证 Dep.target 只有一个值。
最终我们就实现了这个双向数据绑定功能,虽然很繁琐,但我相信,你多打几遍,一定会对你有所帮助,加油吧!!
vue常用14个指令
messageEl.addEventListener('animationend', () => {Vue 中提供了14个比较常用的指令,如
1.v-model :双向数据绑定,
2.v-show: 元素的显示和隐藏,
频繁作元素的显示和隐藏,就用v-show ,原理是作的dom 的css样式 display的值是true还是false
元素的显示和隐藏,原理是,是否创建元素的dom,例如表格中某条数据是否显示编辑,删除按钮,由后台传的数据解决的,这种不频繁作的情况可用v-if,v-if 可以加入template标签中判断 v-show 不可以
4.v-else : 和v-if 搭配使用
5.v-else-if :条件满足v-if ?
不满足判断v-else-if 如果还不满足直接走v-else 这个的使用方式和我们的js 中的 if ,else if() ,else 是类似的使用方式
6.v可以看到,我的app中有两个子,一个元素,一个文本-bind: 绑定
v-bind:class v-bind:style v-bind:attribute / message.js /v-bind可以省略成:写成 :class :style :attribute
7.v-on :绑定常用
下面的常用去掉on 改为@click:点击某个对象时触发@clickondblclick:双击某个对象时触发@dblclickonmouseover:鼠标移入某个元素时触发@mouseoveronmouseout:鼠标移出某个元素时触发@mouseoutonmouseenter:鼠标进入某个元素时触发@onmouseenter
8.v-for:项目中常用循环数组的指令。
9.v-html :将字符串html 转换为结构显示,
项目中基本不这种方式去处理,涉及到安全性问题
10.v-text:防止为了{{}} 闪烁问题 项目不常用
12.v-cloak:指的是cloak 等元素编译结束以后才会显示dom
13.v-pre :跳过当前元素及子元素的编译过程,先进行编译
14.v-slot:插槽
Vue2和Vue3的区别&&Vue3的组合式API
由于定时器里边我们已经实现:修改输入框内容 => 在回调函数中修改属性值 => 触发属性的 set 方法。要移除消息,然后用户手动关闭也要移除消息,所以我们直接把移除消息提取出来封装成一个方法(1)、vue2:是一个构造函数,通过该构造函数创建一个Vue实例
(2)、Vue3:是一个对象。并通过该对象的createApp()方法,创建一个vue实例。
(1)、Vue2:可以通过el选项和$mount()方法来挂载容器。
(2)、Vue3:只能通过mount()方法来挂载容器
(1)、Vue2:data选项可以是一个对象,也可以是一个方法(由方法返回一个对象)。
(2)、Vue3:data选项只能是一个方法,由方法返回一个对象。
(1)、Vue2:后添加的属性不具备响应式。要想实现响应式只有两种方法。
(1)、 set()方法给对象添加新的属性,确保新添加的属页面中:性同样具备响应式。
(3)、作数组后同时要具有响应式,必须要使用下面的方法:push(在数组的面添加数据)、pop(删除数组的一个数据)、unshift(在数组前面添加内容)、shift(删除数组最前面的数据)、sort(排序)、rrse(反转)、spl(截取删除)
(2)、Vue3:vue3是自动实现数据响应式。
(1)、Vue2:定义方法的时候需要写在mods里面
在Vue2中,后添加的属性是非响应式的。页面不更新。需要用get()和set()方法.
(2)、Vue3:组合式API的作用是将原来分散开来定义的数据、方法、计算属性、、组合起来定义一个完整的业务。
ref:用来定义响应式数据
在IE中,如何使用JS删除DOM对象的属性
然后在 setup 中使用in判断的是对象的所有属性,包括对象实例及其原型的属性;
// 如果你是在增加move-out后直接调用messageEl.remove,那么你不会看到任何动画效果而hasOwnProperty则是判animation: message-move-in 0.3s ease-in-out;断对象实例的是否具有某个属性。
示例代码:
以上代码执行的时候,name属性要么是从实例中获取的,要么是来源于原型,所以使用in 来访问 name属性始终返回true;而hasOwnProperty()只在属性存在与对象实例中时才返回true,当删除了实例中的name属性后,就恢复了原型中name属性的连接,所以返回allen。
vue中如何获取window的所有对象包括自己赋值的
在数据的过程中,我们会为 data 中的每一个属性生成一个主题注意:Object.keys方法返回的是一个由对象属性组成的数组对象 dep。该获取方法有使用window.window访问自身、使用全局变量或命名空间、使用for.in循环遍历window对象的所有属性。
1、使用window.window访问自身:window.window会返回一个包含window对象本身的对象。可以通过这个对象来访问和作其他在window对象上定义的对象、属性和方法。
2、使用全局变量或命名空间:如果在window对象上定义了其他全局变量或命名空间,可以直接通过这些变量或命名本来访问。
3、使用for.in循环遍历window对象的所有属性:可以使用for.in循环来遍历window对象的所有属性,包括自己赋值的对象。在循环中,可以通过属性名来访问每个属性的transform: translateY(-);值。
如何用原生js写一个弹窗消息提醒插件
}}1.分析
let user = { id: 1, name: 'George' };当消息被触发的时候,会有一个自上而下的淡入过程。
在持续了一段时间后会自动的消失,或者是需要用户来手动的点击关闭按钮。
在消息消失的时候,会有一个自下而上的淡出过程。
消息是可以叠加弹出的,的消息会排在消息列表的面。
当前面的消息消失后,后面的消息会有一个向上滑动效果。
消息图标,用来区分不同类型的消息。
消息文本。
关闭按钮,并不是所有消息都需要关闭按钮。 2. 实现样式
那么,不管我们是用原生js还是vue,首先呢,我们都需要把这个消息的基本样式给写出来,然后再通过js来控制消息的弹出和关闭。
所以,我们先来写html和css。
#message-container {
ition: fixed;
left: 0;
top: 0;
right: 0;
/ 采用flex弹性布局,让容器内部的所有消息可以水平居中,还能任意的调整宽度 /
display: flex;
flex-direction: column;
align-s: center;
}#message-container {
background: #fff;
margin: 10px 0;
padding: 0 10px;
height: 40px;
box-shadow: 0 0 10px 0 #eee;
font-size: 14px;
/ 让消息内部的三个元素(图标、文本、关闭按钮)可以垂直水平居中 /
display: flex;
align-s: center;
}#message-container .text {
color: #333;
padding: 0 20px 0 5px;
}#message-container .close {
cursor: pointer;
color: #999;
}/ 给每个图标都加上不同的颜色,用来区分不同类型的消息 /
#message-container .icon- {
color: #0482f8;
}#message-container .icon-error {
color: #f83504;
}#message-container .icon-success {
color: #06a35a;
}#message-container .icon-warning {
color: #ceca07;
}#message-container .icon-loading {
color: #0482f8;
}3. 实现动画 接下来要做的就是这个消息的弹出和消失动画,我们还是用css来实现。
想要在css里边实现自定义的动画,首先需要用@keyframes来定义一个动画规则,然后再通过animation属性把动画应用到某个元素上就可以了。
所谓的动画规则其实就是一个动画序列,或者可以理解为一个个的关键帧,而关键帧的内部就是你想改变的css属性,你可以在关键帧里边写上几乎任何的css属性,当动画被应用的时候,这些css属性就会根据各个关键帧做出相应的变换。
那我们先用@keyframes来写一个动画规则吧
/ 这个动画规则我们就叫做message-move-in吧,随后我们会用animation属性在某个元素上应用这个动画规则。 /
@keyframes message-move-in {
0% {
/ 前边分析过了,弹出动画是一个自上而下的淡入过程 /
/ 所以在动画初始状态要把元素的不透明度设置为0,在动画结束的时候再把不透明度设置1,这样就会实现一个淡入动画 /
opacity: 0;
/ 那么“自上而下”这个动画可以用“transform”变换属性结合他的“translateY”上下平移函数来完成 /
/ translateY(-)表示动画初始状态,元素在实际位置上面“自身一个高度”的位置。 /
} {
opacity: 1;
/ 平移到自身位置 /
transform: translateY(0);
然后我们再定义一个和message元素同级的类move-in,把message-move-in这个动画规则给应用到move-in类上,这样我们需要让哪个消息弹出,就只需要在消息的类上加一个move-in就行。
#message-container {
/ animation属性是用来加载某个动画规则 请参考 /
}可以看到,只需要在某个message上追加一个move-in就能实现弹出动画。
那么,消失动画也是一个套路,只不过跟弹出动画反过来而已。
@keyframes message-move-out {
0% {
opacity: 1;
transform: translateY(0);
} {
opacity: 0;
#message-container {
animation: message-move-out 0.3s ease-in-out;
/ 让动画结束后保持结束状态 /
animation-fill-mode: forwards;
}animation-fill-mode: forwards;这个是干嘛的呢?因为动画结束后默认会回到元素的最初状态,在这里表现的是消失后又出现了。
所以animation-fill-mode: forwards;是为了让动画结束后保持这个结束状态,也就是不在显示了。
4. 编写js插件 那么,在写js之前呢,我们先来思考一下,如果你是插件的使用者,你想怎么来调用这个插件?
我们的插件很简单,就是在需要的时候弹出一个消息,设插件他提供给我们的是一个类,就叫做Message吧,并且他内部有一个show方法,那么只要使用者实例化这个类后,调用他的show方法,然后传入不同的参数就可以弹出一个消息了。而且我们所实例化的对象可以是全局的。
// message可以定义为全局对象,项目中可以直接调用。
const message = new Message();
message.show({
type: 'success',
text: '点个关注不迷路~'
});
所以呢,我们要先写一个Message类,并且必须要实现一个show方法。
class Message {
constructor() {
}show({ type = '', text = '' }) {
这里我直接用了es6的class,其实他的内部还是原型链的形式。用class呢,可以让我们更直观的了解这个类。
根据我们在部分的分析,所有的消息元素都是需要在js中创建的,所以我们不需要使用者来写任何html代码,那么我们只需要在对象被实例化new Message()的时候,就去创建消息容器message-container,后续在调用show方法时候,直接把消息插入到message-container内部即可。
class Message {
/
构造函数会在实例化的时候自动执行
/
constructor() {
const containerId = 'message-container';
// 检测下html中是否已经有这个message-container元素
this.containerEl = document.getElementById(containerId);
if (!this.containerEl) {
// 创建一个Element对象,也就是创建一个id为message-container的dom
this.containerEl = dcan(['update', 'delete'], 'Post');ocument.createElement('div');
this.containerEl.id = containerId;
// 把message-container元素放在html的body末尾
document.body.appendChild(this.containerEl);
show({ type = '', text = '' }) {
这样,我们调用const message = new Message()的时候会在dom中自动的插入一个message-container。
那么,最重要的还是我们的show方法:
创建一个消息,并把它追加到message-container容器的末尾。
设定一个时间,在这个时间结束后自动的将消息移除。
“关闭按钮”的click,来让用户可以手动的移除消息。
我们一步一步来。
4.1 创建一个消息,并把它追加到message-container容器的末尾。 class Message {
// 省略...
show({ type = '', text = '' }) {
// 创建一个Element对象
let messageEl = document.createElement('div');
// 设置消息class,这里加上move-in可以直接看到弹出效果
messageEl.className = 'message move-in';
// 消息内部html字符串
messageEl.innerHTML = `
`;
// 追加到message-container末尾
// this.containerEl属性是我们在构造函数中创建的message-container容器
this.containerEl.appendChild(messageEl);
}我们来调用下试试~
// message可以定义为全局对象,项目中可以直接调用。
const message = new Message();
document.querySelector('.btn').addEventListener('click', () => {
message.show({
type: 'success',
text: '点个关注不迷路~'
});
});
4.2 设定一个时间,在这个时间结束后自动的将消息移除。 // message.js
class Message {
// 省略...
show({ type = '', text = '', duration = 2000 }) {
// 省略...
// 用setTimeout来做一个定时器
setTimeout(() => {
// Element对象内部有一个remove方法,调用之后可以将该元素从dom树种移除!
}, duration);
可以看到,消息在过了2秒后,自动的从dom树中移除了,不过呢并没有动画,还记得前边我们写了move-out类吗?这个类和message是同级的。现在我们只需要在定时结束后把这个类应用到message元素上就行。
// message.js
class Message {
// 省略...
show({ type = '', text = '', duration = 2000 }) {
// 省略...
// 用setTimeout来做一个定时器
setTimeout(() => { // 首先把move-in这个弹出动画类给移除掉,要不然会有问题,可以自己测试下
messageEl.className = messageEl.className.replace('move-in', ''); // 增加一个move-out类
messageEl.className += 'move-out';
// 这个地方是动画结束,在动画结束后把消息从dom树中移除。
// Element对象内部有一个remove方法,调用之后可以将该元素从dom树种移除!
});
}, duration);
4.3 “关闭按钮”的click,来让用户可以手动的移除消息。 有时候呢,我们希望消息能够一直展示,直到用户来手动的关闭掉,那么首先我们要加一个参数,用来控制是否展示这个关闭按钮。
// message.js
class Message {
// 省略...
show({ type = '', text = '', duration = 2000, closeable = false }) {
// 创建一个Element对象
let messageEl = document.createElement('div');
// 设置消息class,这里加上move-in可以直接看到弹出效果
messageEl.className = 'message move-in';
// 消息内部html字符串
messageEl.innerHTML = `
`;
// 是否展示关闭按钮
// 创建一个关闭按钮
let closeEl = document.createElement('div');
closeEl.className = 'close icon icon-close';
// 把关闭按钮追加到message元素末尾
messageEl.appendChild(closeEl);
// 关闭按钮的click,触发后将调用我们的close方法
// 我们把刚才写的移除消息封装为一个close方法
closeEl.addEventListener('click', () => {
this.close(messageEl)
});
}// 追加到message-container末尾
// this.containerEl属性是我们在构造函数中创建的message-container容器
this.containerEl.appendChild(messageEl);
// 只有当duration大于0的时候才设置定时器,这样我们的消息就会一直显示
if (duration > 0) {
// 用setTimeout来做一个定时器
setTimeout(() => {
this.close(messageEl);
}, duration);
/
关闭某个消息
@param {Element} messageEl
/
close(messageEl) {
// 首先把move-in这个弹出动画类给移除掉,要不然会有问题,可以自己测试下
messageEl.className = messageEl.className.replace('move-in', '');
// 增加一个move-out类
messageEl.className += 'move-out';
// 这个地方是动画结束,在动画结束后把消息从dom树中移除。
// Element对象内部有一个remove方法,调用之后可以将该元素从dom树种移除!
});
我们来调用下试试~
/
学驾照需要多长时间:影响因素详解
学驾照需要多长时间是一个常见的问题,取决于多种因素。本文将深入探讨这些因素,帮助您了解完成驾照课程所需的时间。 学驾照需要多长时间:影响因素详解 学驾照需要多长时间:影响因素详···
标题:解锁苹果查找功能的无限潜力
引言:在充斥着各种技术和便利功能的现代世界中,苹果查找功能作为一款无与伦比的工具脱颖而出,它赋予用户随时随地查找其丢失设备和贵重物品的能力。无论您是丢失了 iPhone、iPad 还是 Air···
Alt+F4 键:理解它的功能和用法
在计算机领域,Alt+F4 键组合扮演着至关重要的角色。这个键组合通常用于关闭当前活动的窗口或程序。 Alt+F4 键:理解它的功能和用法 Alt+F4 键:理解它的功能和用法 Alt+F4 的运作原理 当按 Alt 键并···