使用 Laravel 和 Vue.js 绑定到多个类名

Posted

技术标签:

【中文标题】使用 Laravel 和 Vue.js 绑定到多个类名【英文标题】:Bind to multiple class names with Laravel & Vue.js 【发布时间】:2020-02-13 18:05:54 【问题描述】:

我有一个显示项目列表的 vue 组件。我可以将任何项目标记为“活动”(布尔值)。该值被保存到数据库中。

例如,我总共可以有五个项目。其中三个可以标记为“活动”,其余两个则不是。

当我的页面加载时,活动/非活动数据来自我的控制器,我将数据作为属性传递给我的 vue 组件。该属性有一个属性active,可以打开/关闭。该值作为布尔值存储在数据库中。

这是我的组件的样子:

<template>
    <div class="item" :class="'active' : isActive" @click="handleClick($event, item)">
        <div v-if="item.icon" class="item-icon">
            <i :class="item.icon"></i>
        </div>
        <div class="item-title">
             item.title 
        </div>
    </div>
</template>

<script>
    export default 
        name: 'Item',
        data() 
            return 
                isActive: false,
            
        ,
        methods: 
            async handleClick(event, item) 
                try 
                    let response = await axios.patch(`/path/$item.id`, 
                        title: item.title,
                        active: !this.isActive,
                    );

                    if (response.status === 200) 
                        this.isActive = !this.isActive;
                        console.log('isActive: ', this.isActive);
                     else 
                        console.error('Error: could not update item. ', response);
                    
                 catch (error) 
                    console.error('Error: sending patch request. ', error);
                
            ,
        ,
        props: 
            item: 
                type: Object,
                required: true,
            ,
        ,
    
</script>

总体而言,系统正在运行。我的请求得到了正确的处理,数据也得到了正确的更新。

如果我将模板更改为:

<div class="item" :class="'active' : isActive"
     @click="handleItemClick($event, item)">

我看到类/ui 更新正确。但是,因为初始数据来自 Laravel(控制器),所以我需要这两个类。

所以不知何故,我没有正确绑定到类,所以当我点击时,ui 会正确更新。

编辑

非常感谢您的建议。我更新了我的组件逻辑以反映正常工作的内容。当事情崩溃时,我更改模板以说明项目是否已处于活动状态:

<div class="item" :class="'active' : isActive, 'active': item.active"
     @click="handleClick($event, item)">

逻辑仍然有效(当我刷新页面时),但 UI 不会动态更新。

【问题讨论】:

:class=" active: isActive || item.active " 也许? 【参考方案1】:

您可以设置一个计算属性来解释组件中的item.activeisActive,例如:

computed: 
  bindActive() 
    return this.isActive || this.item.active;
  

因此您只能在模板语法中设置一个类:

<div class="item" :class="'active' : bindActive"  @click="handleItemClick($event, item)">...</div>

【讨论】:

是的,我已经习惯了类 api :-/ 唯一想到的是item 是否来自循环,例如v-for="item in items"。如果是这样,OP 将无法使用计算属性 非常感谢!我认为这很接近。我认为我正在努力解决的问题是我无法为所有内容设置isActive: false,。由于 item 可能已经处于活动状态,通过将 data 属性设置为 false,vue 认为默认情况下所有内容都处于非活动状态。有动态设置data属性这种东西吗? 好吧,您可以随时更改isActive 变量——实际上您可以在代码中进行更改。您希望它默认处于活动状态,并且仅在项目(来自 api 调用时)将 active 设置为 false 时才切换为 false? 正确。如果该项目从 api 返回为活动状态,那么我需要将 isActive 设置为 false。但是,如果另一个项目从 api 返回为(未激活),那么我需要将 isActive 设置为 true。当我的页面加载时,vue 组件会从一个控制器中填充——它包含每个项目的所有数据(活动或非活动)。【参考方案2】:

首先我要感谢大家的建议;这是一个巨大的帮助!

我希望我可以帮助其他人,所以这就是我想出的。

<template>
    <div class="item" :class="'active': isActive"
         @click="handleClick($event, item)">
        <div v-if="item.icon" class="item-icon">
            <i :class="item.icon"></i>
        </div>
        <div class="item-title">
             item.title 
        </div>
    </div>
</template>

<script>
    export default 
        name: 'Item',
        data() 
            return 
                isActive: this.item.active,  // <-- this was my error
            
        ,
        methods: 
            async handleClick(event, item) 
                try 
                    let response = await axios.patch(`/path/$item.id`, 
                        title: item.title,
                        active: !this.isActive,
                    );

                    if (response.status === 200) 
                        this.isActive = response.data.item.active;
                     else 
                        console.error('Error: could not update item. ', response);
                    
                 catch (error) 
                    console.error('Error: sending patch request. ', error);
                
            ,
        ,
        props: 
            item: 
                type: Object,
                required: true,
            ,
        ,
    

希望这对某人有所帮助!

【讨论】:

以上是关于使用 Laravel 和 Vue.js 绑定到多个类名的主要内容,如果未能解决你的问题,请参考以下文章

AJAX部分加载后的Vue绑定?

使用 laravel 和 vue js 从 mysql 数据库中检查带有逗号分隔值的复选框

无法在 Laravel 中使用 vue.js 上传多个图像

在 Laravel 5.1 和 Vue JS 中保存多个数据动态表单

在 laravel 中使用 vue.js 获取动态字段数据

laravel 刀片模板中的 Vue.js v-for 循环