欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vue自定义toast组件

程序员文章站 2024-03-04 16:58:23
...

在手机端项目开发中一些框架的toast兼容性不太好,还需要进行单独修改,并且可定制性不强,一旦遇到需要特定的toast样式还是需要重构样式,这就很尴尬了
toast组件用到了vue的render函数构建
1、在components项目文件夹下边新建一个.vue的文件,作为组件(子组件)
(1.1)在data中定义三个变量

data() {
  return {
    showToast: false, // 用来控制toast是否显示
    toastContent: '', // toast中显示的内容
    num: 0 // 这个是用来计数,防止用户连续点击出现setTimeout重复调用导致用户体验差
  }
}

(1.2)在props中定义一个父组件传来的top,用来自定义toast距离顶部的位置,后边的单位是百分比

props: {
  top: {
    type: [String, Number],
    required: true,
    default: 50
  },
},

(1.3)在methods中定义一个函数toastShow

// 轻提示函数,value传入提示文字,time显示时间
toastShow(value, time) {
  this.num = this.num + 1 // 计次的num+1防止连点
  if(this.num < 2) {
    this.showToast = true // toast显示
    this.toastContent = value  // toast中内容进行赋值
    setTimeout(() => {
      this.showToast = false
      this.num = 0
    }, time)
  }
}

(1.4)下面创建一个render函数,构建toast样式

render: function(createElement) {
  return createElement(
    'div', {
        'class': {
        'my-toast': this.showToast
      },
      'attrs': {
        style: `top: ${this.top}%` // 这里是获取父组件传过来的top值默认定义的是50在中间,
      },
      domProps: {
        innerHTML: this.toastContent // 这一步的作用是解析传过来的toast内容中的字符串中的HTML标签主要是解析换行标签
      },
    },
  )
}

(1.5)最后定义一下toast的样式,可以根据自己的需求情况自定义

.my-toast {
  white-space: nowrap;
  position: fixed;
  top: 50%;
  left: 50%;
  display: flex;
  color: #fff;
  font-size: 14px;
  line-height: 20px;
  border-radius: 4px;
  align-items: center;
  flex-direction: column;
  box-sizing: border-box;
  -webkit-transform: translate3d(-50%, -50%, 0);
  background-color: rgba(0, 0, 0, .7);
  padding: 0.1rem 0.2rem;
  z-index: 999;
  text-align: center;
}

2、在父组件中引入
(2.1)引入组件toast

import toast from '**************************'

(2.2)注册组件toast

components: {
  toast,
},

(2.3)在页面中引入toast组件

<toast class="toast-father" ref="childToast" :top="toast_top"></toast>
<!--toast-father的样式可以定义为fixed的定位出视图-->
<!--ref是用来父组件获取子组件的方法-->
<!--这里在父组件的data中需要定义一个toast_top用来控制toast的位置-->

(2.4.1)最后在需要的地方调用toast

this.$refs.childToast.toastShow(`************`, 2000)
// 第一个参数是toast中展示的内容,第二个是定义toast显示的时间

(2.4.2)最后在需要的地方调用toast(子组件toast内容可以解析HTML标签)

this.$refs.childToast.toastShow(`******<br/>******`, 2000)
//<br/>标签可以被解析进行换行