javascript - 通过 UI 过滤 JSON 对象数组

标签 javascript json reactjs

我想显示一个带有搜索栏的狗列表,在搜索栏上方输入时只会显示符合条件的狗。

我之前将数组存储在状态中,一切正常。但是现在,期待一旦启动并运行,我将在数组中拥有数千个条目,而且它会变得太乱了。所以我决定我希望以 JSON 格式存储我的所有对象,因为我相信它会更容易管理。

我被卡住了,我尝试将 .json 文件集成到旧格式中,但我没有得到任何数据,当我在搜索栏中键入时,我收到一条错误消息。

这是我的 json:

[
 {
  "id": 3,
  "title": "Sir",
  "content":"My name is Sir Jeffrey"
 },
 {
  "id": 4,
  "title": "Prince",
  "content": "My name is Prince Gareth"
 },
 {
  "id": 5,
  "title": "Princess",
  "content": "My name is Princess Roy Roy"
},
{
 "id": 6,
 "title": "King",
 "content": "My name is King George"
}

]

我的 App.js:

import React from 'react';
import './App.css';
import DogsList from './components/dogslist.js';


function App() {
  return (
    <div className="App">
     <DogsList/>
    </div>
  );
}

export default App;

我的列表函数:

import React, {Component} from 'react';
import Dog from './listlayouts.js';



 function DogList(postDetail){
  let dogs = postDetail.filteredDogs.map((dog, i) => {
    return <Dog key={postDetail.id} Name={postDetail.title} Content= 
   {postDetail.content}/>
   })
  return(
  <div>
    {dogs}
  </div>
  )
 };

 export default DogList;

列表布局:

import React, {Component} from 'react';

function Dog(postDetail){
  return(
    <div>
    <p>Name: {postDetail.title}</p>
    <p>Content: {postDetail.content}</p>
    </div>
  )
 }

export default Dog;

搜索框功能:

import React, {Component} from 'react';

function DogSearchBox(postDetail){
  return (
    <div>
     <input onChange={postDetail.handleInput} type ='text'/>
    </div>
  )
}

export default DogSearchBox;

Doglist 组件应该在所有狗的列表上方呈现一个空的搜索栏,然后一旦用户在搜索栏中键入内容,列表就会更改。

import React, {Component} from 'react';
import DogList from './listfunctions.js';
import DogSearchBox from './searchboxfunctions.js';
import postData from './dogs.json';


class DogsList extends Component {
  constructor(props){
    super(props);
    this.state = {
      dogs: [
        <div>
          {postData.map((postDetail, index) => {
            return(
              <div>
               <h2>{postDetail.title}</h2>
               <p>{postDetail.content}</p>
              </div>
            )
          })}

         </div>
      ],
      searchDog:''
    }
  }

  handleInput = (e) => {
    this.setState({searchDog: e.target.value})
  }

  render() {

    let filteredDogs = this.state.dogs.filter(dog => 
    Object.values(dog).some(val => 
    val.toString().toLowerCase().includes
    (this.state.searchDog.toLowerCase())))

    return (
     <div>
      <header>
      <h1>Dogs</h1>
      </header>
      <div>
      <DogSearchBox handleInput = {this.handleInput}/>
      <DogList filteredDogs = {filteredDogs}/>
     </div>
     </div>
    );
  }
}

export default DogsList;

我对这一切还是很陌生,但我感觉我将不再需要所有这些组件。我很乐意尽可能地简化它。只要它按预期工作即可。

最佳答案

你的问题是你正在你的状态中定义 JSX 元素。然后您尝试将其转换为字符串。

class DogsList extends Component {
  constructor(props){
    super(props);
    this.state = {
      dogs: [
        <div>
  // -----^--------------
          {postData.map((postDetail, index) => {
            return(
              <div>
               <h2>{postDetail.title}</h2>
               <p>{postDetail.content}</p>
              </div>
            )
          })}

         </div>
  // -------^--------------
      ],
      searchDog:''
    }
  }

相反,您应该只将数据存储在状态中,在渲染期间创建元素

class DogsList extends Component {
  constructor(props){
    super(props);
    this.state = {
      dogs: [...postData],
      searchDog:''
    }
  }
  render() {
    const filteredDogs = ...
    return <div>
      <DogList dogs={filteredDogs} />
    </div>
  }
}

然后解决将错误的 props 传递给 dog 组件的问题

function DogList({dogs){
  let elems = dogs.map((dog, i) => {
    return <Dog key={dog.id} {...dog} />
  })

  return(
    <div>
      {elems}
    </div>
  )
};

关于javascript - 通过 UI 过滤 JSON 对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57176503/

相关文章:

javascript - 将教程代码中的数据替换为远程文件中的 JSON

css - 对鼠标悬停建议使用react

javascript - React onScroll 未触发

ios - 将对象插入核心数据实体时处理重复项

javascript - Reactjs 将 props 传递给 2 个组件

javascript - PHP 订单 - 固定/可变小计行?

javascript - 使用 Autoform 插入并删除不安全

java - 如何将 json 对象从 Angular 发送到 Rest 服务?

reactjs - 使用 Apollo Client GraphQL 查询和修改表单

javascript - jQuery Ajax 停止长轮询