Kentavr16
@Kentavr16
long cold winter

Как правильно создать layout страницы с изменяемым состоянием?

Пишу проектик на на laravel+react(inertia). Создал главную страницу. Погодя решил из нее сделать лейаут(шаблон для переиспользования)
export default function MainLayout({children}){

    const { props } = usePage();
    //стейт для поп-апа
    const [isVisiblePopup,setIsVisiblePopup] = useState(false)
    const [typePopup,setTypePopup] = useState("")
    const [textPopup,setTextPopup] = useState("");
    //функция для отображения поп-апа
    function showPopup(type,text){
        setTypePopup(type)
        setTextPopup(text)
        setIsVisiblePopup(true)
        setTimeout(()=>{
            setIsVisiblePopup(false)
        },3000)
    }
    return(

        <div className=" flex flex-col justify-between h-screen">
            <Header user={props.auth.user.name}/>
            <div className="flex h-4/6">
                {children({showPopup})}
            </div>
            <Popup text={textPopup}
                   isVisible={isVisiblePopup}
                   type={typePopup}
            />
            <Footer/>
        </div>
    )
}

Как вы можете видеть, здесь есть попап, который тригерится функцией showpopup. Ее я передаю в дочерний элемент.
Использовать его приходится как-то так
export default function BranchPage(){
    return(
        <MainLayout>
            {({showPopup})=>(
                <>
                    <button onClick={()=>showPopup("success","i did it again")}>popup</button>
                </>)}
        </MainLayout>

    )
}

Не уверен что это правильное решение. Как отрефакторить код? Возможно есть стандартное решение моего вопроса от inertia, которого я не увидел? Или штатные средства реакта?
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
@iljaGolubev
Не работаю с react, но есть проекты на inertia+vue. Думаю, общий подход от этого не изменится.

Вы уже используете inertia state (`props.auth.user.name`) - можно использовать и для popup. Props реактивные. Добавьте нужные значения (textPopup,isVisiblePopup,typePopup) в shared-data.
Изменяете значение на странице с кнопкой - в шаблоне отобразится popup.
function showPopup можно вынести в отдельный файл и импортировать на нужных страницах. showPopup изменяет prop.popup.textPopup и прочие.

Плюс подхода - можно с сервера сразу передать нужные значения в попап из контроллера.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы