vant2中actionSheet的组件封装,使其支持函数调用

用过vant的家人们肯定都知道其中的Dialog组件是支持函数调用和组件调用的,组件调用就不阐述了,其中函数调用的使用方式如下:

js 复制代码
Dialog.alert({ 
    title: '标题', 
    message: '弹窗内容', 
}) 
.then(() => { 
    // on close 
});

产生的效果图:

感觉Dialog的函数调用特别方便啊,而vant中有个跟Dialog很像(自认为)的组件,那就是ActionSheet 动作面板这个组件。

为什么说像呢,因为他们其实都是触发了点击事件以后出来一个弹框,然后弹框上会有对应的事件,对此,提出:为什么ActionSheet这个组件为什么没有函数调用的方法呢?(其实是我导师提的,我发散性思维不好)于是就有了这篇文章!


先捋捋思路,想要封装成函数调用,也就是在业务代码中我们可以直接使用函数就可以渲染相关的页面,那怎么做到不在template中写对应的组件但却可以进行渲染呢?说明是需要使用到动态渲染操作的,也就是在触发某一事件的时候才会渲染相关的组件,那么我们得先把对应的组件写好先。

新建一个showActionSheet文件夹,再新建一个actionSheet.vue文件:

js 复制代码
<template>
    <van-action-sheet
        v-model="visible"
        :actions="actionsList"
        @select="selectAction"
        @closed="close"
        get-container="body"
    ></van-action-sheet>
</template>

<script>
export default {
    name: "actionSheet",
    props: {
        visible: {
            type: Boolean,
            default: false
        },
        actionsList: {
            type: Array,
            default: () => []
        },
        selectAction: Function
    },
    methods: {
        close() {
            console.log("close");
            this.visible = false;
            this.$emit("close");
        }
    }
};
</script>

然后再在该文件夹下新增一个showActionSheet.js文件,在这个文件里定义函数并抛出:

js 复制代码
import Vue from "vue";
import actionSheet from "./actionSheet.vue";

// 定义showActionSheet函数,接收对象参数
function showActionSheet({actionsList, selectAction }) {
    // 使用Vue.extend方法将actionSheet组件扩展为一个新的构造器,该构造器可以用来创建新的实例
    const actionSheetConstructor = Vue.extend(actionSheet);
    // 设置visible控制组件是否可见,初始值为true
    let visible = true;
    
    // 创建新的vue实例,并将对应的参数传递给这个实例
    const instance = new actionSheetConstructor({
        propsData: { visible, actionsList, selectAction }
    });
    // 挂在组件:使用$mount方法将该实例挂载到一个虚拟DOM节点上,若未指定挂载点,则会默认挂载到内存的虚拟DOM节点
    instance.$mount();
    // 将组件的根元素添加到页面的body中,使其在页面上可见
    document.body.appendChild(instance.$el);

    // 监听close事件
    instance.$on("close", () => {
        // 若close事件触发,则执行移除组件根DOM元素操作
        document.body.removeChild(instance.$el);
        // 销毁vue实例,释放资源
        instance.$destroy();
    });
    // 返回vue实例,使得调用者可通过这一步获取这个vue实例
    return instance;
}

export default showActionSheet;

在想要调用的代码中直接可以通过如下代码进行函数调用:

js 复制代码
methods: {
    test() {
        const actionsList = [{ name: "选项一" }, { name: "选项二" }, { name: "选项三" }]
        showActionSheet({
            actionsList: actionsList,
            selectAction: (selectObj) => {
                console.log("我选择了", selectObj)
            }
        })
    },
}

由此,成功实现,效果图:

相关推荐
前端小菜袅7 分钟前
uniapp配置自动导入uni生命周期等方法
前端·javascript·uni-app
Apifox9 分钟前
如何在 Apifox 中通过 AI 一键生成几十个测试用例?
前端·后端·ai编程
你真的可爱呀9 分钟前
uniapp学习【整体实践】
前端·学习·uni-app·实践
一枚前端小能手16 分钟前
「周更第7期」实用JS库推荐:Vite
前端·javascript·vite
小中123433 分钟前
异步请求的性能提升
前端
我是天龙_绍35 分钟前
渐变层生成器——直接用鼠标拖拽就可以调整渐变层的各种参数,然后可以导出为svg格式
前端
我是天龙_绍1 小时前
Easing 曲线 easings.net
前端
知识分享小能手1 小时前
微信小程序入门学习教程,从入门到精通,电影之家小程序项目知识点详解 (17)
前端·javascript·学习·微信小程序·小程序·前端框架·vue
訾博ZiBo1 小时前
React组件复用导致的闪烁问题及通用解决方案
前端
Dever1 小时前
记一次 CORS 深水坑:开启 withCredentials 后Response headers 只剩 content-type
前端·javascript