#javascript #jquery #reactjs #react-native #react-hooks
#javascript #jquery #reactjs #react-native #реагирующие хуки
Вопрос:
Я создал панель поиска, вот код, пожалуйста, посмотрите
Но я ищу полноэкранную панель поиска с наложением для справки, добавляя изображение ( https://www.kindpng.com/imgv/mJxwxw_search-full-screen-overlay-css-full-screen-search /)
кто-нибудь может мне помочь с этим?
Я делаю это в react. Как я могу это сделать?
import { Form, ListGroup, Jumbotron } from "react-bootstrap";
export default function Search() {
// SET INITIAL STATE FOR query AND jokes
// CREATE REF FOR SEARCH INPUT
const [query, setQuery] = useState("");
const [jokes, setJokes] = useState([]);
const focusSearch = useRef(null);
// useEffect - FOCUS ON SEARCH INPUT
useEffect(() => {
focusSearch.current.focus();
}, []);
// FETCH API DATA
const getJokes = async (query) => {
const results = await fetch(
`https://icanhazdadjoke.com/search?term=${query}`,
{
headers: { accept: "application/json" }
}
);
const jokesData = await results.json();
return jokesData.results;
};
// PREVENTS RERENDER FLICKERING AS USER TYPES IN SEARCH
const sleep = (ms) => {
return new Promise((resolve) => setTimeout(resolve, ms));
};
// useEffect - ONLY RERENDERS WHEN query IS CHANGED
useEffect(() => {
let currentQuery = true;
const controller = new AbortController();
const loadJokes = async () => {
if (!query) return setJokes([]);
await sleep(350);
if (currentQuery) {
const jokes = await getJokes(query, controller);
setJokes(jokes);
}
};
loadJokes();
return () => {
currentQuery = false;
controller.abort();
};
}, [query]);
// RENDER JOKES
let jokeComponents = jokes.map((joke, index) => {
return (
<ListGroup.Item key={index} action variant="secondary">
{joke.joke}
</ListGroup.Item>
);
});
// RENDER COMPONENT
return (
<>
<Jumbotron fluid>
<Form id="search-form">
<h4>Search</h4>
<Form.Control
type="email"
placeholder="Search for a Joke..."
ref={focusSearch}
onChange={(e) => setQuery(e.target.value)}
value={query}
/>
</Form>
<ListGroup>{jokeComponents}</ListGroup>
</Jumbotron>
</>
);
}
Какой подход я должен предпринять?
Комментарии:
1. Если мой ответ был правильным и он вам помог, пожалуйста, поддержите его!
Ответ №1:
Я бы полностью отказался от вашего кода, а затем использовал бы порталы React для создания родственного div.
index.html
Добавьте это в файл, где #root
находится div.
<div id="root"></div>
<div id="modal"></div>
Теперь нам нужно создать портал React, поэтому создайте модальный компонент. Внутри этого:
import React from 'react';
import ReactDOM from 'react-dom';
export default function Modal() {
return ReactDOM.createPortal(
<p>JSX for modal goes here</p>,
document.querySelector('#modal')
);
}
Недавно я написал блог о dev.to где я подробно рассматриваю порталы react. Проверьте это https://dev.to/akashshyam/an-introduction-to-react-portals-3im0 .
Теперь все, что вам нужно сделать, это добавить свой стиль и функциональность. Нажав на крестик, вы можете настроить отображение на none
.
Комментарии:
1. Спасибо за ответ. Я создал панель поиска, просто я ищу, как сделать ее наложенной. позвольте мне четко определить: — — когда пользователь нажимает на панель поиска, которая находится на домашней странице. Она должна быть наложена на полноэкранную панель поиска Есть ли у нас какие-либо компоненты react для создания наложения?
2. Нет, нет встроенных компонентов для создания наложения. Однако вы можете использовать Portals для создания родственного div и его самостоятельного оформления. Или вы могли бы использовать пакет, такой как react-bootstrap или npmjs.com/package/react-overlays