gpt4 book ai didi

javascript - 将 Vuejs 与计算过滤器一起使用时出现问题

转载 作者:行者123 更新时间:2023-11-30 11:38:35 25 4
gpt4 key购买 nike

我正在使用带复选框的 Vuejs 编写过滤器应用程序。当我使用单个复选框时效果很好。但是,当我选中超过 2 个复选框时,它会删除结果。

例如,当我选中绿色和红色时,它应该显示标题 1 和标题 2。或者当我选中绿色、红色、事件、已完成时,它应该显示标题 1 和标题 2。

您可以在以下位置查看我的代码:https://jsfiddle.net/dalenguyen/xLcvdy0n/1/

HTML代码:

<div class="content">
<div class="row">
<div class="col-md-3 col-sm-4">
<div class="box box-info">
<div class="box-header with-border">
<h3 class="box-title">Filter by</h3>
</div>
<!-- /.box-header -->
<!-- form start -->
<div class="box-body">
<div class="box box-success box-solid">
<div class="box-header with-border">
<h3 class="box-title">Health</h3>
<!-- /.box-tools -->
</div>
<!-- /.box-header -->
<div class="box-body" style="display: block;">
<div class="form-group col-md-12">
<input type="checkbox" id="green" value="Green" v-model="checkedHealths" name="Healths">
<label for="green">Green</label>

</div>
<div class="form-group col-md-12">
<input type="checkbox" id="red" value="Red" v-model="checkedHealths" name="Healths">
<label for="red">Red</label>
</div>
<div class="form-group col-md-12">
<input type="checkbox" id="yellow" value="Yellow" v-model="checkedHealths" name="Healths">
<label for="yellow">Yellow</label>
</div>
</div>
<!-- /.box-body -->
</div>

<div class="box box-success box-solid">
<div class="box-header with-border">
<h3 class="box-title">Status</h3>
<!-- /.box-tools -->
</div>
<!-- /.box-header -->
<div class="box-body" style="display: block;">
<div class="form-group col-md-12">
<input type="checkbox" id="active" value="Active" v-model="checkedStatuses" name="Statuses">
<label for="active">Active</label>
</div>
<div class="form-group col-md-12">
<input type="checkbox" id="completed" value="Completed" v-model="checkedStatuses" name="Statuses">
<label for="completed">Completed</label>
</div>
<div class="form-group col-md-12">
<input type="checkbox" id="cancelled" value="Cancelled" v-model="checkedStatuses" name="Statuses">
<label for="cancelled">Cancelled</label>
</div>
</div>
<!-- /.box-body -->
</div>
<button type="button" class="btn btn-block btn-info" v-on:click="resetFilter">Reset</button>

</div>
<!-- /.box-body -->
</div>
</div>
<div class="col-md-9 col-sm-8">

<div class="col-md-4" v-for="project in filteredProjects">
<div class="box collapsed-box">
<div class="box-header with-border">
<h4 class="box-title"><a href="">{{project['title']}}</a></h4>
<!-- /.box-tools -->
</div>
<!-- /.box-header -->
<div class="box-body">
<table class="table table-striped">
<tr>
<td>Status</td>
<td>{{project['Status']}}</td>
</tr>
<tr>
<td>Health</td>
<td>{{project['Health']}}</td>
</tr>
</table>
</div>
<!-- /.box-body -->
</div>
<!-- /.box -->
</div>
</div>
</div>

</div>

Vuejs 代码:

var app = new Vue({
el: '.content',

data: {
projects: [
{
"title": "Title 1",
"Status": "Active",
"Health": "Green",
},
{
"title": "Title 2",
"Status": "Completed",
"Health": "Red",
},
{
"title": "Title 3",
"Status": "Cancelled",
"Health": "Yellow",
},
]
,
checkedHealths: [],
checkedStatuses: []
},

computed: {
filteredProjects: function(){
let filterProjects = this.projects;


$.each(this.checkedHealths, function(value, key){
filterProjects = filterProjects.filter(function(project){
return project.Health == key;
})
});

$.each(this.checkedStatuses, function(value, key){
filterProjects = filterProjects.filter(function(project){
return project.Status.includes(key);
})
});

return filterProjects;
}
},

mounted: function(){

jQuery('input').iCheck({
checkboxClass: 'icheckbox_square-green',
radioClass: 'iradio_square-green',
increaseArea: '20%' // optional
});

jQuery('input').on('ifChecked', function(e){

if($(this).attr('name') === "Healths")
app.$data.checkedHealths.push($(this).val());

if($(this).attr('name') === "Statuses")
app.$data.checkedStatuses.push($(this).val());

});

jQuery('input').on('ifUnchecked', function(e){

if($(this).attr('name') === "Healths"){
let data = app.$data.checkedHealths;
app.$data.checkedHealths.splice(data.indexOf($(this).val()),1);
}

if($(this).attr('name') === "Statuses"){
let data = app.$data.checkedStatuses;
app.$data.checkedStatuses.splice(data.indexOf($(this).val()),1);
}

});
},

methods: {
resetFilter: function(){
$('input').iCheck('uncheck');
}
}
})

最佳答案

您的 filterProjects 方法应如下所示。

filteredProjects: function(){
let filterProjects = this.projects;

if (this.checkedHealths.length > 0){
filterProjects = filterProjects.filter(project => {
return this.checkedHealths.includes(project.Health);
})
}

if (this.checkedStatuses.length > 0){
filterProjects = filterProjects.filter(project => {
return this.checkedStatuses.includes(project.Status)
})
}

return filterProjects;
}

已更新 fiddle .

从本质上讲,您的旧过滤器代码是单独检查每个过滤器,您需要一次处理所有过滤器。上面的代码循环遍历项目并检查项目的值是否在选定的筛选值中。

您还使用了很多 jQuery,而您本可以只使用 native 方法和 Vue。

关于javascript - 将 Vuejs 与计算过滤器一起使用时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43503622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com