Извините за нубский вопрос, только начинаю работать с React. Итак, моя страница обращается к списку округов, отформатированному как массив, из API с использованием этого компонента:
class FetchRandomCounty extends React.Component {
state = {
loading: true,
county: null,
};
async componentDidMount() {
const url = "http://localhost:5000/api/counties";
const response = await fetch(url);
const data = await response.json();
this.setState({ county: data, loading: false });
}
render() {
return (
<div>
{this.state.loading || !this.state.county ? (
<div> loading... </div>
) : (
<div>
<div>
{" "}
{this.state.county
.filter((item) => item.startsWith("J"))
.map((item) => (
<li key = {item}>{item}</li>
))}{" "}
</div>
</div>
)}
</div>
);
}
}
Полученные данные представляют собой массив, который выглядит следующим образом:
["Aransas", "Austin", "Bastrop", "Bee", "Brazoria", "Burleson", "Caldwell", "Calhoun", "Chambers", "Colorado", "Comal", "De Witt", "Fayette", "Fort Bend", "Galveston", "Goliad", "Gonzales", "Grimes", "Guadalupe", "Hardin", "Harris", "Jackson", "Jasper", "Jefferson", "Jim Wells"]
И вывод в настоящее время таков:
Как предложить пользователю ввести букву и отфильтровать массив, чтобы отображались только данные, начинающиеся с этой буквы? Сейчас я использую item.startsWith('J'))
и хочу, чтобы он реагировал на ввод пользователя. Это мой компонент пользовательского ввода:
class LetterForm extends React.Component {
constructor(props) {
super(props);
this.state = { value: "" };
this.handleChangeEvent = this.handleChangeEvent.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChangeEvent(event) {
this.setState({ value: event.target.value });
}
handleSubmit(event) {
alert("A letter was submitted: " + this.state.value);
event.preventDefault();
}
render() {
return (
<form onSubmit = {this.handleSubmit}>
<label>
StartsWith:
<input
type = "text"
value = {this.state.value}
onChange = {this.handleChangeEvent}
/>
</label>
<input type = "submit" value = "Submit" />
</form>
);
}
}
Если вы хотите сохранить FetchRandomCounty
и LetterForm
как отдельные компоненты, вы можете управлять выбранной буквой с помощью реквизита для FetchRandomCounty
и управлять им из родителя, а также ввести реквизит обратного вызова onChange
для LetterForm
, который вы используете для изменения сохраненной выбранной буквы в родительском элементе. .
Пример
const data = [
"Aransas",
"Austin",
"Bastrop",
"Bee",
"Brazoria",
"Burleson",
"Caldwell",
"Calhoun",
"Chambers",
"Colorado",
"Comal",
"De Witt",
"Fayette",
"Fort Bend",
"Galveston",
"Goliad",
"Gonzales",
"Grimes",
"Guadalupe",
"Hardin",
"Harris",
"Jackson",
"Jasper",
"Jefferson",
"Jim Wells"
];
class FetchRandomCounty extends React.Component {
state = {
loading: true,
county: null
};
componentDidMount() {
// const url = "http://localhost:5000/api/counties";
// const response = await fetch(url);
// const data = await response.json();
this.setState({ county: data, loading: false });
}
render() {
const { loading, county } = this.state;
const selectedLetter = this.props.selectedLetter.toLowerCase();
return (
<div>
{loading || !county ? (
<div> loading... </div>
) : (
<div>
<div>
{county
.filter((item) => item.toLowerCase().startsWith(selectedLetter))
.map((item) => (
<li key = {item}>{item}</li>
))}
</div>
</div>
)}
</div>
);
}
}
class LetterForm extends React.Component {
state = { value: "" };
handleChangeEvent = (event) => {
this.setState({ value: event.target.value.slice(0, 1) });
};
handleSubmit = (event) => {
event.preventDefault();
this.props.onChange(this.state.value);
};
render() {
return (
<form onSubmit = {this.handleSubmit}>
<label>
StartsWith:
<input
type = "text"
value = {this.state.value}
onChange = {this.handleChangeEvent}
/>
</label>
<input type = "submit" value = "Submit" />
</form>
);
}
}
class App extends React.Component {
state = { selectedLetter: "J" };
updateLetter = (selectedLetter) => {
this.setState({ selectedLetter });
};
render() {
return (
<div>
<FetchRandomCounty selectedLetter = {this.state.selectedLetter} />
<LetterForm onChange = {this.updateLetter} />
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>
<div id = "root"></div>