vue+iview 自定义侧边栏(Sider)触发器(trigger)

#1),记录原因描述:

想要修改Sider的样式(背景颜色),通过给Sider设置了新的class后,背景颜色虽然修改了,但是低端的触发器样式仍然是Menu组件的”Dark“主题样式。

查看官方文档知道,Sider 可以设置 hide-trigger属性来隐藏默认触发器。

#2),模板:

模板大致是iView官方文档中的“Layout布局”中的其中一个。截图如下,代码见官网:

#3),修改的部分:

<style scoped>    
    .bg {
        background : #dcdee2 
    }
</style>
<template>
    <Sider ref="side_r" collapsible :collapsed-width="80" v-model="isCollapsed" class="bg" hide-trigger>
        <Row type="flex" justify="center" align="middle" class="code-row-bg">
            <p style="height: 75px"></p>
                <Col span="4">             
                    <Icon @click.native="collapsedSider" :class="rotateIcon"  type="ios-arrow-dropleft-circle" size="24" ></Icon>     
                </Col>
        </Row>                   
    </Sider>  
</template>
<script>
    export default {
        data () {
        },
        computed: {
            rotateIcon () {
                return [
                    'menu-item',
                    this.isCollapsed ? 'rotate-icon' : ''
                ];
            },          
        },
        methods: {
        }        
    }
</script>

 修改的部分主要是添加一个Icon来作为触发器,定义class=”rotateIcon“来触发点击时侧边栏的开启和关闭。

效果大致如图:

#4),完整代码:

<style scoped>
    .layout-con{
        height: 100%;
        width: 100%;
    }
    .layout-header-bar{
        background: #2b85e4;
        box-shadow : 0 2px 3px 2px rgba(0,0,0,0.2);
    }
    .menu-item span{
        display: inline-block;
        overflow: hidden;
        width: 69px;
        text-overflow: ellipsis;
        white-space: nowrap;
        vertical-align: bottom;
        transition: width .2s ease .2s;       
    }
    .menu-item i{
        transform: translateX(0px);
        transition: font-size .2s ease, transform .2s ease;
        vertical-align: middle;
        font-size: 16px;
    }
    .rotate-icon{        
        transform:translate(-10px,0px) rotate(-180deg);
    }
    .collapsed-menu span{
        width: 0px;
        transition: width .2s ease;
    }
    .collapsed-menu i{
        transform: translateX(0px);
        transition: font-size 0.2s ease 0.2s, transform .2s ease .2s;
        vertical-align: middle;
        font-size: 22px;
    }
    .bg {
        background : #dcdee2 
    }
</style>
<template>
    <div class="layout">
        <Layout :style="{minHeight: '100vh'}"  >
            <Sider ref="side_r" collapsible :collapsed-width="80" v-model="isCollapsed" class="bg" hide-trigger>               
                <Menu  width="auto" :class="menuitemClasses" accordion theme="light">
                    <Submenu name="1" >
                        <template slot="title">
                            <Icon type="ios-paper" />
                            <span>内容管理</span>
                        </template>
                        <MenuItem name="1-1" >
                            <span>文章管理</span>
                            <Icon type="ios-arrow-forward" />    
                        </MenuItem>
                        <MenuItem name="1-2">
                            <span>评论管理</span>
                            <Icon type="ios-arrow-forward" />                           
                        </MenuItem>
                        <MenuItem name="1-3">
                            <span>举报管理</span>
                            <Icon type="ios-arrow-forward" />              
                        </MenuItem>
                    </Submenu>
                    <Submenu name="2">
                        <template slot="title">
                            <Icon type="ios-people" />
                            用户管理
                        </template>
                        <MenuItem name="2-1">新增用户</MenuItem>
                        <MenuItem name="2-2">活跃用户</MenuItem>
                    </Submenu>
                    <Submenu name="3">
                        <template slot="title">
                            <Icon type="ios-stats" />
                            统计分析
                        </template>
                        <MenuGroup title="使用">
                            <MenuItem name="3-1">新增和启动</MenuItem>
                            <MenuItem name="3-2">活跃分析</MenuItem>
                            <MenuItem name="3-3">时段分析</MenuItem>
                        </MenuGroup>
                        <MenuGroup title="留存">
                            <MenuItem name="3-4">用户留存</MenuItem>
                            <MenuItem name="3-5">流失用户</MenuItem>
                        </MenuGroup>
                    </Submenu> 
                </Menu>  
                <Row type="flex" justify="center" align="middle" class="code-row-bg">
                    <p style="height: 75px"></p>
                    <Col span="4">             
                        <Icon @click.native="collapsedSider" :class="rotateIcon"  type="ios-arrow-dropleft-circle" size="24" ></Icon>     
                    </Col>
                </Row>                   
            </Sider>      
            <Layout>
                <Header :style="{padding: 0}" class="layout-header-bar"></Header>

                <Content :style="{padding: '0 16px 16px'}">
                    <div>                       
                    </div>
                </Content>
            </Layout>           
        </Layout>
    </div>
