Vue — Alert开始封装
最后更新于:2022-04-02 08:09:31
>[success] # 开始封装
>[danger] ##### 封装主体部分
~~~
1.现在知道'.vue' 文件最后还是会解析成类似js 文件这样,我们前期创建这个'$Alert' 组件过程还是和以前
一样就行
2.使用的时候:
this.$Alert({
content: '这是一条提示信息',
duration: 3
})
2.1.虽然现在我们不清楚这种调用的形式是怎么实现的,但是可以注意到需要传入是一个对象,这个对象
有负责输出内容的'content',有可以设置延迟的'duration'
3.下面代码中的add 主要负责就是将传进来的这个对象进行重新,对 属性中多的'content' 和'duration' 进行分配
首先定义了一个全局的'getUuid' 的方法,因为在使用的时候会出现连续调用的情况,我们做一个标记,这样
我们就清楚合适应该对那个弹窗进行销毁,和应该展示那个弹窗的先后顺序
4.当然iview 作者 也对这个add 方法做了更多的解释:
由这个思路,Alert 组件就可以无限扩展,只要在 add 方法中传递更多的参数,就能支持更复杂的组件,
比如是否显示手动关闭按钮、确定 / 取消按钮,甚至传入一个 Render 函数都可以。
~~~
~~~
~~~
>[danger] ##### 将组件主体变成一个未挂载组件
~~~
1.我们在Alert 组件文件夹下创建一个这个文件叫'notification.js'
2.我们再将组件封装的两个方法暴露出去,也就是'add' 方法和'remove' 方法
~~~
~~~
// notification.js
import Alert from './alert.vue';
import Vue from 'vue';
Alert.newInstance = properties => {
const props = properties || {};
const Instance = new Vue({
data: props,
render (h) {
return h(Alert, {
props: props
});
}
});
const component = Instance.$mount();
document.body.appendChild(component.$el);
const alert = Instance.$children[0];
return {
add (noticeProps) {
alert.add(noticeProps);
},
remove (name) {
alert.remove(name);
}
}
};
~~~
>[danger] ##### 提供一个调用者
~~~
1.在创建一个alert.js 文件这样可以供全局调用
2.'getMessageInstance' 函数用来获取实例,它不会重复创建,如果 'messageInstance' 已经存在,
就直接返回了,只在第一次调用 'Notification' 的 'newInstance' 时来创建实例
2.要考虑销毁组件
~~~
~~~
// alert.js
import Notification from './notification.js';
let messageInstance;
function getMessageInstance () {
messageInstance = messageInstance || Notification.newInstance();
return messageInstance;
}
function notice({ duration = 1.5, content = '' }) {
let instance = getMessageInstance();
instance.add({
content: content,
duration: duration
});
}
export default {
info (options) {
return notice(options);
}
}
~~~
>[danger] ##### 注册这个组件
~~~
// src/main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import Alert from '../src/components/alert/alert.js'
Vue.config.productionTip = false
Vue.prototype.$Alert = Alert
new Vue({
router,
render: h => h(App)
}).$mount('#app')
~~~
>[danger] ##### 使用它
~~~
~~~
';
{{ item.content }}