在 React 中过滤 JSON

Posted

技术标签:

【中文标题】在 React 中过滤 JSON【英文标题】:Filtering JSON in React 【发布时间】:2017-01-30 11:15:04 【问题描述】:

我正在使用 FETCH 加载一些 JSON 数据。我正在尝试在显示的内容上添加/创建一个简单的过滤功能。

我收到此错误:

未捕获的类型错误:无法读取未定义的属性“toLowerCase”

知道是什么导致了这个错误吗?

到目前为止这是我的代码:

let Table = React.createClass(
    getInitialState: function()
        return  
            accounts: [
                "product": "Fixed Saver", 
                "interestRate": 2.20,
                "minimumDeposit": 500,
                "interestType": "Fixed"
            ],
            searchString: ''
        
    ,
    componentDidMount: function()
        fetch('http://localhost:8888/table/json/accounts.json')
            .then(response => 
                return response.json()
            )
            .then(json => 
                this.setState(accounts: json)
            );
    ,
    handleChange: function(e)
        this.setState(searchString:e.target.value);
    ,
    render: function()
        var libraries,
        libraries = this.state.accounts,
        searchString = this.state.searchString.trim().toLowerCase();

        if(searchString.length > 0)
            libraries = libraries.filter(l => 
                return l.name.toLowerCase().match( searchString );
            );
        

        return (
            <div className="container">

            <input type="text" value=this.state.searchString onChange=this.handleChange placeholder="Type here" />

                <ul className="header clearfix">
                    <li>Product</li>
                    <li>Interest rate</li>
                    <li>Minimum deposit</li>
                    <li>Interest type</li>
                </ul>

                libraries.map(l => 
                return (
                    <div className="account clearfix" key=l.id>
                        <div className="product">l.product</div>
                        <div>l.interestRate %</div>
                        <div>£ l.minimumDeposit</div>
                        <div>l.interestType</div>
                    </div>
                    )
                ) 
            </div>
        )
    
);

let App = React.createClass(
    render: function()
        return(
            <Table />
        );
    
);

ReactDOM.render( <App />, document.getElementById('table') );

JSON

[
   
      "id": 1,
      "product": "Fixed Saver", 
      "interestRate": 2.20,
      "minimumDeposit": 500,
      "interestType": "Fixed"
   ,
   
      "id": 2,
      "product": "Fixed Saver", 
      "interestRate": 1.50,
      "minimumDeposit": 0,
      "interestType": "Tracker"
   ,
   
      "id": 3,
      "product": "Offset Saver", 
      "interestRate": 1.8,
      "minimumDeposit": 1000,
      "interestType": "Fixed"
   
]

【问题讨论】:

您可以验证帐户是否已填充到控制台中吗?我猜您的 fetch 没有绑定到组件本身 【参考方案1】:

您似乎从这一行得到了错误

libraries = libraries.filter(l => 
  return l.name.toLowerCase().match( searchString );
);

因为 l.name 是未定义的。您可以再次检查您的 JSON 数据。没有name属性,好像是product

您不应该通过以下方式直接修改您的状态:libraries = libraries.filter... 状态应该由 setState 函数更新。 在这种情况下,您应该创建临时变量来显示结果,而不是直接使用库变量。 我相信,如果您的样本有效,您只能进行第一次搜索,而下一次的结果只会出现在您的最后一次搜索结果中。

【讨论】:

嗨 Hieu,你说得对,它应该是产品。非常感谢。

以上是关于在 React 中过滤 JSON的主要内容,如果未能解决你的问题,请参考以下文章

React JS:按字符串过滤数组

通过 React Router 从 json 传递数据

在 React 中使用 useReducer 钩子过滤列表?

React - 从全局上下文中过滤获取的数据的问题

访问 ReactTable 中的过滤数据

SVG 过滤器无法在 React 中渲染