当前位置: 首页 > news >正文

【Vue 开发实战】实战篇 # 30:实现一个可动态改变的页面布局

说明

【Vue 开发实战】学习笔记。

基本布局

完成下面的一个布局,效果如下

在这里插入图片描述

BasicLayout.vue

<template>
    <div :class="[`nav-theme-${navTheme}`, `nav-layout-${navLayout}`]">
        <a-layout id="components-layout-demo-side" style="min-height: 100vh">
            <a-layout-sider
                v-if="navLayout === 'left'"
                v-model="collapsed"
                :theme="navTheme"
                collapsible
                :trigger="null"
            >
                <div class="logo">Ant Design Vue Pro</div>
                <SiderMenu />
            </a-layout-sider>
            <a-layout>
                <a-layout-header style="background: #fff; padding: 0">
                    <a-icon
                        class="trigger"
                        :type="collapsed ? 'menu-unfold' : 'menu-fold'"
                        @click="collapsed = !collapsed"
                    ></a-icon>
                    <Header />
                </a-layout-header>
                <a-layout-content style="margin: 0 16px">
                    <router-view></router-view>
                </a-layout-content>
                <a-layout-footer style="text-align: center">
                    <Footer />
                </a-layout-footer>
            </a-layout>
        </a-layout>
        <SettingDrawer />
    </div>
</template>

<script>
import Header from "./Header";
import SiderMenu from "./SiderMenu";
import Footer from "./Footer";
import SettingDrawer from "../components/SettingDrawer";
export default {
    data() {
        return {
            collapsed: false,
        };
    },
    components: {
        Header,
        SiderMenu,
        Footer,
        SettingDrawer,
    },
    computed: {
        navTheme() {
            return this.$route.query.navTheme || "dark";
        },
        navLayout() {
            return this.$route.query.navLayout || "left";
        },
    },
};
</script>

<style lang="less" scoped>
.trigger {
    padding: 0 20px;
    line-height: 64px;
    font-size: 20px;
    &:hover {
        background-color: #eeeeee;
    }
}
.logo {
    height: 64px;
    line-height: 64px;
    text-align: center;
    overflow: hidden;
}
.nav-theme-dark {
    .logo {
        color: #fff;
    }
}
</style>

SettingDrawer 抽屉配置

<template>
    <div>
        <a-drawer
            width="300px"
            placement="right"
            :closable="false"
            :visible="visible"
            @close="onClose"
        >
            <template v-slot:handle>
                <div class="handle" @click="visible = !visible">
                    <a-icon :type="visible ? 'close' : 'setting'"></a-icon>
                </div>
            </template>
            <div>
                <h2>整体风格定制</h2>
                <a-radio-group
                    :value="$route.query.navTheme || 'dark'"
                    @change="(e) => handleSettingChange('navTheme', e.target.value)"
                >
                    <a-radio value="dark">黑色</a-radio>
                    <a-radio value="light">明亮</a-radio>
                </a-radio-group>
                <h2>导航模式</h2>
                <a-radio-group
                    :value="$route.query.navLayout || 'left'"
                    @change="(e) => handleSettingChange('navLayout', e.target.value)"
                >
                    <a-radio value="left">左侧</a-radio>
                    <a-radio value="top">顶部</a-radio>
                </a-radio-group>
            </div>
        </a-drawer>
    </div>
</template>
<script>
export default {
    data() {
        return {
            visible: false,
            navTheme: "dark",
            navLayout: "left"
        };
    },
    methods: {
        onClose() {
            this.visible = false;
        },
        handleSettingChange(type, value) {
            this.$router.push({
                query: {
                    ...this.$route.query,
                    [type]: value
                }
            });
        }
    },
};
</script>

<style scoped>
.handle {
    position: absolute;
    top: 240px;
    right: 300px;
    width: 48px;
    height: 48px;
    background-color: #1890ff;
    color: #fff;
    font-size: 20px;
    text-align: center;
    line-height: 48px;
    border-radius: 3px 0 0 3px;
}
</style>

Ant Design Vue helper

ant-design-vue-helper 是 Ant Design Vue 的 VS Code 扩展。可以自己安装 vscode 的扩展。

https://marketplace.visualstudio.com/items?itemName=ant-design-vue.vscode-ant-design-vue-helper

https://user-images.githubusercontent.com/4122593/50880828-ac10d400-141a-11e9-8a43-5b724d3a24e6.gif

相关文章:

  • [单片机框架][drivers层][cw2015/ADC] fuelgauge 硬件电量计和软件电量计(一)
  • 【iVX 开发 - 入门】开发环境、应用对象树介绍(含操作演示)
  • CTFshow 代码审计
  • 19-Django REST framework-DRF工程搭建
  • CSP-S信息学奥赛考试大纲(提高级)
  • 电源硬件设计----降压-升压(Buck-Boost)变换器基础
  • C语言循环的嵌套、比较、break语句,continue语句
  • 【数据挖掘算法与应用】——数据挖掘导论
  • Java语言高级特性——泛型
  • 混合模拟退火和教与学的鸽群优化算法-附代码
  • Java Agent通灵之术
  • c语言进阶 结构体的声明
  • 深度学习Mask R-CNN等实例分割网络
  • [计算机通信网络]网桥与其作用机理举例详解
  • 缓存相关知识点
  • 「译」Node.js Streams 基础
  • Debian下无root权限使用Python访问Oracle
  • HTTP那些事
  • Java深入 - 深入理解Java集合
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux各目录及每个目录的详细介绍
  • Map集合、散列表、红黑树介绍
  • Python连接Oracle
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 订阅Forge Viewer所有的事件
  • 对JS继承的一点思考
  • 警报:线上事故之CountDownLatch的威力
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 一个项目push到多个远程Git仓库
  • 应用生命周期终极 DevOps 工具包
  • 正则学习笔记
  • Nginx实现动静分离
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • #{} 和 ${}区别
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (Python第六天)文件处理
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (三)模仿学习-Action数据的模仿
  • (三十五)大数据实战——Superset可视化平台搭建
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十一)图像的罗伯特梯度锐化
  • (一)Neo4j下载安装以及初次使用
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)JAVA中的堆栈
  • (转)视频码率,帧率和分辨率的联系与区别
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Core引入性能分析引导优化
  • .NET 设计一套高性能的弱事件机制
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET开源项目介绍及资源推荐:数据持久层
  • .NET实现之(自动更新)
  • .py文件应该怎样打开?
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48