zoukankan      html  css  js  c++  java
  • 【Vue入门】利用VueCli搭建基本框架--在Home页实现展开收缩导航栏功能(七)

    上节整理了一下vue中引入组件的两种方式

    这节讲下vue中父子控件的传值问题

    要实现的功能就是,点击红框的小图标时,左侧导航栏收缩,同时小图标箭头朝右。当点击箭头朝右的图标时,导航栏能展开同时小图标再次改为朝左的图标

      

     再看下我们home页面的代码,里面采用了上左右结构布局。顶部是一个组件,左侧也是一个组件。

    也就是说我们在动的时候,操作的是头部组件里的东西,而联动效果是影响左侧导航栏

    ps:  el-aside  后面加 style="transition:0.5s;"  可以使页面缓慢移动

    <template>
      <el-container>
        <el-header>
          <headerMenu />
        </el-header>
        <el-container>
          <el-aside :width="isCollapse ? '50px':'200px'">
            <myMenu />
          </el-aside>
          <el-main>
            <router-view></router-view>
          </el-main>
        </el-container>
      </el-container>
    </template>

    1、在Home页面设置监听方法,接收子控件的传值

    根据vue中子控件传值给父级的方式我们在<headerMenu />绑定我们父级的监听事件。isCollapse 是定义的一个布尔值。用来传递给导航子组件,控制导航栏收缩或展开

    handleHeaderChange里面的参数data就是由子组件通过$emit('方法名',值)的调用返回回来的
    <!--模板代码中添加v-on代码-->
    <headerMenu v-on:my-header-handle="handleHeaderChange" />
    
    methods:{
        //监听HeaderMenu控件中的值变化,设置父控件中isCollapse的值
        handleHeaderChange(data){
          console.log('传会给父控件的data值是:',data)
          this.isCollapse = data
          console.log('isCollapse的值是:',this.isCollapse)
        }
     }

    2、在headerMenu组件中调用父级方法传值出去

    这里面还涉及到  :class动态绑定数组变量,通过给变量重新赋值达到改变icon的目的。关键代码如下:

     //设置收缩或展开图标的样式
                handleChangeI(){
                    if(this.iconArr.includes('el-icon-d-arrow-left')){
                        this.iconArr.pop();
                        this.iconArr.push("el-icon-d-arrow-right")
                        //给父控件传递回去
                        this.$emit('my-header-handle',true)
                    }else{
                        this.iconArr.pop();
                        this.iconArr.push("el-icon-d-arrow-left")
                        //给父控件传递回去
                        this.$emit('my-header-handle',false)
                    }
                }

    headerMenu完整代码如下:

    <template>
        <div class="main">
            <div class="managerTitle">
                <label>XX后台管理系统</label>
                <i :class="iconArr" @click="handleChangeI"></i>
            </div>
            <div class="header">欢迎:{{userName}}
                <el-dropdown>
                <span class="el-dropdown-link">
                    更多<i class="el-icon-arrow-down el-icon--right"></i>
                </span>
                <el-dropdown-menu slot="dropdown">
                    <el-dropdown-item @click="handlePerson">个人设置</el-dropdown-item>
                    <el-dropdown-item @click="handleLoginOut">退出</el-dropdown-item>
                </el-dropdown-menu>
                </el-dropdown>
            </div>
        </div>
        
    </template>
    
    <script>
        export default {
            data(){
                return{
                    userName:'admin',
                    iconArr:["el-icon-d-arrow-left"]
                }
            },
            methods:{
                //进入个人设置页面
                handlePerson(){
                    console.log('用户点击了个人设置')
                },
                //用户退出
                handleLoginOut(){
                    console.log('用户点击了退出设置')
                },
                //设置收缩或展开图标的样式
                handleChangeI(){
                    if(this.iconArr.includes('el-icon-d-arrow-left')){
                        this.iconArr.pop();
                        this.iconArr.push("el-icon-d-arrow-right")
                        //给父控件传递回去
                        this.$emit('my-header-handle',true)
                    }else{
                        this.iconArr.pop();
                        this.iconArr.push("el-icon-d-arrow-left")
                        //给父控件传递回去
                        this.$emit('my-header-handle',false)
                    }
                }
    
            }
        }
    </script>
    
    <style>
        .main{
            display: flex;
            justify-content: space-between;
        }
        .managerTitle{
            color:white;
            font-size: 1.5rem;
            width: 15%;
        }
        .header{
            text-align: right;
            background-color: #545c64;
            color:white;
            width: 100%;
        }
        .el-dropdown-link{
            color:yellow
        }
        
    </style>
    View Code

    3、home页面拿到特征值后,根据值来控制导航div的宽度,从而达到隐藏或显示导航栏的效果

     <el-aside :width="isCollapse ? '50px':'200px'">

    4、最后再补一下home页面的完整代码:

    <template>
      <el-container>
        <el-header>
          <headerMenu v-on:my-header-handle="handleHeaderChange" />
        </el-header>
        <el-container>
          <el-aside :width="isCollapse ? '50px':'200px'">
            <myMenu />
          </el-aside>
          <el-main>
            <router-view></router-view>
          </el-main>
        </el-container>
      </el-container>
    </template>
    
     
    
    <script>
    import myMenu from "@/components/navMenu";
    import headerMenu from "@/components/headerMenu";
    export default {
      data() {
        return {
          isCollapse: false,
        };
      },
      components: {
        myMenu,
        headerMenu,
      },
      methods:{
        //监听HeaderMenu控件中的值变化,设置父控件中isCollapse的值
        handleHeaderChange(data){
          console.log('传会给父控件的data值是:',data)
          this.isCollapse = data
          console.log('isCollapse的值是:',this.isCollapse)
        }
      }
    };
    </script>
    
    <style>
    .el-container {
      height: 100%;
    }
    .el-aside {
      background-color: #545c64;
    }
    .el-main {
      background-color: #eaedf2;
    }
    .el-header{
      width: 100%;
      background-color: #545c64;
    }
    </style>
    View Code
  • 相关阅读:
    其他魔术方法
    类型约束和类的魔术常量
    PHP对象遍历、内置标准类与数据转对象
    类的自动加载与对象的克隆
    PHP重载与接口
    面向对象
    PHP基础
    地下城与勇士的项目整理
    mysql建表
    jQuery
  • 原文地址:https://www.cnblogs.com/yhnet/p/13885612.html
Copyright © 2011-2022 走看看