如何在vue js中动态设置状态而不先声明它

Posted

技术标签:

【中文标题】如何在vue js中动态设置状态而不先声明它【英文标题】:How to set state dynamically without declaring it first, in vue js 【发布时间】:2021-02-08 04:17:56 【问题描述】:

我正在尝试将类别列表呈现为菜单,并带有一些嵌套的子菜单。 我正在使用 laravel Blade + vuejs。

showSubMenu 是一个可以为真或假的状态。

例如,通过点击 showSubMenu1,我想将其状态更改为 true 以显示其子菜单 div

问题是我应该首先在vue中声明每个状态,例如:

showSubMenu1 = 假, showSubMenu2 = 假, ...

但我不想这样做,因为没有确切的类别数量,而且类别表的 id 可以在删除记录时更改,因为它是一个增量整数

我尝试通过以下方式解决问题:

@foreach(\App\Models\Category::all() as $category)
                        <li @click="showSubMenu$category->id = !showSubMenu$category->id"  ><p>$category->name</p>
                            <div class="sub-menu"  v-if="showSubMenu$category->id">
                               
                            </div>
                        </li>
                    @endforeach

该方法在 react js 中有效,因为不需要在类的 state 部分中指定每个 state。但是 vue 对此抱怨并要求在 vm 的数据部分中静态定义每个可能的状态名称。

【问题讨论】:

您可以为每个子菜单状态使用一个对象,关键是类别->id 【参考方案1】:

状态变量不必是像布尔值这样的简单数据类型,也可以是对象。因此,您可以将所有菜单状态保存在一个变量中:

data: () => (
  activeMenus = 
),
methods: 
  isSubMenuVisible(id) 
   return id in this.activeMenus && this.activeMenus === true;
  ,
  showSubMenu(id) 
    this.activeMenus[id] = true
  


【讨论】:

以上是关于如何在vue js中动态设置状态而不先声明它的主要内容,如果未能解决你的问题,请参考以下文章

让 JComboBox 在 JTable 中显示而不先单击它

插入临时表,并创建一个 IDENTITY 字段,而不先声明临时表?

在 Vue JS 中,如何使我的 APIService.js 类对组件全局可用,而不需要单独的组件来导入它?

如何在路由中动态加载组件

如何在vue.js项目的main.js文件中导入js类并在所有组件中使用它而不是在每个组件中导入?

Vue.js:如何使动态创建的 HTML 使用作用域 CSS?