新手,大佬轻点喷,vue2项目,搜索框用的原生,请求数据用的axios
我在项目中写了一个搜索框,目前数据的静态的,我想动态获取数据,但数据是异步请求获取的,如果我像下面直接这样赋值会获取不到值,我想使用promise改写,请问以下应当如何改写
代码:
<template> <div class="serUser"><!-- 将用户数据动态渲染出来--> <h1>欢迎进入用户管理界面</h1><!-- 搜索框 --> <div id="container"> <div class="sea-container"> <form action=""> <input type="text" name="search" class="blue-input" > <input type="submit" value="搜索" class="blue-button"> </form> <p id="selectedId"></p> </div> </div><!-- --> <ul v-for="(data,index) of userData" :key="index"> <li>第{{index+1}}位用户的ID为:{{data.username}}</li> <li>第{{index+1}}位用户的密码为:{{data.password}}</li> <li> <button @click="changeUser()">编辑</button> <button @click="deleteUser(index)">删除</button> </li> </ul> </div></template><script type="text/ecmascript-6">import axios from "axios";export default { data(){ return{ userData:[] } }, methods:{ changeUser(){ alert("修改我没写哦,但是可以删除") }, deleteUser(index){ const flag = this.areYouSureDelete() if(flag){ this.userData.splice(index, 1) const deleteUser = this.userData axios.get("http://192.168.198.1/admin/deleteUser",{ params:{ deleteUser:deleteUser } }).then(res=>{},error=>{console.log("请求失败", error)}) } }, areYouSureDelete(){ return confirm("确定删除吗!"); },//传入this.userData返回此数据用的所有username initUserData(data){ if(!(data instanceof Array)){ return } let newData = [] for (let i = 0; i < data.length; i++) { newData.push(data[i].username) } return newData } }, mounted() { axios.get("http://192.168.198.1/admin/userShow") .then(res=>{ this.userData = res.data.data // console.log("请求成功", this.userData[0].password) },error=>{ console.log("请求失败", error) }) let arr = ["user","userNo1","userNo25","userNo99","userNo123","userNo1","abcd","asgh","asdasd","fsaas","ssda","admin","userZhangSan"]; // let arr = this.userData // console.log(arr) let search = document.getElementsByClassName("blue-input")[0]; let selectedId = document.getElementById("selectedId") function showList(){ let res = searchByIndexOf(search.value,arr); console.log(res) for(let i=0;i<res.length;i++){ let li = document.createElement("li"); li.innerHTML = res[i]; document.getElementById("drop").appendChild(li); } } search.oninput = function getMoreContents() { // 添加删除ul let drop = document.getElementById("drop"); selectedId.removeChild(drop); let originalUl = document.createElement("ul"); originalUl.id = "drop"; selectedId.appendChild(originalUl); showList(); } search.onfocus = function(){ let originalUl = document.createElement("ul"); originalUl.id = "drop"; selectedId.appendChild(originalUl); showList(); } search.onblur = function(){ let drop = document.getElementById("drop"); selectedId.removeChild(drop); }//模糊查询 function searchByIndexOf(keyWord, list){ if(!(list instanceof Array)){ return ; } if(keyWord == ""){ return []; }else{ let len = list.length; let arr = []; for(let i=0;i<len;i++){ //如果字符串中不包含目标字符会返回-1 if(list[i].indexOf(keyWord)>=0){ arr.push(list[i]); } } return arr; } } }}</script><style scoped>h1{ font-size: 28px; text-align: center; padding-top: 40px;}ul{ padding: 60px 0 0 30%;}ul li { padding-bottom: 12px;}#container { width: 800px; height: 150px; margin: 0 auto 150px; padding-top: 30px; box-sizing: border-box;}/*搜索栏*/.sea-container { width: 450px; height: 30px; background-color: green; margin: 50px auto 150px; border: 1px solid #317EF3; /*padding-bottom: 150px;*/}.blue-input { float: left; width: 350px; height: 30px; padding: 0 10px; box-sizing: border-box;}.blue-button { width: 100px; height: 30px; background-color: #317EF3; color: white; font-size: 15px;}/* 搜索下拉框*/ul#drop { list-style: none; margin: 0; padding: 0;}ul#drop li { margin: 0; padding: 10px;}ul#drop li:hover { background-color: darkgrey; width:200px;}p#selectedId { display: inline-block;}</style>后台的json数据{"admin":[{"username":"admin","password":"123456"}], "users": [ { "username": "user", "password": "123456" }, { "username": "userNo1", "password": "123456" }, { "username": "userNo99", "password": "123456" }, { "username": "userZhangSan", "password": "123456" }, { "username": "userLisi", "password": "123456" }, { "username": "AASD", "password": "SSDA" } ]}
方法1、对于promise异步回调,搜索框的设置可以直接写在回调里面
axios.get("http://192.168.198.1/admin/userShow") .then(res=>{ this.userData = res.data.data let arr = ["user","userNo1","userNo25","userNo99","userNo123","userNo1","abcd","asgh","asdasd","fsaas","ssda","admin","userZhangSan"]; // ... 其他代码:搜索框的设置等 },error=>{ console.log("请求失败", error) })
方法2、使用async/await组合
async mounted() { try { // 通过await实现异步调用api接口 const res = await axios.get("http://192.168.198.1/admin/userShow") this.userData = res.data.data; let arr = ["user","userNo1","userNo25","userNo99","userNo123","userNo1","abcd","asgh","asdasd","fsaas","ssda","admin","userZhangSan"]; // ... 其他代码:搜索框的设置等 } catch (error) { console.error("Failed to fetch or process data:", error); }}
望采纳哈O(∩_∩)O
2023 年了,用 async/await
吧,在异步操作前加一个 await
,再把自己的函数前加一个 async
,剩下的就跟写同步函数差不多。
async mounted() { // 这里最好加一个错误处理,网络请求很容易出错 const data = await axios.get('....'); this.userData = data; // 后面也不要再手动操作 dom 了,直接写成模版吧}
使用 async/await
- mounted() {- axios.get("http://192.168.198.1/admin/userShow")- .then(res=>{- this.userData = res.data.data- // console.log("请求成功", this.userData[0].password)- },error=>{- console.log("请求失败", error)- })+ async mounted() {+ arr = await axios.get("http://192.168.198.1/admin/userShow")+ .then(res=>{+ return res.data.data+ })- let arr = ["user","userNo1","userNo25","userNo99","userNo123","userNo1","abcd","asgh","asdasd","fsaas","ssda","admin","userZhangSan"];
1、axios的get方法返回的就是一个包装过的Promise对象
2、如果你原先的想法是想要把在then()方法里等待请求被满足后返回的值赋给arr,那大可以在get方法前先初始化arr,在then()里把res.data.data直接给arr就行了:
mounted(){ let arr = []; axios.get(xxx). then((res)=>{ this.userData=res.data.data; arr = this.userData; }). catch(error=>console.log("请求失败",error));}
这就是它看起来的样子。 它工作得很好,等待数据加载,然后开始操作。但这是相当多的代码,有没有更好的方法来做它?
本文向大家介绍如何使用JavaScript集更快地编写代码?,包括了如何使用JavaScript集更快地编写代码?的使用技巧和注意事项,需要的朋友参考一下 要了解如何使用集合使代码更快,我们必须首先了解必须使用集合而不是数组的场景- 由于Set仅包含唯一元素,因此如果我们事先知道我们希望避免将重复数据保存到我们的结构中会更容易。 设置像的基本操作,,,等...很容易实现的有效基础上,原生内置业务提
cb是回调函数,我想要先执行cb,再执行后面test中一些逻辑 这个如何改为Promise写法,不使用setTimeout、requestAnimationFrame 能得到下面的使用效果
vue3 如何 使用 vue2.7写的代码?以前的项目都是vue2写的,版本被我升级成了vue2.7,最近开了一个新项目,我使用了vue3,需要用到vue2写好的几个组件,我现在没时间把代码改成vue3组合式写法了,然后我想着vue3不是也支持选项式写法吗,我就直接把vue2的组件copy过来,volar倒是没有报语法错误,但是项目跑不起来。报错截图。 vue3的选项式写法难道和vue2的写法有什
我正在努力将Java代码转换为javascript。为此,例如,我正在将public静态int primesolution转换为函数primesolution。我不太知道我是否在转换它的正确轨道上。我被困在公共静态空main(String[]args)中。如何将此函数转换为Javascript。非常感谢任何帮助。 我用JavaScript转换的代码
我尝试了多种方法来运行它。目的是绘制用户可以点击的圆圈。我无法在JGroup上绘制任何东西。我最初是在扩展JFrame,但意识到我需要扩展JGroup。我正在使用IntelliJ GUI Designer进行布局。我将非常感谢任何帮助。 这是IntelliJ表单设计器文件。 https://pastebin.com/Z3b0PVtZ