我正在尝试使用获取的用户列表来过滤数组。用户存储在组件状态中。我想通过输入中的文本过滤它。
问题:当我输入字母时,列表正在过滤,但当我删除字母时,结果保持不变。
感谢您的帮助!!!
class App extends React.Component {
state = {
isLoading: true,
users: [],
error: null
}
fetchUsers() {
fetch(`https://jsonplaceholder.typicode.com/users`)
.then(response => response.json())
.then(data =>
this.setState({
users: data,
isLoading: false,
})
)
.catch(error => this.setState({ error, isLoading: false }));
}
componentDidMount() {
this.fetchUsers();
}
onChangeHandler(e) {
console.log(e.target.value);
let newArray = this.state.users.filter((d)=>{
let searchValue = d.name.toLowerCase();
return searchValue.indexOf(e.target.value) !== -1;
});
console.log(newArray)
this.setState({
users:newArray
})
}
render() {
const {isLoading, users, error} = this.state;
return (
<div>
<h1>Users List</h1>
<input type="text" value={this.state.value} placeholder="Search by user name..." onChange={this.onChangeHandler.bind(this)}/>
{error ? <p>{error.message}</p> : null}
<ol>
{!isLoading ? (
users.map(user => {
const {username, name, id} = user;
return (
<li key={id}>
<p>{name} <span>@{username}</span></p>
</li>
);
})
) : (
<h3>Loading...</h3>
)}
</ol>
</div>
);
}
}
export default App;
最佳答案
要达到预期结果,请在使用 setState 更新用户后使用以下选项将用户列表从 API 存储到变量
apiUsers = [];
fetchUsers() {
fetch(`https://jsonplaceholder.typicode.com/users`)
.then(response => response.json())
.then(data =>{
this.apiUsers = data;
this.setState({
users: data,
isLoading: false,
})
}
)
.catch(error => this.setState({ error, isLoading: false }));
}
不要过滤 this.state.users
,而是使用 onChangeHandler
中新创建的变量 - apiUsers
onChangeHandler(e) {
console.log(e.target.value);
let newArray = this.apiUsers.filter((d)=>{
console.log(d)
let searchValue = d.name.toLowerCase();
return searchValue.indexOf(e.target.value) !== -1;
});
console.log(newArray)
this.setState({
users:newArray
})
}
工作代码供引用 - https://stackblitz.com/edit/react-sncf1e?file=index.js
问题::state.users
数组正在更新,而没有来自 api 的实际用户列表副本
关于javascript - 如何在 React.js 中使用获取的数据过滤数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58030249/