VUE中toast的使用与开发

摘要:
本文介绍了吐司是什么。本文主要介绍吐司的开发和使用。Vuejs开发非常流行,路由插件vue路由器和数据管理插件vuex也已经正式提供。然而,我们只停留在使用阶段。如果我们可以尝试自己开发并通过NPM上传,那么我认为个人进步将是巨大的。主要是。js,您需要导入Speak。js,并使用全局方法VueUse()来使用插件。提示可以是字符串,即我们要提示的信息。通过这种方式,我们可以单击此按钮$toast(“新地址成功!

  在这篇文章中介绍了toast是什么,这篇文章主要介绍toast的开发与使用。

 

开发

  Vuejs很流行,并且官方也给出了路由插件vue-router、数据管理插件vuex,但是我们仅仅停留在了使用的阶段,如果能够尝试一下自己开发,并且npm上传,那么对于个人的进步我想还是很大的。 

   

什么是插件

  Vue.js的插件有一个公开方法install, 这个方法的第一个参数是Vue构造器,第二个参数是一个可选的选项对象。 如// MyPlugin就是插件的名称, 所有的插件都需要使用install这个公开方// 第一个参数是Vue构造器,因此我们可以在这个方法中使用Vue, 第二个参数是一个选项对象。

MyPlugin.install = function (Vue, options) {
  Vue.myGlobalMethod = function () {  // 1. 添加全局方法或属性,如: vue-custom-element
    // 逻辑...
  }
 // 这里通过 Vue.directive 来进行自定义指令。
 // 其中my-derective就是指令的名称。
 // bind是自定义指令提供的钩子函数。而el、binding、vnodes、oldVnode都是钩子函数绑定的参数
Vue.directive(
'my-directive', { // 2. 添加全局资源:指令/过滤器/过渡等,如 vue-touch bind (el, binding, vnode, oldVnode) { // 逻辑... } ... }) Vue.mixin({ created: function () { // 3. 通过全局 mixin方法添加一些组件选项,如: vuex // 逻辑... } ... }) Vue.prototype.$myMethod = function (options) { // 4. 添加实例方法,通过把它们添加到 Vue.prototype 上实现 // 逻辑... } }

(补充:Vue自定义指令

下面要讲的 vue-toast 插件就是通过添加实例方法来实现的, 比如下面的这个例子,首先新建一个js文件来编写插件: speak.js 

var Speak = {};
Speak.install = function (Vue, options) {
  Vue.prototype.$words = "Hello, John!"
}
module.exports = Speak;

即 Speak 就是插件的名称,我们绑定了一个$words 属性。 定义好了之后,导出。

在main.js中,需要导入 Speak.js 并且通过全局方法 Vue.use() 来使用插件。(比如我们所用的vuex和vue-router都是先在 main.js 中导入,然后必须使用 Vue.use)。 

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import router from './router'
import store from './store/'

import Speak from './assets/js/speak.js' Vue.use(Speak) Vue.config.productionTip = false /* eslint-disable no-new */ new Vue({ el: '#app', router, store, })

最后,我们就可以在组件中来获取到该插件定义的$words 属性了,

// Personal.vue
export default {
    created(){
        alert(this.$words);         // Hello John!
    }
}

然后我们我就可以发现这个组件生效了。

开发 vue-toast

实现需求

  同之前举例一样,在main.js引入之后可以在组件中通过调用 this.$toast("网络请求失败") 来弹出提示, 默认在底部显示我们还可以通过 this.$toast.top() 或者 this.$toast.center() 等方法来实现在其他位置的显示。

思路:

  其实toast还是很简单的,就是提示消息,并在一定时间内自动清除,所以,需要提示的时候,我们可以在body中添加一个div来显示提示信息, 而不同的位置通过添加不同的类名定位。 

start!

// toast.js
var Toast = {};
Toast.install = function (Vue, options) {
    Vue.prototype.$toast = (tips) => {
        let toastTpl = Vue.extend({     // 1、创建构造器,定义好提示信息的模板
            template: '<div class="vue-toast">' + tips + '</div>'
        });
        let tpl = new toastTpl().$mount().$el;  // 2、创建实例,挂载到文档以后的地方
        document.body.appendChild(tpl);     // 3、把创建的实例添加到body中
        setTimeout(function () {        // 4、延迟2.5秒后移除该提示
            document.body.removeChild(tpl);
        }, 2500)
    }
}
module.exports = Toast;

通过上面寥寥十几行代码我们就实现了this.$toast,接下来就可以显示不同的位置。

即首先定义Toast这个插件,然后在Vue上定义实例方法 toast , 这个方法中,我们首先创建一个构造器,然后通过new来实例化一个实例并挂在到$el(即Vue挂载的元素)上, 这样,一个定义好的模板就实现了,接着我们将它插入到DOM中,等到一段时间之后 (如2500ms) 就移除这个div。  而其中的tips可以是一个字符串,即我们希望提示的信息。这样我们就可以通过 this.$toast("新建地址成功!") 来使用 toast 了!  

补充知识

VUE中toast的使用与开发第1张

// toast.js
['bottom', 'center', 'top'].forEach(type => {
    Vue.prototype.$toast[type] = (tips) => {
        return Vue.prototype.$toast(tips,type)
    }
})

这里,我们将bottom、center、top所组成的数组进行遍历来设置 $toast[type]方法,这样就是我们就可以通过$toast.type来调用了, 而$toast[type]方法显然都是一个函数,他们接受一个参数tips, 最后返回一个对应的方法Vue.prototype.$toast(tips,type)。 

可以看到这时候我们就需要重新修改一个$toast方法了:

Vue.prototype.$toast = (tips,type) => {     // 添加 type 参数
    let toastTpl = Vue.extend({             // 模板添加位置类
        template: '<div class="vue-toast toast-'+ type +'">' + tips + '</div>'
    });
    ...
}

这样,如果我们不传递参数,那么type就是undefined, 只要在类名中我们不设置 undefined相关的就可以了,而如果type是bottom之类的时候,我们在css中定义相关的样式,就可以正确显示了。  

OK! 到这里,其实已经完成了大体框架的大部分了!  但是如果我希望默认在顶部显示,那么我每次都需要调用 this.$toast.top() 好像就太麻烦了, 另外,如果我们希望div停留的时间不是 2500ms 而是随着不同的需求而改变的呢?   这时候,其实我们可以利用之前所提到过的options参数来实现了!  在Vue.use()中通过 options来传进我们想要传递的参数就可以。 最终修改如下:

var Toast = {};
Toast.install = function (Vue, options) {
    let opt = {
        defaultType:'bottom',   // 默认显示位置
        duration:'2500'         // 持续时间
    }
    for(let property in options){
        opt[property] = options[property];  // 使用 options 的配置
    }
    Vue.prototype.$toast = (tips,type) => {
        if(type){
            opt.defaultType = type;         // 如果有传type,位置则设为该type
        }
        if(document.getElementsByClassName('vue-toast').length){
            // 如果toast还在,则不再执行
            return;
        }
        let toastTpl = Vue.extend({
            template: '<div class="vue-toast toast-'+opt.defaultType+'">' + tips + '</div>'
        });
        let tpl = new toastTpl().$mount().$el;
        document.body.appendChild(tpl);
        setTimeout(function () {
            document.body.removeChild(tpl);
        }, opt.duration)
    }
    ['bottom', 'center', 'top'].forEach(type => {
        Vue.prototype.$toast[type] = (tips) => {
            return Vue.prototype.$toast(tips,type)
        }
    })
}
module.exports = Toast;

这样,一个简单的vue插件就完成了, 我们可以通过 npm 打包发布, 这样下次使用时就可以通过 npm install 来安装了! 

免责声明:文章转载自《VUE中toast的使用与开发》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java String字符串补0或空格vim宏录制的操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue 权限管理怎么做

前言 在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作。作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制。 需求 因为这是一个工作上的业务需求,所以对于我来说主要有两个地方需要进行权限控制。 第一个是侧边菜单栏,需要控制显示与隐藏。 第二个就是页面内的各个按钮,弹窗等。 流程...

vue开发环境和生产环境的跨域

前端在生产环境跨域 一,开发环境跨域 1.配置代理 如果使用vue-cli搭建的项目,可以直接使用proxyTable模块,项目框架已经集成在config -> index.js 页面配置proxyTable,如下: proxyTable: { '/api':{ //开发坏境下:target 里的地址是你跨域请求的...

报错[Vue warn]:Invalid prop:custom validator check failed for prop "percentage"

1.html部分 <el-table-column prop="userzb"label="用户占比"> <template solt-scope="scope"v-if="btnType === 1"> <el-progress v-if="scope.row.us...

vue,react项目中使用webpack打包中直接打包成压缩包的方法

这里以react项目为例,(vue项目类似) 为改造的 pageage.json 中 scripts 位置的代码 "scripts": { "start": "node scripts/start.js", "build": "node --max_old_space_size=4096 scripts/build.js", "...

vue初级学习--使用 vue-resource 请求数据

一、导语   我发现好像我最近几次写文,都是在7号,很恰巧啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二、正文   最近用vue做一个订单管理混合开发APP,但是遇到个问题,使用了vueResource的post请求,后端做了跨域解决方...

用vue 写h5页面-摇一摇

  vue配合其他ui框架除了开发一个完整的web项目外,也有不少的项目做一些h5的活动页面开发。你的页面现在需要模拟微信的摇一摇动作。   项目环境: vue-cli 完成的一个项目   准备插件(包):依赖的第三方的插件(后续会完成如何写vue插件的方法)shake.js ,github地址: https://github.com/alexgibson...