</template>
<script>
    export default {
        data () {
            return {
                isCollapsed: false
            };
        },
        computed: {
            rotateIcon () {
                return [
                    'menu-item',
                    this.isCollapsed ? 'rotate-icon' : ''
                ];
            },
            menuitemClasses: function () {
                return [
                    'menu-item',
                    this.isCollapsed ? 'collapsed-menu' : '',
                ]
            }           
        },
        methods: {
            collapsedSider () {
                this.$refs.side_r.toggleCollapse();
            }
        }        
    }
</script>

#5),说明:

(1)完整代码里面用的其实是一个前辈的模板,但是我有点忘记是从哪里拷贝过来的了。。但是还是表示感谢。。

(2)看了一些官方文档和一些博主的东西才写出来的,借鉴了很多在这里一并感谢。主要是也没有记录就不写参考了。。

(3)新手刚开始学【vue+iview】,所以内容比较简单,主要是督促自己做一点记录。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
1. 首先,在项目中引入iviewvue-resource: ``` import Vue from 'vue' import iView from 'iview' import 'iview/dist/styles/iview.css' import VueResource from 'vue-resource' Vue.use(iView) Vue.use(VueResource) ``` 2. 在vue文件中使用iview的Select组件实现省市选择: ``` <template> <div> <Select v-model="province" @on-change="getCityList"> <Option v-for="(item, index) in provinceList" :value="item.id" :key="index">{{ item.name }}</Option> </Select> <Select v-model="city"> <Option v-for="(item, index) in cityList" :value="item.id" :key="index">{{ item.name }}</Option> </Select> </div> </template> <script> export default { data () { return { province: '', city: '', provinceList: [], cityList: [] } }, mounted () { this.getProvinceList() }, methods: { // 获取省份列表 getProvinceList () { this.$http.get('/api/province').then(res => { this.provinceList = res.data }) }, // 获取城市列表 getCityList () { this.$http.get('/api/city', { params: { province: this.province } }).then(res => { this.cityList = res.data }) } } } </script> ``` 3. 在后台实现省市数据接口: 省份接口: ``` app.get('/api/province', function(req, res) { res.json([ {id: 1, name: '北京'}, {id: 2, name: '上海'}, {id: 3, name: '广东省'}, {id: 4, name: '湖南省'} ]) }) ``` 城市接口: ``` app.get('/api/city', function(req, res) { var provinceId = req.query.province var cityList = [] switch(provinceId) { case '1': cityList = [ {id: 101, name: '北京市'}, {id: 102, name: '海淀区'}, {id: 103, name: '朝阳区'}, {id: 104, name: '东城区'}, {id: 105, name: '西城区'} ] break case '2': cityList = [ {id: 201, name: '上海市'}, {id: 202, name: '浦东新区'}, {id: 203, name: '徐汇区'}, {id: 204, name: '黄浦区'}, {id: 205, name: '静安区'} ] break case '3': cityList = [ {id: 301, name: '广州市'}, {id: 302, name: '深圳市'}, {id: 303, name: '珠海市'}, {id: 304, name: '佛山市'}, {id: 305, name: '东莞市'} ] break case '4': cityList = [ {id: 401, name: '长沙市'}, {id: 402, name: '株洲市'}, {id: 403, name: '湘潭市'}, {id: 404, name: '衡阳市'}, {id: 405, name: '邵阳市'} ] break default: break } res.json(cityList) }) ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值