javascript - 如何在 React.js 中使用获取的数据过滤数组?

标签 javascript reactjs list filter

我正在尝试使用获取的用户列表来过滤数组。用户存储在组件状态中。我想通过输入中的文本过滤它。

问题:当我输入字母时,列表正在过滤,但当我删除字母时,结果保持不变。

感谢您的帮助!!!

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/

相关文章:

javascript - 如何混淆(保护)JavaScript?

javascript - 调用 json 并从 Jquery 获取错误 "cannot read property "length"of undefined

javascript - 使用 image.onload 将多个图像绘制到 Canvas

javascript - React 按钮中的无限循环

javascript - 无法读取未定义的属性 'string' | React.PropTypes

python - python 中的列表扩展

javascript - 未从 Selenium Webdriver 中的配置文件接收到正确的值

python - 在元组列表上设置理论魔法

html - CSS 规则莫名其妙地没有被应用

reactjs - React 修改文本区域值