我想显示一个带有搜索栏的狗列表,在搜索栏上方输入时只会显示符合条件的狗。
我之前将数组存储在状态中,一切正常。但是现在,期待一旦启动并运行,我将在数组中拥有数千个条目,而且它会变得太乱了。所以我决定我希望以 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/