vue+iview实现手动打开某一个菜单,应用updateActiveName和updateOpened方法

问题描述:当点击页面中的按钮想要改变菜单的选中项时,往往最想想到的是改变active-name和open-names中的值,但是直接改变这两个值并不能直接生效,有兴趣的可以打印下菜单的属性,会发现其实是已经改变了选中的选项,但是页面没有给与更新,所以我们需要用到iview菜单中提供的updateActiveName和updataOpened来进行实现。

1.首先我们需要一个写好的菜单栏,主要注意的是ref的值,以及操作菜单选项的值active-name和open-names的值。(注:本方法采用的是父子组件的形式实现的,同一个页面间不需要第二步,只需监听open-names的值即可)

<Menu
      :active-name="thisUrl"
      :open-names="[thisTitle]"
      :theme="theme"
      width="auto"
      ref="menus"
      :accordion="true"
      @on-select="mylcick"
    >
    <Submenu :name="itemb.title" v-for="(itemb, indexb) in Mdata" :key="indexb">
      <template slot="title">&emsp;{{ itemb.title }}</template>
      <!--二级菜单-->
      <template v-for="(itemc, indexc) in itemb.child">
         <MenuItem v-if="!itemc.child"
                      :key="indexc"
                      :name="itemc.url"
           >{{ itemc.name }}</MenuItem>
          <Submenu v-if="itemc.child&&itemc.child.length>0" :name="itemc.name" :key="'menuitem' + itemc.name">
            <template slot="title">{{ itemc.name }}</template>
              <template v-for="son in itemc.child">
                <MenuItem :name="son.url" :key="'menuitem' + son.name">
                  <span class="layout-text" :key="'title' + son.name">{{ son.name }}</span>
                </MenuItem>
              </template>
            </Submenu>
          </template>
        </Submenu>
    </Menu>

2.设置接收父组件传参的值,并对这个值进行watch监听。

  props: {
    title:{//这个是父组件的值
    	type:String,
      	required: true
    }
  },

3.对值进行监听。

  watch:{
    title: {
      handler(newName, oldName) {
        this.watchRoute(newName)
      }
    }
  },

4.调用watch监听事件中的方法,注意this.$refs后面的值,要和菜单栏中的ref的值一样,并且this.thisTitle = newName;要在this.$nextTick()方法之前,不然无法生效。

watchRoute(newName) {
  this.thisTitle = newName;
  this.$nextTick(() => {
   	this.$refs.meuns.updateActiveName()
    this.$refs.meuns.updateOpened();
   });
},

以上就是手动打开某一个菜单选项的实现过程,如果觉得有用请多多关注点赞,博主会分享自己使用的过程中遇到的难点问题,大家共同进步!

附:页面所需的数据二级菜单数据以及方法

data() {
    return {
      theme: "dark",
      thisUrl: "",
      thisTitle: "",
      Mdata: [
        {
          title: "区块链信息管理",
          child: [
            {name: "主子链信息", url: "/BApplicationChain"},
            {name: "节点信息", url: "/CNodeInformation"},
            {name: "命名规则", url: "/ANamingRules"}
          ]
        },
        {
          title: "应用链业务备案",
          child: [
            {name: "存证业务", url: "/ADepositBusiness"},
            {name: "智能合约", url: "/BIntelligentContract"}
          ]
        },
        {
          title: "智能安全监管",
          child: [
            {name: "训练模型管理", url: "/ATrainingModel"},
            {name: "训练数据管理", url: "/BTrainingData"},
            {name: "监管策略管理", url: "/CRegulatoryPolicy"},
            {name: "监管异常处理", url: "/DAbnormalDisposal"}
          ]
        },
        {
          title: "系统日志审计",
          child: [
            {name: "主链用户日志", url: "/ALogBrowsing"},
            {name: "子链业务日志", url: "/BDataServiceLog"},
            {name: "展示模板管理", url: "/Visualtemplate"}
          ]
        },
        {
          title: "平台用户管理",
          child: [
            {name: "主链用户", url: "/BRegistrationManagement"},
            {name: "子链用户", url: "/ApplicationChain"},
            {name: "跨链授权", url: "/CAuthorizationManagement"}]
      ]
    };
  },
  beforeMount() {
    let menuArr = [];
    var flatten = (items) => {
      if (items && items.child) {
        menuArr = menuArr.concat(items.child);
        items.child.forEach(i => {
          i.pTitle = items.text || items.title || '';
          flatten(i);
        })
      }
    }
    this.Mdata.forEach(i => {
      flatten(i);
    })
    if (this.$route.path != '/') {
      this.thisUrl = this.$route.path;
      let cMenu = _.find(menuArr, {url: this.thisUrl}) || {};
      this.thisTitle = cMenu.pTitle;
    } else {
      this.thisUrl = this.Mdata[0].child[0].child[0].url;
      this.thisTitle = this.Mdata[0].child[0].title;
    }
  },
  mylcick(url) {//这个放到methods中
    if (this.thisUrl == url) {
      return;
    }
    this.$router.push(url);
    this.thisUrl = url;
 }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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) }) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值