代码之家  ›  专栏  ›  技术社区  ›  moses toh

如何在vue组件的treeview中激活子类别?

  •  0
  • moses toh  · 技术社区  · 8 年前

    我有两个vue组件。

    我的第一个组件(父组件)如下所示:

    <template>
        ...
            <ul class="filter-category" v-for="list in categories">
                <list-category :data="list" :category-id="categoryId"></list-category>
            </ul>
        ...
    </template>
    <script>
        ...
        export default {
            ...
            data() {
                return {
                    categories: [
                        {
                            id: 1,
                            name: 'England',
                            children: [
                                {
                                    id: 3,
                                    name: 'Chelsea',
                                    children: [
                                        {id: 7, name: 'Hazard'},
                                        {id: 8, name: 'Morata'}
                                    ]
                                },
                                {
                                    id: 4,
                                    name: 'Manchester United',
                                    children: [
                                        {id: 9, name: 'Pogba'},
                                        {id: 10, name: 'Lukaku'}
                                    ]
                                }
                            ]
                        },
                        {
                            id: 2,
                            name: 'Spain',
                            children: [
                                {
                                    id: 5,
                                    name: 'Real Madrid',
                                    children: [
                                        {id: 11, name: 'Ronaldo'},
                                        {id: 12, name: 'Bale'}
                                    ]
                                },
                                {
                                    id: 6,
                                    name: 'Barcelona',
                                    children: [
                                        {id: 13, name: 'Messi'},
                                        {id: 14, name: 'Suarez'}
                                    ]
                                },
                            ]
                        }
                    ],
                    categoryId: 7
                }
            }
        }
    </script>
    

    我的第二个组件(子组件)如下所示:

    <template>
        <li>
            <!--parent-->
            <a v-if="isFolder" href="javascript:" @click="toggle">
                <span class="fa fa-fw" :class="icon"></span> {{data.name}}
            </a>
            <!--if not folding, we do not need an binding event-->
            <a v-else href="javascript:" :title="data.name"><span class="fa fa-fw fa-circle-o"></span> {{data.name}}</a>
            <!--children-->
            <ul v-if="isFolder" :class="isShow">
                <list-category v-for="(data, index) in data.children" :key="index" :data="data" :search="search"></list-category>
            </ul>
        </li>
    </template>
    <script>
        export default {
            props: ['data', 'categoryId'],
            data() {
                return {
                    open: false
                }
            },
            computed: {
                icon() {
                    return {
                        'fa-plus': !this.open,
                        'fa-minus': this.open,
                    }
                },
                isFolder() {
                    return this.data.children && this.data.children.length
                },
                isShow() {
                    return this.open ? 'show': 'hide'
                }
            },
            methods: {
                toggle() {
                    this.open = !this.open
                }
            }
        }
    </script>
    

    If道具 categoryId = id 数据中的类别 categories ,则我希望该类别处于活动状态。

    在我的代码中,我想知道如果执行了代码,类别危险活动如下:

    ==========================================================================

    enter image description here

    ==========================================================================

    我该怎么做?

    1 回复  |  直到 8 年前
        1
  •  1
  •   acdcjunior Mukul Kumar    8 年前

    实际上遗漏了两件事:

    • 您必须添加 conditional class attribute ( :class="{active: data.id === categoryId}" )使用对象语法:

      <a v-else href="javascript:" :title="data.name" :class="{active: data.id === categoryId}"><span class="fa fa-fw fa-circle-o"></span> {{data.name}}</a>
      
    • 你必须通过 categoryId 沿着组件树向下( :category-id="categoryId" ):

      <ul v-if="isFolder" :class="isShow">
          <list-category v-for="(data, index) in data.children" :key="index" :data="data" :search="search" :category-id="categoryId"></list-category>
      </ul>
      

    演示如下。

    Vue.component('list-category', {
      template: "#lc",
      props: ['data', 'categoryId', 'search'],
      data() {
        return {
          open: false
        }
      },
      computed: {
        icon() {
          return {
            'fa-plus': !this.open,
            'fa-minus': this.open,
          }
        },
        isFolder() {
          return this.data.children && this.data.children.length
        },
        isShow() {
          return this.open ? 'show' : 'hide'
        }
      },
      methods: {
        toggle() {
          this.open = !this.open
        }
      }
    })
    
    new Vue({
      el: '#app',
      data() {
        return {
          categories: [{
              id: 1,
              name: 'England',
              children: [{
                  id: 3,
                  name: 'Chelsea',
                  children: [{
                      id: 7,
                      name: 'Hazard'
                    },
                    {
                      id: 8,
                      name: 'Morata'
                    }
                  ]
                },
                {
                  id: 4,
                  name: 'Manchester United',
                  children: [{
                      id: 9,
                      name: 'Pogba'
                    },
                    {
                      id: 10,
                      name: 'Lukaku'
                    }
                  ]
                }
              ]
            },
            {
              id: 2,
              name: 'Spain',
              children: [{
                  id: 5,
                  name: 'Real Madrid',
                  children: [{
                      id: 11,
                      name: 'Ronaldo'
                    },
                    {
                      id: 12,
                      name: 'Bale'
                    }
                  ]
                },
                {
                  id: 6,
                  name: 'Barcelona',
                  children: [{
                      id: 13,
                      name: 'Messi'
                    },
                    {
                      id: 14,
                      name: 'Suarez'
                    }
                  ]
                },
              ]
            }
          ],
          categoryId: 7
        }
      }
    })
    .active {
      background: yellow;
    }
    <script src="https://unpkg.com/vue"></script>
    
    <div id="app">
      <div>
        <ul class="filter-category" v-for="list in categories">
          <list-category :data="list" :category-id="categoryId"></list-category>
        </ul>
      </div>
    </div>
    
    <template id="lc">
        <li>
            <!--parent-->
            <a v-if="isFolder" href="javascript:" @click="toggle">
                <span class="fa fa-fw" :class="icon"></span> {{data.name}}
            </a>
            <!--if not folding, we do not need an binding event-->
            <a v-else href="javascript:" :title="data.name" :class="{active: data.id === categoryId}"><span class="fa fa-fw fa-circle-o"></span> {{data.name}}</a>
            <!--children-->
            <ul v-if="isFolder" :class="isShow">
                <list-category v-for="(data, index) in data.children" :key="index" :data="data" :search="search" :category-id="categoryId"></list-category>
            </ul>
        </li>
    </template>
    推荐文章