vue编写panel组件,带tools如何拆分

发布于 2022-09-04 06:38:37 字数 3570 浏览 13 评论 0

我使用vue.js模仿easyui的panel面板(tools是,最大化,最小化,关闭,折叠)
这是效果图:
图片描述

现在有个问题,就是点击"折叠按钮",需要修改props里面collapsed为true,但是vue2里面不能直接修改props。现在有什么解决办法?是把tools拆分成子组件吗?

组件使用代码:

            <cy-panel :closed.sync="panel2.closed" title="这里是标题" icon="chat" :collapsible="true" :minimizable="true" :maximizable="true" :closable="true" style="height:200px;">
                <div slot="body">标题带图标</div>
            </cy-panel>

组件代码

<template>
<div class="cywebos-panel" v-show="!closed">
    <div class="cywebos-panel-header" v-if="title">
        <div class="cywebos-panel-icon" v-if="icon">
            <icon v-if="icon" :type="icon"></icon>
        </div>        
        <div :class="['cywebos-panel-title', icon ? 'panel-with-icon' : '']">
            {{title}}
        </div>
        <div class="cywebos-panel-tool">
            <slot name="tools"></slot>
            <i :class="['cywebos-panel-tool-collapse', collapsed ? 'cywebos-panel-tool-expand' : '']" @click="handleCollapseClick" v-if="collapsible"></i>
            <i class="cywebos-panel-tool-min" v-if="minimizable"></i>
            <i class="cywebos-panel-tool-max" v-if="maximizable"></i>
            <i class="cywebos-panel-tool-close" v-if="closable"></i>
        </div>
    </div>
    <div :class="['cywebos-panel-body', !title ? 'cywebos-panel-body-noheader' : '']">
        <slot name="body"></slot>
    </div>
    <div class="cywebos-panel-footer" v-if="$slots.footer">
        1212
    </div>
</div>
</template>

<script>
import Icon from '../icon';
import velocity from 'velocity-animate';

export default {
    components: {
        Icon
    },
    props: {
        width: {
            type: String,
            default: 'auto'
        },
        height: {
            type: String,
            default: 'auto'
        },
        title: {
            type: String,
            default: ''
        },
        icon: {
            type: String,
            default: ''
        },
        collapsible: {
            type: Boolean,
            default: false
        },
        minimizable: {
            type: Boolean,
            default: false
        },
        maximizable: {
            type: Boolean,
            default: false
        },
        closable: {
            type: Boolean,
            default: false
        },
        closed: {
            type: Boolean,
            default: false
        },
        collapsed: {
            type: Boolean,
            default: false
        },
        minimized: {
            type: Boolean,
            default: false
        },
        maximized: {
            type: Boolean,
            default: false
        }
    },
    methods:{
        resize(){

        },
        handleCollapseClick() {
            this.collapsed = true;
        },
        collapse() {
            let body = this.$el.querySelector('.cywebos-panel-body');
            velocity(body, 'slideUp', {
                duration: 240,
                easing: 'easeInOutQuad'
            });
        },
        expand() {

        }
    },
    watch: {
        collapsed(val){
            val ? this.collapse() : this.expand();
        }
    },
    mounted() {

    }
}
</script>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文