├── .babelrc
├── example
├── pages
│ └── index
│ │ ├── main.json
│ │ ├── main.js
│ │ └── index.vue
├── App.vue
├── app.json
└── main.js
├── .postcssrc.js
├── .gitignore
├── index.html
├── project.config.json
├── package.json
├── src
├── registry.js
├── icons.js
└── index.vue
└── README.md
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": "env"
3 | }
4 |
--------------------------------------------------------------------------------
/example/pages/index/main.json:
--------------------------------------------------------------------------------
1 | {
2 | "navigationBarTitleText": "demo 页"
3 | }
4 |
--------------------------------------------------------------------------------
/example/App.vue:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/example/pages/index/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './index'
3 |
4 | const app = new Vue(App)
5 | app.$mount()
6 |
--------------------------------------------------------------------------------
/example/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "pages": [
3 | "pages/index/main"
4 | ],
5 | "window": {
6 | "navigationBarTitleText": "mp-toast test"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | "postcss-mpvue-wxss": {}
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Editor directories and files
9 | .idea
10 | *.suo
11 | *.ntvs*
12 | *.njsproj
13 | *.sln
14 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | mptoast
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/example/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App'
3 |
4 | import mpvueToastRegistry from '../src/registry'
5 | mpvueToastRegistry(Vue)
6 |
7 | Vue.config.productionTip = false
8 | App.mpType = 'app'
9 |
10 | const app = new Vue(App)
11 | app.$mount()
12 |
13 | export default {
14 | // 这个字段走 app.json
15 | config: {
16 | // 页面前带有 ^ 符号的,会被编译成首页,其他页面可以选填,我们会自动把 webpack entry 里面的入口页面加进去
17 | pages: ['^pages/example/main'],
18 | window: {
19 | backgroundTextStyle: 'light',
20 | navigationBarBackgroundColor: '#fff',
21 | navigationBarTitleText: 'WeChat',
22 | navigationBarTextStyle: 'black'
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/project.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "description": "项目配置文件",
3 | "packOptions": {
4 | "ignore": []
5 | },
6 | "setting": {
7 | "urlCheck": true,
8 | "es6": true,
9 | "postcss": true,
10 | "minified": true,
11 | "newFeature": true,
12 | "autoAudits": false
13 | },
14 | "compileType": "miniprogram",
15 | "libVersion": "2.0.4",
16 | "appid": "wxca65ed4ae828b9f3",
17 | "projectname": "mptoast",
18 | "debugOptions": {
19 | "hidedInDevtools": []
20 | },
21 | "isGameTourist": false,
22 | "condition": {
23 | "search": {
24 | "current": -1,
25 | "list": []
26 | },
27 | "conversation": {
28 | "current": -1,
29 | "list": []
30 | },
31 | "game": {
32 | "currentL": -1,
33 | "list": []
34 | },
35 | "miniprogram": {
36 | "current": -1,
37 | "list": []
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/example/pages/index/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
31 |
32 |
43 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mptoast",
3 | "version": "1.3.0",
4 | "description": "a toast component for mpvue",
5 | "main": "src/index.vue",
6 | "files": [
7 | "src"
8 | ],
9 | "repository": {
10 | "url": "https://github.com/noahlam/mpvue-toast.git",
11 | "type": "git"
12 | },
13 | "author": "noahlam <284516433@qq.com>",
14 | "license": "MIT",
15 | "scripts": {
16 | "dev": "node build/dev-server.js",
17 | "start": "node build/dev-server.js",
18 | "build": "node build/build.js"
19 | },
20 | "dependencies": {
21 | "mpvue": "^1.0.11",
22 | "vuex": "^3.0.1"
23 | },
24 | "devDependencies": {
25 | "babel-core": "^6.22.1",
26 | "babel-loader": "^7.1.1",
27 | "babel-preset-env": "^1.3.2",
28 | "copy-webpack-plugin": "^4.5.1",
29 | "css-loader": "^0.28.11",
30 | "express": "^4.16.3",
31 | "extract-text-webpack-plugin": "^3.0.2",
32 | "glob": "^7.1.2",
33 | "html-webpack-plugin": "^3.2.0",
34 | "http-proxy-middleware": "^0.18.0",
35 | "mpvue-loader": "^1.1.2",
36 | "mpvue-template-compiler": "^1.0.11",
37 | "mpvue-webpack-target": "^1.0.0",
38 | "ora": "^2.0.0",
39 | "postcss-mpvue-wxss": "^1.0.0",
40 | "px2rpx-loader": "^0.1.10",
41 | "relative": "^3.0.2",
42 | "url-loader": "^1.0.1",
43 | "vue-style-loader": "^4.1.0",
44 | "webpack": "^3.11.0",
45 | "webpack-dev-middleware-hard-disk": "^1.12.1",
46 | "webpack-merge": "^4.1.0",
47 | "webpack-mpvue-asset-plugin": "^0.1.1"
48 | },
49 | "engines": {
50 | "node": ">= 4.0.0",
51 | "npm": ">= 3.0.0"
52 | },
53 | "browserslist": [
54 | "> 1%",
55 | "last 2 versions",
56 | "not ie <= 8"
57 | ]
58 | }
59 |
--------------------------------------------------------------------------------
/src/registry.js:
--------------------------------------------------------------------------------
1 | // 注册
2 | import Vuex from 'vuex'
3 |
4 | export default function registry(v) {
5 | v.use(Vuex)
6 | // 挂在store到全局(this)
7 | v.prototype.$toastStore = new Vuex.Store({
8 | state: {
9 | show:false,
10 | text:'提示',
11 | duration: 1500,
12 | textClass:null,
13 | icon:null,
14 | iconClass:null,
15 | callback: null
16 | },
17 | getters:{
18 | 'GET_TOAST_SHOW': function (state) {
19 | return state.show
20 | },
21 | 'GET_TOAST_TEXT': function (state) {
22 | return state.text
23 | },
24 | 'GET_TOAST_DURATION': function (state) {
25 | return state.duration
26 | },
27 | 'GET_TOAST_TEXT_CLASS_NAME': function (state) {
28 | return state.textClass
29 | },
30 | 'GET_TOAST_ICON': function (state) {
31 | return state.icon
32 | },
33 | 'GET_TOAST_ICON_CLASS_NAME': function (state) {
34 | return state.iconClass
35 | },
36 |
37 |
38 | },
39 | mutations: {
40 | hideToast(state) {
41 | state.show = false
42 | },
43 | showToast(state, data) {
44 | if (state.show) return
45 | data.duration = data.duration || 1500
46 | let dt = {
47 | show: true,
48 | text: data.text || '提示',
49 | duration: data.duration + 700,
50 | textClass: data.textClass || '',
51 | icon:data.icon || '',
52 | iconClass:data.iconClass || '',
53 | callback: data.callback || null
54 | }
55 | state = Object.assign(state, dt)
56 | },
57 | callback(state) {
58 | let cb = state.callback
59 | cb && cb()
60 | }
61 | }
62 | })
63 | // 注册显示方法 $mptoast 到全局
64 | v.prototype.$mptoast = function (data, icon = '', duration = 1500, textClass = '',iconClass = '', callback = null) {
65 | if (typeof data === 'string' || typeof data === 'number') {
66 | let _data = {
67 | text: data,
68 | icon,
69 | duration,
70 | textClass,
71 | iconClass,
72 | callback
73 | }
74 | v.prototype.$toastStore.commit('showToast', _data)
75 | }
76 | if (typeof data === 'object') {
77 | v.prototype.$toastStore.commit('showToast', data)
78 | }
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/src/icons.js:
--------------------------------------------------------------------------------
1 | let success = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAzCAYAAAA6oTAqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAaxJREFUeNrsme1twyAQhpMq/5sRukEygkfoCO4GGaEjpBOUbuAN6m5AN/AIbEAPiUot4uMgGB/RnfRKcWRiP4GXO5/3WuvdvcTD7o6CYRiGYRiGYcjFocN7PoLO9rMCyV5hnkAT6GSPv0BDj8tssLNw6t0zI+gT9Oh8f/13ZApN4hLaH6N7LmWII2jGglCGOYNkAOQSGkcRZACpAIiIjaUGMupwiNT4HoyOAqECEzM6GoQCTMzoWSBbw8SMng2yJcxFx0OU/C41oxeDGB08xZypTBe3vK5Uus+xQhHiw9ZhZeHQLc6/JK1Jaxh9WWtGQsvMFypWQiD0nDB6FRAfzBS54GRzQk2jVwPxwQyJCyt7Tg2jVwUJ7WYj4iZeExldtgaJbc0YoNmz7DBGXwUklWcwQOrPbocx+mogmKSJBcL443c2V0vIe8TLJpPE3iskzW+blNWWHU0BeqEOktNqugWoCUhu36wEqBlISRMwB6gpSGlH0wC9UQO5taMZ2o5lQQ3XJM/kAm0GUutJU1AA8T1plnboF9uRb+sRJzAVAL/TZBiGYRiGYZjS+BFgAKT0Ks2zaV55AAAAAElFTkSuQmCC`
2 | let error = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGUAAABlCAYAAABUfC3PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAutJREFUeNrs3f1t1EAQBXDfiP9JCekAd5CjAkIHoQKgA9IBJVwJ0MHRQaiA0IFTgdmVNiIfOoLt8fq92fekUaT4Ep/v57XX8q5vN45jp2DF9BEIRRGKUBShCEURilAUoShCEYoiFKEoQhGKIhTln3m10v/dl59DqpuAn9t5qZzbUn7Jdx4d60uqYXycY6reeT1b1Vmqw/g8h7LMZT07x9vBX1N9PLHsrrQe5lZzluqY6s2J5T9T9R4r8kLJTfnXC69hhnkJ5D6fy84JcaK/+o/XvC4b1gcFyblk7H2xwUwB6by2a4suMQvMVJDO69DshXIMBjMHZM7nsOqJPudbqncT/wbx5D8X5K50eAakw9dV6RYyt5glIHsPEG+UobwxVpilIG6t3ftEzwoDA7JW74sNBgpkzS4xCwwcyNrXKegwkCA1Lh5RYWBBal3Ro8FAg9RCQYKBB6mJggBDAVIbZUsYGpAtULaAoQLZCqUmDB3Ilig1YChBtkZZE4YWBAFlDRhqEBQUTxh6ECQUD5h9BJCcHeCzWebu7XMCORYNcYD33BYTAgQVpQYM9GhN5KkQa8HAD59Fn5/iDUMxnplh0pAXDM0Ac5aZXEthqEb8a3qdUDa7dqEa7W8NgNDBWCMgVDDWEAgNjDUGQgFjDYLAw1gQkHwd8rbjnx8Dh7L0BtWx454fA4fidcdwiABjgUC6KDAWDCQEjAUEoYexoCDUMBYYhBbGgoNQwlgDIHQw1ggIFYw1BEIDY42BUMBYgyDwMNYoCDSMNQwCC2ONg0DCmEDwYDznp+Q3dkEK4rVzZZhblJZyGQRkaYv5hHT46oOALIWhfS4xy2DrOTCUKGzPu58KA/Ww6ENAkDkwBySU3OP4EBBkCswPNJT7veR9qt9Pfv+9HGvZv3FoKNtxXXayhzvcdff325WgrlMe5rzUTef0VGvA9J7nkRooClmXWBGKUBShCEURilAUoShCEYoiFKEoQhGKIhTlZP4IMADZKJrvag4ipwAAAABJRU5ErkJggg==`
3 | let info = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGUAAABlCAYAAABUfC3PAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAATRJREFUeNrs3cENgjAYgNFiGIRRHIVNXK1ugBvgBjgBcvCkCaFESNu8L+lNE8KL/CAGm3meg/LqYhdAERQoggJFUKAIiqBAERQoggJFULRaW9j2dp+V2rSsAcox9cu67XjffVlXhy9BgSIoXwMbSmbtPYMaoeQXFEGBIihFzwYox5y1QXF9Y6ZAERQoJ/eAUsfQjlAEBYqgQCmj1KH9gpJfAxRBgSIof7yih5LZ4B6h5BcUQYEiKNXMCCi/RSiCAkVQoJRVys+MJijnlLKj3eQSFCiCAqWw4sbXPaHk11jiRjf+1MYnRVCgCAoUQYGizGoL3e4ubH8+cYRyTn3Y/nzixuFLUKAIChRBERQoglJdpd4O7kLFX7O4R+/wJShQBAWKoEARFEGBIihQBAWKoGi9twADAO8AK4ejPNAtAAAAAElFTkSuQmCC`
4 | export default {
5 | success,
6 | error,
7 | info
8 | }
9 |
--------------------------------------------------------------------------------
/src/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{text}}
5 |
6 |
7 |
8 |
56 |
57 |
102 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### 介绍
2 | mptoast 是一个基于mpvue的简单弹窗组件 github地址:[https://github.com/noahlam/mpvue-toast](https://github.com/noahlam/mpvue-toast)
3 |
4 | ### 特性
5 | 0. **轻量** 目前整个项目`未打包前`大概只有`120行`代码(包括注释),5kb左右(包括图标)
6 | 1. **配置少** 尝试过无数种优化方法,只为减少配置
7 | 2. **冗余少** 每个页面(page)只需要引入一次,该页面里面如果有多个子组件,可以跟页面共用一个,无需重复引入。
8 | 3. **使用简单** 除了必须的在page页面对组件import,注册,和html引入(这些麻烦的东西由于mpvue不支持的原因,暂时无法做到优化),其他的使用只需一行简单的代码 `this.$mptoast('提示消息‘)`即可实现弹窗
9 | 4. **可定制性强** 提供用户重写样式的属性,只需传入一个定义好的`样式类名`既可实现对原有样式的覆盖(具体请看参数说明)
10 |
11 |
12 | ### 安装
13 |
14 | 1.安装`vuex`,如果你项目还没使用的话。请放心,虽然`mptoast`依赖`vuex`,你不会接触到任何有关`vuex`的代码。添加`vuex`只为让你写更少的代码。
15 |
16 | npm i vuex
17 |
18 | 2.安装`mptoast`
19 |
20 | npm i mptoast -D
21 |
22 | 或者
23 |
24 | yarn add mptoast --dev
25 |
26 | 3.在项目的主配置文件`(一般位于src/main.js)`加入以下代码
27 |
28 | import mpvueToastRegistry from 'mptoast/src/registry'
29 | mpvueToastRegistry(Vue)
30 |
31 | 4.在你需要弹窗的页面,引入组件,并注册,然后在页面内加入一个你注册的组件,就可以在js里面调用`this.$mptoast()`了, 以下是一个简单的实例
32 |
33 |
34 |
35 | <-- 省略其他代码 -->
36 |
37 |
38 |
39 |
40 |
57 |
58 | 至于为什么没办法做到像vue组件那样,引入一次,就可以在所有页面使用,我想我必须得解释以下,因为mpvue目前还不支持全局的组件,我尝试过很多种变通办法,都行不通,甚至为了让大家使用的时候,少输入几个字,少一些冗余,我都做了很多尝试和优化,目前mpvue团队已经在考虑新增全局组件功能,我会时刻关注,一旦支持,我这边也立马做支持。
59 |
60 | ### 参数说明
61 | > 参数分2种类型,一种是多个参数,另一个种则少只接收一个对象
62 |
63 | 一, 多个参数
64 |
65 | | 参数位置 | 参数类型 | 参数名称 |是否必填 | 默认值 | 其他说明 |
66 | |:-------:|:------:|:------:|:-------:|:-------:|:-----------|
67 | | 1 | string | 显示文本 | 是 | - | 如果第一个参数不是string或number类型
则会被当作对象来处理,也就是上面提到的另一种情况 |
68 | | 2 | stirng | 显示图标类型 | 否 | - | 3种可选 'success' , 'error' , 'info' |
69 | | 3 | number | 关闭时间 | 否 | 1500 | 单位是毫秒ms,传其他格式(非number类型)会报错 |
70 | | 4 | string | 文本样式类名 | 否 | - | 如果需要自定义显示的样式,请先定一个样式类
然后把类名传给该参数,定义类的时候
如果所有页面都使用这个类,必须定义为全局的
如果定义在scope作用域内的话
子组件不能复用父组件的样式。 |
71 | | 5 | string | icon样式类名 | 否 | - | 同上,需要注意的是icon是包含在文本里面的 |
72 | | 6 |function| 回掉函数 | 否 | - | toast 隐藏时的回调hanshu |
73 |
74 | 以下代码是一个多个参数调用的简单实例
75 |
76 | this.$mptoast('温馨提示', 'success', 2000)
77 |
78 | 二, 单个object对象
79 | object对象参数的功能,其实跟上面`多个参数`的对应的功能是一样的,只是写法不同而已,我们直接看代码
80 |
81 | this.$mptoast({
82 | text: '温馨提示', // 显示文本
83 | icon:'success' // 图标类型
84 | duration: 2000, // 关闭时间
85 | textClass: 'my-class' // 样式类名
86 | iconClass: 'icon-class' // 图标类名
87 | callback: () => { console.log('隐藏')}
88 | })
89 |
90 | 需要注意的是,以上参数,如果传入错误的类型,先会进行类型转换,如果转换失败的,可能会报错。
91 |
--------------------------------------------------------------------------------