@cazumbra

Как выделить компонент из кода React?

Привет всем. Есть желание выделить часть кода нижеследующего в отдельный компонент. Не приложу ума как это сделать, если есть useState и всякие вкрапления одного кода в другой. Плохо если честно пока в этом разбираюсь. Вот целый код.

import { useState } from "react"

import Link from 'next/link'

import { getAllPosts } from '@/lib/getAllData'

export default function Blog() {

    /*loadmore*/
    const initialPostList = 2
    const incrementInitialPostList = 1;

    const [showPosts, setShowPosts] = useState(initialPostList);

    const handleLoadMore = () => {
        setShowPosts(showPosts + incrementInitialPostList)
    }

    const blogs = getAllPosts()

    return (
        <main className="flex flex-col">
            <h1 className="text-3xl font-bold">
                Мой блог
            </h1>


            <section className='py-10'>

                <div className='py-2'>
                    {blogs.slice(0, showPosts).map(blog => (
                        <Link href={'/blog/' + blog.slug} passHref key={blog.slug}>
                            <div className='py-2 flex justify-between align-middle gap-2'>
                                <div>
                                    <h3 className="text-lg font-bold">{blog.meta.title}</h3>
                                    <p className="text-gray-400">{blog.meta.description}</p>
                                </div>
                                <div className="my-auto text-gray-400">
                                    <p>{blog.meta.date}</p>
                                </div>
                            </div>
                        </Link>
                    ))}

                    {showPosts < blogs.length ? (
                        <div><button className="mainBtn loadBtn" onClick={handleLoadMore}>Больше статей</button></div>
                        ) : (
                        <div><button className="mainBtn loadBtn" disabled>Больше нет статей</button></div>
                    )}
                </div>
            </section>
        </main>
    )
}


И вот это сделать отдельным компонентом

/*loadmore*/
    const initialPostList = 2
    const incrementInitialPostList = 1;

    const [showPosts, setShowPosts] = useState(initialPostList);

    const handleLoadMore = () => {
        setShowPosts(showPosts + incrementInitialPostList)
    }

 {showPosts < blogs.length ? (
                        <div><button className="mainBtn loadBtn" onClick={handleLoadMore}>Больше статей</button></div>
                        ) : (
                        <div><button className="mainBtn loadBtn" disabled>Больше нет статей</button></div>
                    )}


То есть как-то так должно быть

'use client'
import { useState } from "react"

export default function LoadMore() {
    /*loadmore*/
    const initialPostList = 2
    const incrementInitialPostList = 1;

    const [showPosts, setShowPosts] = useState(initialPostList);

    const handleLoadMore = () => {
        setShowPosts(showPosts + incrementInitialPostList)
    }

    return (
        {showPosts < blogs.length ? (
            <div><button className="mainBtn loadBtn" onClick={handleLoadMore}>Больше статей</button></div>
            ) : (
            <div><button className="mainBtn loadBtn" disabled>Больше нет статей</button></div>
        )}
    )
}


Но так конечно не работает... нужно вытащить blogs из родителя и так далее. При этом я не могу например использовать в родителе useState, а в компоненте const blogs = getAllPosts() так как компонент должен работать на клиенте (use client), а родитель на сервере. NextJS 13 со своей серверной генерацией подкидывает проблем. Можно как то решить это или нет?
  • Вопрос задан
  • 101 просмотр
Пригласить эксперта
Ваш ответ на вопрос

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

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