在uni-app中自定义组件与插件

前言

在Vue的开发中,我们为了使代码能有更好的复用性,在开发阶段将具有相似业务的模块功能抽取成组件。而对于插件而言,则是通常用来为 Vue 添加全局功能。像我们使用的vue-router,就是一个插件。为了演示组件和插件的用法,我会在uni-app中自定义一个Toast来演示开发流程。

我们知道,在uni-app中已经封装了toast的插件:

uni.showToast({
                    title: '我是一个Toast!'
                });

将toast封装成一个组件

我们创建一个叫做LXToast的vue文件,然后设置显示的内容message,超时时间timeOut和是否展示的show。这里,我们为了实现props的“双向绑定”,我们在父组件中使用了.sync修饰符,在子组件中通过this.$emit('update:show', false)的方式来更改父组件的状态:

<template v-if="isShowing">
    <view class="toast">
        <view class="content">{{message}}</view>
    </view>
</template>

<script>
    export default {
        name: 'LXToast',
        props: {
            message: {
                type: String,
                default: ''
            },
            timeOut: {
                type: Number,
                default: 2000 
            },
            show: {
                type: Boolean,
                default: false
            }
        },
        computed: {
            isShowing() {
                return this.show
            }
        },
        created() {
            setTimeout(() => {
                this.$emit('update:show', false)
            }, this.timeOut)
        }
    }
</script>

<style lang="scss" scoped>
    .toast {
        >.content {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            padding: 10upx 12upx;
            background-color: rgba($color: #000000, $alpha: 0.7);
            border-radius: 4upx;
            color: #FFFFFF;
            font: 100upx;
        }
    }
</style>

然后我们在模块中使用这个组件。首先,我们需要先引入这个组件,然后设置相关的属性,这里我们点击hello文字,就可以弹出toast(其他的代码乃是创建项目生成的,请读者不要产生迷惑):

<template>
    <view class="content">
        <image class="logo" src="/static/logo.png"></image>
        <view class="text-area">
            <text class="title" @click="clickTitle">{{title}}</text>
        </view>
        <LXToast
         v-if='show'
        :message='77777777777'
        :show.sync='show'
        :timeOut='timeOut'></LXToast>
    </view>
</template>

<script>
    import LXToast from '../../components/common/LXToast/LXToast.vue';
    export default {
        data() {
            return {
                title: 'Hello',
                show: false,
                timeOut: 1000
            }
        },
        components: {//引入组件
            LXToast
        },
        onLoad() {

        },
        methods: {
            clickTitle() {
                this.show = true 
            }
        }
    }
</script>

<style>
    .content {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
    }

    .logo {
        height: 200rpx;
        width: 200rpx;
        margin-top: 200rpx;
        margin-left: auto;
        margin-right: auto;
        margin-bottom: 50rpx;
    }
    .text-area {
        display: flex;
        justify-content: center;
    }
    .title {
        font-size: 36rpx;
        color: #8f8f94;
    }
</style>

上面演示的就是我们定义一个组件的基本流程。为了使子组件展示我们需要的内容,我们需要在组件中通过【:属性】的方式将值传递给子组件。同时呢,我们呢还需要子组件可以更改父组件的状态(通常我们不建议这么做),使用了sync语法糖的方式。

插件


   转载规则


《在uni-app中自定义组件与插件》 刘星星 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
swift中Realm和objectbox的使用总结 swift中Realm和objectbox的使用总结
objectBoxobjectbox的优点请看官方的介绍。objectBox有各个语言版本。之前做Android项目的时候接触过objectBox的Java版本和Kotlin版本,处于“一招鲜吃遍天”的无耻想法,就一直关注着swift版
2019-11-23
下一篇 
在uni-app中使用Vuex 在uni-app中使用Vuex
引入vuexuni-app已经内置了vuex,我们可以直接引入使用。官方文档 state的使用我们按照大型项目中的实际需求,将不同模块的状态管理划分为不同的module。例如我们有2个模块home和user,将home和user模块引入
2019-10-17
  目录