问答

基于Vue封装API形式的组件

作者:admin 2021-06-08 我要评论

需求:封装一个弹窗组件。 遇到的问题: 传统的封装方式使用时需要在每个使用的页面,引入组件,注册组件,绑定参数 这种方式使用起来相当繁琐,因为每次使用都...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

需求:封装一个弹窗组件。

遇到的问题:

  1. 传统的封装方式使用时需要在每个使用的页面,引入组件,注册组件,绑定参数

这种方式使用起来相当繁琐,因为每次使用都需要重复步骤,因此有了下面这样的想法,将方法挂载到vue原型,需要使用的时候。调API就行了,但是遇到了一些问题,上代码

问题描述

封装一个弹窗组件。

问题出现的环境背景及自己尝试过哪些方法

传统的封装方式使用时需要在每个使用的页面,引入组件,注册组件,绑定参数

相关代码

import vue from 'vue'

// 导入组件
import Toast from './toast.vue'

// 生成一个扩展实例构造器
const ToastConstructor  = vue.extend(Toast)

//定义一个变量用于保存vue实例
let  _Toast = {}

//定义弹窗的函数 接收两个参数  title  message
const showToast =  (option)=>{
    //实例化构造器
    _Toast = new ToastConstructor({
       data(){
           return{
               showToast:true,
               title:option.title,
               message:option.message
           }
       } 
    }) 

// 生成模板
 const element = _Toast.$mount().$el
 console.log(_Toast.showToast)

// 如何防止重复添加节点?
 document.body.appendChild(element)
}
}


//定义隐藏弹窗的函数
const hideToast =  () => {
    _Toast.showToast = false
}


showToast.install = Vue =>{
    Vue.prototype.$toast = showToast
}

hideToast.install = Vue=>{
    Vue.prototype.$hideToast = hideToast
}

//导出
export {showToast,hideToast} 

你期待的结果是什么?实际看到的错误信息又是什么?

理想状态是能够像element message 弹窗那样通过API调用

实际的问题:
image

项目结构及代码截图
image

坐等大佬教学一波封装方式,或者给出一些资料(百度的已经找了)

###

给你写个示例作为参考思路

// toast.js
export const Toast = {
  name: 'toast',
  props: {
    title: {
      type: String,
      required: true
    }
  },
  render (h) {
    return h('div', {
      style: {
        backgroundColor: 'rgba(0,0,0,0.3)',
        color: '#fff',
        width: 'fit-content',
        padding: '.5rem',
        borderRadius: '6px',
        marginBottom: '1rem'
      }
    }, this.title)
  }
}

export default {
  install (vue, config) {
    const ToastComponent = vue.extend(Toast)
    vue.prototype.$toast = function (title) {
      const instance = new ToastComponent({ propsData: { title } })
      const anchor = document.createElement('div')
      window.document.body.appendChild(anchor)
      instance.$mount(anchor)
      setTimeout(() => {
        window.document.body.removeChild(instance.$el)
        instance.$destroy()
      }, 1500)
    }
  }
}

使用

// main.js
import Toast from './toast'
Vue.use(Toast)
// 代码中
this.$toast('hay man!')
###

之前参考过这一篇文章:
https://zhuanlan.zhihu.com/p/...
写过 loading 组件

防止重复添加的实现大概就是用一个 ref 和一个全局boolean called 来做的

###

正好之前自己封装过toast弹窗,简直手摸手文章。

Vue 封装Toast消息提示
https://segmentfault.com/a/11...

都配有GitHub地址

###

自己封装的,https://github.com/ZFCFBGC/vue2.96_demol
仅供参考

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • PHP-fpm怎么实现进程间同步与互斥的?

    PHP-fpm怎么实现进程间同步与互斥的?

  • ts类型问题

    ts类型问题

  • js不带引号的对象格式字符串怎么转为对

    js不带引号的对象格式字符串怎么转为对

  • Number.prototype.toFixed() 四舍五入

    Number.prototype.toFixed() 四舍五入

腾讯云代理商
海外云服务器