gpt4 book ai didi

javascript - 使用 Vue 动态加载时,HTML 数据列表不断崩溃

转载 作者:行者123 更新时间:2023-11-30 14:53:40 24 4
gpt4 key购买 nike

我正在使用 Vue.js 加载 HTML 数据列表。每当我输入连接到我的数据列表的输入框时,我的页面就会卡住(使用 Chrome)。我正在使用 jQuery 进行 AJAX 调用以在页面加载时最初获取我的所有用户,然后使用 JavaScript 过滤器函数创建一个具有 indexOf 的新数组。无论在我的输入框中键入什么,然后将新过滤的对象数组放入数据列表元素中。

这是我的 HTML:

<div id="my-app">
<input list="user-search" type="text" id="find-user" name="find-user" v-model="findUser">
<datalist id="user-search">
<option v-for="user in findUserList">{{ user.vendorName }}</option>
</datalist>
</div>

这是我的 Vue JavaScript:

var myApp = new Vue({
el: '#my-app',
data: {
users: [],
findUser: '',
findUserList: '',
},
watch: {
findUser: function(val) {
this.findUserResults();
}
},
methods: {
findUserResults: function() {
var lookFor = this.findUser.toLowerCase();
this.findUserList = this.users.filter(function(user) {
return (user.vendorName.toLowerCase().indexOf(myApp.findUser.toLowerCase()) > -1 || user.email.toLowerCase().indexOf(myApp.findUser.toLowerCase()) > -1);
});
},
loadUsers: function() {
$.ajax({
method: 'GET',
url: '/users',
success: function(data) {
myApp.users = JSON.parse(data);
},
error: function() {
console.log('error...');
}
});
}
},
mounted: function() {
this.loadUsers();
}
})

当页面加载时,用户加载正常。那里没有问题。我什至注释掉了 v-for只是console.log过滤的结果也没有问题。当我实现动态添加 <option> 时出现问题<datalist> 中的值.我试过将选项包装在 vue <template> 中标记并移动 v-for那里没有成功。

我在另一个页面上工作正常,但我用 <tr> 填充了一个表和 <td>而不是 <datalist><option> .

什么可能导致我的页面崩溃?是<datalist>不足以处理所有这些?也许我遗漏了第二双眼睛可以帮助解决的问题。

编辑

正在填充到 users 中的数据看起来像这样(它是一个对象数组):

[{id:1, vendorName:'john'}, {id:2, vendorName:'Rachel', {id:3, vendorName:'Steve'}]

回答

这实际上只是某人(我)想太多的一个例子。 B.Fleming 关于递归的回答让我明白了为什么我的上述方法不正确。无需在用户每次键入时都重新加载数据列表选项。这正是<datalist>链接到 <input>做;不需要 JavaScript。我需要(编辑)做的就是将我所有的 ~3,000 名用户加载到 <datalist> 中。标记为 <option> s 在页面加载时(或每当我希望输入和数据列表显示时),让数据列表和输入处理其余部分。我没有用上面示例中的应用程序对此进行测试,因为我不在那台计算机附近,但作为数据列表可以处理数千个选项元素的概念证明,我编写了这个并在本地运行它没有问题(不确定为什么代码段控制台在工作时一直说有错误):

window.onload = function() {
var datalistElement = document.getElementById('datalist-test');
var datalistString = '';
for (var i = 0; i < 3000; i++) {
datalistString += '<option>' + Math.random().toString(36).substring(7); + '</option>';
}
datalistElement.innerHTML = datalistString;
}
<!DOCTYPE html>
<html>
<head>
<title>Datalist Test</title>
</head>

<body>
<input list="datalist-test" type="text">
<datalist id="datalist-test">
</datalist>
</body>
</html>

3,000 个数据列表选项元素,没问题。

最佳答案

你有无限递归调用。您在输入/删除搜索文本时调用 myApp.findUser(),它调用 myApp.findUserResults(),它调用 myApp.findUser() 等。你需要解决这个问题。

要解决此问题,您只需将所有用户一次加载到数据列表选项中。然后,让输入框和数据列表处理剩下的事情。无需在每次用户键入时都重新加载数据列表选项。

关于javascript - 使用 Vue 动态加载时,HTML 数据列表不断崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47720145/

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