iview 动态加载多层级dropdown 无效

发布于 2022-09-11 22:27:20 字数 3119 浏览 35 评论 0

问题描述

iview 动态加载多(未知)层级的 下拉菜单dropdown 时无效,子组件用递归调用自己不断生成相应的模板,但是测试后无效,貌似是 slot 不能在组件中传递造成的。所以想请教:

  1. 无效的原因是否是 slot 无法传递造成的。
  2. 有什么方法能实现动态加载未知多层级的 下拉菜单dropdown

PS:这里的 动态 指的是一次加载完成,但是层级未知,数据是后台api返回的。

问题出现的环境背景及自己尝试过哪些方法

背景 :递归调用无效,删掉 slot 能直接显示,但是没有 dropdown 的效果了
尝试的方法

  1. 使用组件递归调用自身,无效。
  2. 使用 v-html 拼成字符串使用,无效。(vue 官网文档有描述不能用该方法)

clipboard.png

相关代码

<template>
  <div>
    <Dropdown @on-click="onClickDropdown" :placement="placement">
      <div>
        <a href="javascript:void(0)">{{titleValue}} <Icon :type="icon"></Icon></a>
      </div>
      <DropdownMenu slot="list">
        <link-select-children
          :parent="orgs"
          :placement="placement"
          :icon="icon"
        ></link-select-children>
      </DropdownMenu>
    </Dropdown>
  </div>
</template>
<template>
  <div>
    <div v-for="org in parent" :key="org.id">
      <div v-if="org.children && org.children.length > 0">
        <Dropdown :placement="placement">
          <DropdownItem :name="org.name">
            {{org.name}}
            <Icon :type="icon"></Icon>
            <DropdownMenu slot="list">
              <link-select-children :parent="org.children"></link-select-children>
            </DropdownMenu>
          </DropdownItem>
        </Dropdown>
      </div>
      <div v-else>
        <DropdownItem :name="org.name">
          {{org.value}}
        </DropdownItem>
      </div>
    </div>
  </div>
</template>

<script>
  import {oneOf} from 'iview/src/utils/assist'
  import LinkSelectChildren from './link-select-children'

  export default {
    name: 'LinkSelectChildren',
    components: {LinkSelectChildren},
    props: {
      parent: {
        type: Array,
        default: function () {
          return []
        }
      },
      placement: {
        validator (value) {
          return oneOf(value, ['top', 'top-start', 'top-end', 'bottom', 'bottom-start', 'bottom-end', 'left', 'left-start', 'left-end', 'right', 'right-start', 'right-end'])
        },
        default: 'right-start'
      },
      icon: {
        type: String,
        default: function () {
          return 'ios-arrow-right'
        }
      }
      transfer: {
        type: Boolean,
        default: function () {
          return false
        }
      }
    },
    data () {
      return {
        //
      }
    }
  }
</script>

你期待的结果是什么?实际看到的错误信息又是什么?

  1. 无效的原因是否是 slot 无法传递造成的。
  2. 有什么方法能实现动态加载未知多层级的 下拉菜单dropdown

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ぃ双果 2022-09-18 22:27:20

更新

自己实现了下,主要原因两点:一是内嵌的dropdown里面少了dropdown-item,二是slot="list"要放在link-select-children上

//父组件
<dropdown :placement="placement">
    <div>
        <a href="javascript:void(0)">{{titleValue}}
            <Icon :type="icon"></Icon>
        </a>
    </div>
    <link-select-children slot="list" :parent="orgs" :placement="placement" :icon="icon"></link-select-children>
</dropdown>

//子组件
<template>
    <dropdown-menu>
        <template v-for="org in parent">
            <dropdown v-if="org.children && org.children.length > 0" :placement="placement">
                <dropdown-item>
                    {{org.name}}
                    <Icon :type="icon"></Icon>
                </dropdown-item>
                <link-select-children slot="list" :parent="org.children" :placement="placement" :icon="icon"></link-select-children>
            </dropdown>
            <dropdown-item v-else>
                {{org.name}}
            </dropdown-item>
        </template>
    </dropdown-menu>
</template>
九命猫 2022-09-18 22:27:20

@hfhan 下面是2张效果图,大佬看一下

clipboard.png

clipboard.png

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文