【发布时间】:2020-07-22 00:38:22
【问题描述】:
嘿,想要实时过滤在 vue js 中创建组件期间呈现的 JSON 对象数组
在挂载的生命周期钩子上有这个:
const search = document.querySelector('.search input');
search.addEventListener('keyup',()=>{
const term = search.value.trim();
this.books = this.books.Title.filter(function (item) {
return item.Title.match(term)
})
})
我尝试了几种不同的方法,但无法在数组上找到允许我动态过滤和更新数组的函数
任何能指引我正确方向的事情都会有所帮助!
搜索框:
<form class="search">
<input class="form-control m-auto" type="text" name="search" placeholder="search" />
</form>
完整代码
template>
<div>
<div class="shelf" style="margin: 40px;">
<h6>Here you can search a title of any book that is in the list</h6>
<label for="fname">Search term:</label>
<input type="text" id="fname" v-model="searchText">
<ul class="collapsible popout">
<h6 v-if="searchResults.length">Search results</h6>
<li class="li" v-for="(book,index) in searchResults" :key="index">
<div class="collapsible-header">
<h5>
{{ book.Title }}
</h5>
</div>
<div class="collapsible-body">
<p>Author: {{book.Author}}</p>
<p>Category: {{book.Category}}</p>
<div class="loan" v-if="book.Loan">on loan</div>
<div class="owned" v-if="book.Owned">Owned</div>
<!-- vue-router required to run this -->
<!-- <router-link :to="{name:'EditBook', params:{id:book.id}}">
<i class="material-icons">edit</i>
</router-link>-->
</div>
</li>
</ul>
</div>
<h5>Here is the list of avalaible books</h5>
<ul class="collapsible popout" style="margin: 40px;">
<li class="li" v-for="(book,index) in books" :key="index">
<div class="collapsible-header">
<h5>
<book-icon/>
{{ book.Title }}
</h5>
</div>
<div class="collapsible-body">
<p>Author: {{book.Author}}</p>
<p>Category: {{book.Category}}</p>
<div class="loan" v-if="book.Loan">on loan</div>
<div class="owned" v-if="book.Owned">Owned</div>
</div>
</li>
</ul>
</div>
</template>
<script>
import db from '@/firebase/init'
import firebase from 'firebase'
import M from 'materialize-css'
export default {
name: 'Shelf',
data () {
return {
books:[],
searchText: ''
}
},
mounted(){
var DropDownElems = document.querySelectorAll('.dropdown-trigger');
let options = {
inDuration: 300,
outDuration: 300,
hover: true, // Activate on hover
coverTrigger: false, // Displays dropdown below the button
};
M.Dropdown.init(DropDownElems,options);
var ColapseElems = document.querySelectorAll('.collapsible');
M.Collapsible.init(ColapseElems)
},
created(){
db.collection('Bookshelf').get()
.then(snapshot=>{
snapshot.forEach(book => {
let b = book.data()
b.id = book.id
this.books.push(b)
});
})
},
computed: {
searchResults() {
if (this.searchText.length === 0) return "";
return this.books.filter(book => book.Title.match(this.searchText));
}
}
}
</script>
<style >
.loan{
background: #ccc;
box-shadow: 4px 3px 8px 1px #969696;
-webkit-box-shadow: 4px 3px 8px 1px #969696;
width: 150px;
height: 150px;
}
.li{
margin-left: 70px auto;
margin-right: 70px auto;
}
.edit{
left: 80%;
}
</style>
我能够验证 books 数组的输出一切正常
数组示例: 0: 作者:“串” 类别:“字符串” 贷款:布尔值 拥有:布尔值 现在阅读:布尔值 作品名称:《字符串》 id:“字符串”
当我运行返回 this.books.filter(book => console.log(book.Title));调试我得到一个字符串
【问题讨论】:
-
什么是数据模型?
this.books.Title.filter看起来不对 -
能否分享完整代码
-
已编辑 - 主帖感谢@KarlL
标签: javascript vue.js