关于element-ui 中使用Notice组件(Message、MessageBox、Notification)所遇到的坑

今天在全局使用Message组件的时候(单独使用import Message from ‘element-ui’),发现第一次打开Message后再打开的Message无法关闭了,无论是使用showClose手动关闭还是通过duration来自动关闭,在第二次打开对应的组件的时候都无法关闭了,然而控制台也都没有报错
这里写图片描述

我的代码写法如下:

import { Message } from 'element-ui'

const message_conf = {
    showClose: true,
    message: '网络出错啦...',
    type: 'error',
    duration: 2000
}

//... some fn doing
Message(message_conf)

根据官网给出的demo:

this.$message({
    message: '居中的文字',
    center: true
});


单独引入 Message:

import { Message } from 'element-ui';
此时调用方法为 Message(options)。我们也为每个 type 定义了各自的方法,如 Message.success(options)。 并且可以调用 Message.closeAll() 手动关闭所有实例。

就是说可以在vm实例中通过this.$message(options)方法来调用出message,也可以通过在文件中单独引入Message,通过Message(options)来调用,而传入的options的配置都是相同的,因为我是在一个公用的server方法中写的Message,所以我想我是否可以放在vm实例中调用试一下呢,运行后发现,还是他么的不能关闭…
what the mother fucker???
这里写图片描述

然后我再仔细看了一遍官网的调用:

this.$message({
    message: '居中的文字',
    center: true
});

他传入的options是一个新的object, 而我第二次传入的和第一次传入的options都是同一个对象——message_conf,会不会是这个问题呢。然后我尝试了一下把传入的message_conf改成和官网一样的

Message({
    showClose: true,
    message: '网络出错啦...',
    type: 'error',
    duration: 2000
})

果然这样就他么不会出幺蛾子了。。

然后我在第一次调用Message后,console.log了一下传入的message_conf,果然,值他么改变了:
这里写图片描述

不要问我为啥const 修饰的对象为啥会改变,因为const 修饰引用类型的数据 都是修饰的是他的引用而不是实际对应的属性值。

就意味着,第一次调用Message的时候将传入的message_conf的值改变了,然后第二次传入的message_conf就是第一次被修改后的值,那么问题就一定是出在传入的值上。
经过我呕心沥血的测试(其实就那么一两分钟),发现导致无法关闭的关键属性是closed,第一次调用Message后传入的message_conf多了一个属性closed:true,再第二次传入的时候将这个属性传入的话 那么无论如何都无法关闭了。

我猜想的话,element-ui notice组件判定是否关闭就是通过传入的closed来判定的,第一次传入的option不包含这个属性,那么内置会通过Object.assign添加一个closed: false的属性到传入的对象中,然后在timer时间到或者执行close()方法的时候将 closed属性变为true。

本文研究的还不算深入,只是单纯的解决了一下遇到同样问题的童鞋,也浅谈了一下原理。有兴趣的同学可以自行看看源码~~

逼就装到这里了,告辞~
这里写图片描述

el-cascader-panel是一个基于Element UI的级联选择器组件,它可以让用户通过多个层级的面板来选择数据。在引用中提到,el-cascader-panel增加了全选按钮,并覆写了级联面板宽度。在引用中提到,可以通过initSelectedCodes方法来初始化勾选的资源。以下是一个el-cascader-panel的例子: ```html <template> <el-cascader-panel :options="options" :props="props" v-model="selectedValues" @change="handleChange" :show-all-levels="false" :check-strictly="true" :expand-trigger="expandTrigger" :clearable="clearable" :disabled="disabled" :filterable="filterable" :loading="loading" :placeholder="placeholder" :popper-class="popperClass" :render-format="renderFormat" :separator="separator" :size="size" :trigger="trigger" :value-format="valueFormat" :width="width" /> </template> <script> export default { data() { return { selectedValues: [], options: [ { value: 'zhinan', label: '指南', children: [ { value: 'shejiyuanze', label: '设计原则', children: [ { value: 'yizhi', label: '一致' }, { value: 'fankui', label: '反馈' }, { value: 'xiaolv', label: '效率' }, { value: 'kekong', label: '可控' } ] }, { value: 'daohang', label: '导航', children: [ { value: 'cexiangdaohang', label: '侧向导航' }, { value: 'dingbudaohang', label: '顶部导航' } ] } ] }, { value: 'zujian', label: '组件', children: [ { value: 'basic', label: 'Basic', children: [ { value: 'layout', label: 'Layout 布局' }, { value: 'color', label: 'Color 色彩' }, { value: 'typography', label: 'Typography 字体' }, { value: 'icon', label: 'Icon 图标' }, { value: 'button', label: 'Button 按钮' } ] }, { value: 'form', label: 'Form', children: [ { value: 'radio', label: 'Radio 单选框' }, { value: 'checkbox', label: 'Checkbox 多选框' }, { value: 'input', label: 'Input 输入框' }, { value: 'input-number', label: 'InputNumber 计数器' }, { value: 'select', label: 'Select 选择器' }, { value: 'cascader', label: 'Cascader 级联选择器' }, { value: 'switch', label: 'Switch 开关' }, { value: 'slider', label: 'Slider 滑块' }, { value: 'time-picker', label: 'TimePicker 时间选择器' }, { value: 'date-picker', label: 'DatePicker 日期选择器' }, { value: 'datetime-picker', label: 'DateTimePicker 日期时间选择器' }, { value: 'upload', label: 'Upload 上传' }, { value: 'rate', label: 'Rate 评分' }, { value: 'form', label: 'Form 表单' } ] }, { value: 'data', label: 'Data', children: [ { value: 'table', label: 'Table 表格' }, { value: 'tag', label: 'Tag 标签' }, { value: 'progress', label: 'Progress 进度条' }, { value: 'tree', label: 'Tree 树形控件' }, { value: 'pagination', label: 'Pagination 分页' }, { value: 'badge', label: 'Badge 标记' } ] }, { value: 'notice', label: 'Notice', children: [ { value: 'alert', label: 'Alert 警告' }, { value: 'loading', label: 'Loading 加载' }, { value: 'message', label: 'Message 消息提示' }, { value: 'message-box', label: 'MessageBox 弹框' }, { value: 'notification', label: 'Notification 通知' } ] }, { value: 'navigation', label: 'Navigation', children: [ { value: 'menu', label: 'NavMenu 导航菜单' }, { value: 'tabs', label: 'Tabs 标签页' }, { value: 'breadcrumb', label: 'Breadcrumb 面包屑' }, { value: 'dropdown', label: 'Dropdown 下拉菜单' }, { value: 'steps', label: 'Steps 步骤条' } ] }, { value: 'others', label: 'Others', children: [ { value: 'dialog', label: 'Dialog 对话框' }, { value: 'tooltip', label: 'Tooltip 文字提示' }, { value: 'popover', label: 'Popover 弹出框' }, { value: 'card', label: 'Card 卡片' }, { value: 'carousel', label: 'Carousel 走马灯' }, { value: 'collapse', label: 'Collapse 折叠面板' } ] } ] } ], props: { value: 'value', label: 'label', children: 'children' }, expandTrigger: 'hover', clearable: true, disabled: false, filterable: false, loading: false, placeholder: '请选择', popperClass: '', renderFormat: labels => labels.join(' / '), separator: ' / ', size: '', trigger: 'click', valueFormat: 'value', width: '' } }, methods: { handleChange(value) { console.log(value) } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值