【发布时间】:2019-12-02 05:29:33
【问题描述】:
我想显示一个带有搜索栏的狗列表,在该搜索栏上方输入时只会显示符合条件的狗。
我之前将数组存储在 state 中,一切正常。然而现在,期待一旦启动并运行,我将在数组中有数千个条目,它会变得太乱。所以我决定我希望以 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;
我对这一切还很陌生,但我有一种感觉,我将不再需要所有这些组件。我更乐意尽可能地简化它。只要它按预期工作即可。
【问题讨论】:
-
您好,当您在
DogList函数中映射 json 数据时,postDetail 的值是多少,您可以控制台记录该值吗?另外,当您要搜索时收到的错误消息是什么? -
"当我在搜索栏中输入时,我收到一条错误消息。"
-
TypeError:无法读取 null 的属性“toString”(匿名函数)C:/Users/corey/Desktop/said1/src/components/dogslist.js:34 31 | 32 |渲染() { 33 | > 34 |让filteredDogs = this.state.dogs.filter(dog => Object.values(dog).some( | ^ 35 | val => val.toString().toLowerCase().includes(this.state.searchDog.toLowerCase( )))) 36 | 37 |返回(
-
您传递的道具与您尝试使用的道具不同。
<Dog Name={postDetail.title}但在Dog中,您尝试使用密钥title而不是Name。也许你想做的是<Dog postDetail={postDetail} -
为什么你所在的州有 jsx?在
DogsList中,您正在使用 jsx 定义状态。
标签: javascript json reactjs