如何在 Vue 中显示/隐藏对象的某些部分

Posted

技术标签:

【中文标题】如何在 Vue 中显示/隐藏对象的某些部分【英文标题】:How to show/hide parts of an object after in Vue 【发布时间】:2020-03-02 10:20:00 【问题描述】:

我正在为产品创建功能页面。当您单击功能名称时,它应该会在下面展开一个框并提供说明。

我从我的数据中提取了一个小的 sn-p,它的结构基本上是这样的:


  "Section": 
    "Page1": 
      "FeatureName": "Feature desc",
      "FeatureName": "Feature desc"
    ,
    "Page2": 
      "FeatureName": "Feature desc",
      "FeatureName": "Feature desc"
    
  

我已经想出了一些方法来做到这一点,但我个人认为它们都不是很好的方法。

    循环遍历 json/object 并向每个功能添加一个 show 属性。然后我可以切换 bool 来显示/隐藏

    从我的后端服务器,实际提供 show 属性,以便与 vue 一起使用

这两种解决方案都不会使这些组件可重复使用(即,我将来可以将其用作手风琴,但我必须使用显示属性污染我的源数据,或者进行一些繁重的迭代以添加属性,我并不总是这样做知道的深度/级别。)

所以我问,有没有更好的方法或者我列出的唯一方法?

【问题讨论】:

【参考方案1】:

实现展开/折叠以显示更多细节是一个很常见的问题。您可以通过以下几种方式做到这一点:

    为集合中的每个对象添加一个布尔属性。这实际上是您的两种方法归结为的原因。我不希望服务器参与进来,这完全是 UI 问题。 将显示/隐藏值存储在单独的数组/对象中。只是一个大数组或布尔值对象。这很可怕,但它确实避免了改变原始数据。在您的情况下,原始数据位于一个对象中,因此您还可以使用一个对象作为布尔值,使用与原始对象相同的键进行键控。 另一种避免改变原始数据的方法是包装每个对象。例如 Page1: show: false, page: FeatureName: ... 。这种结构的缺点是必须编写模板来处理额外的嵌套。 创建一个组件来保存每个项目的相关状态。这通常是最好的解决方案,但问题是显示/隐藏状态是组件内部的,因此从外部更改它并不容易。这使得实施诸如“显示全部”之类的东西变得很痛苦。只要您不需要从外部访问该状态,它就是一个很好的解决方案。最后是示例。

所有这些都假设每个展开框都应该独立运行。如果您希望将它们链接起来,以便一次只能打开一个,这一切都会变得更加简单,因为您可以将当前展开的项目的 id 存储为 data 属性。

现在,正如所承诺的,使用组件来保存每个项目的相关状态的示例:

const expander = 
  props: ['item'],
  
  data () 
    return 
      expanded: false
    
  ,
  
  template: `
    <div>
      <h4> item.title </h4>
      <button @click="expanded = !expanded">Toggle</button>
      <p v-if="expanded"> item.description </p>
    </div>
  `


new Vue(
  el: '#app',
  
  components: 
    expander
  ,
  
  data () 
    return 
      "Section": 
        "Page1": 
          "title": "Title 1",
          "description": "Blah blah blah blah"
        ,
        "Page2": 
          "title": "Title 2",
          "description": "More more more more"
        
      
    
  
)
<script src="https://unpkg.com/vue@2.6.10/dist/vue.js"></script>

<div id="app">
  <expander
    v-for="(item, propertyName) in Section"
    :key="propertyName"
    :item="item"
  ></expander>
</div>

【讨论】:

以上是关于如何在 Vue 中显示/隐藏对象的某些部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在动态 uitableview 中隐藏部分及其行

如何显示和隐藏在 vue js 中动态创建的 div(多格式选项卡结构)

Android如何隐藏底部虚拟按键

如何在 CMake 中隐藏某些目标?

如何在 bootstrap vue 的 b-tabs 中显示按钮?

如何在 React Table 上显示和隐藏某些列?