ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

2025.02.16 (์ผ) Works

 

1. ๊ฒ€์ƒ‰์–ด ํ•„ํ„ฐ๋ง

   1-1. ์—”ํ„ฐ ๊ฒ€์ƒ‰

   1-2. join ํ•ด์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

   1-3. ๊ฒ€์ƒ‰ value ํ•„ํ„ฐ๋ง

2. ์žฅ์†Œ ํ•„ํ„ฐ๋ง (์ „์ฒด / ๊ตญ๋‚ด / ๊ตญ์™ธ)

   2-1. onClick ์ด๋ฒคํŠธ ์ฃผ๊ธฐ

   2-2. ํ•„ํ„ฐ๋ง ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

 

 

 

๊ฒ€์ƒ‰์–ด ํ•„ํ„ฐ๋ง

 

์—”ํ„ฐ ๊ฒ€์ƒ‰

๊ฒ€์ƒ‰ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์—”ํ„ฐ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

๊ฒ€์ƒ‰ ํ›„์—๋Š” ๊ฒ€์ƒ‰์ฐฝ์ด ๋นˆ ๊ฐ’์œผ๋กœ ์„ค์ •๋œ๋‹ค.

// SearchInput.jsx
const handleSearch = e => {
	if (e.key === "Enter") return;
    setSearchInput("");
};

 

 

join ํ•ด์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ & ๊ฒ€์ƒ‰ value ํ•„ํ„ฐ๋ง

๊ฒ€์ƒ‰์ด ๋˜๋Š” ๊ฐ’๋“ค์„

๊ธ€ ์ œ๋ชฉ, ๋‹‰๋„ค์ž„, MBTI, ๊ธ€ ๋‚ด์šฉ์œผ๋กœ ์ •ํ–ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋„ค ๊ฐœ์˜ ๊ฐ’์— ๊ฒ€์ƒ‰ ๋‚ด์šฉ์ด ์žˆ๋Š” ์ง€ includes๋กœ ํŒ๋ณ„ํ•œ ํ›„, ํ•ด๋‹น๋˜๋Š” posts(๊ฒ€์ƒ‰๊ฐ’)์„ ๊ทธ๋ ค์ค˜์•ผ ํ–ˆ๋‹ค.

 

์•„๋ž˜ ๋กœ์ง์„ ์‚ดํŽด๋ณด๋ฉด posts(๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ)์— filter ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

posts ๋ฐฐ์—ด์— ๋‹‰๋„ค์ž„๊ณผ mbti๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผ ํ–ˆ๋‹ค.

// SearchInput.jsx

const keyword = searchInput;   ๐Ÿ‘‰๐Ÿป ์ž…๋ ฅ๊ฐ’ state๋ฅผ 'keyword' ๋ณ€์ˆ˜๋กœ ์ง€์ •

    const searchPosts = posts.filter(post => {  ๐Ÿ‘‰๐Ÿป ์ „์ฒด ๊ฒŒ์‹œ๊ธ€์—์„œ ๊ฒ€์ƒ‰ ๋‚ด์šฉ์— ํ•ด๋‹นํ•˜๋Š” ๊ธ€์„ filter
      return (
        post.title.includes(keyword) ||  ๐Ÿ‘‰๐Ÿป ์ œ๋ชฉ ํŒ๋ณ„
        post.content.includes(keyword) ||   ๐Ÿ‘‰๐Ÿป ๋‚ด์šฉ ํŒ๋ณ„
        post.users?.nickname.includes(keyword) ||   ๐Ÿ‘‰๐Ÿป ๋‹‰๋„ค์ž„ ํŒ๋ณ„
        post.users?.mbti.includes(keyword.toUpperCase())   ๐Ÿ‘‰๐Ÿป mbti ํŒ๋ณ„
      );
    });

    setChangePosts(searchPosts);   ๐Ÿ‘‰๐Ÿป ํ•„ํ„ฐ๋ง ํ•œ ๊ฐ’ setState

 

 

supabase API ์ค‘ ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ colomn ๊ฐ’์„ ํ•จ๊ป˜ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

// HomeContext.jsx
supabase.from("posts").select("*, users(nickname, mbti)")

 

 

posts์˜ ๊ฐ’์„ ์ฝ˜์†”์—์„œ ํ™•์ธํ•ด๋ณด๋ฉด 'users' ์˜ ๊ฐ’๋„ ์ž˜ ๊ฐ€์ ธ์™€์กŒ๋‹ค.

 

 

 

์žฅ์†Œ ํ•„ํ„ฐ๋ง (์ „์ฒด / ๊ตญ๋‚ด / ๊ตญ์™ธ)

 

 

onClick ์ด๋ฒคํŠธ ์ฃผ๊ธฐ

์ „์ฒด / ๊ตญ๋‚ด / ๊ตญ์™ธ div์— onClick ์ด๋ฒคํŠธ๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค.

// Home.jsx

return (
      <StCategoryContainer>
        <StCategory onClick={() => showPosts("all")}>์ „์ฒด</StCategory>
        <StCategory onClick={() => showPosts("in")}>๊ตญ๋‚ด</StCategory>
        <StCategory onClick={() => showPosts("out")}>๊ตญ์™ธ</StCategory>
      </StCategoryContainer>
      ...

 

 

 

ํ•„ํ„ฐ๋ง ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

onClick ์ด๋ฒคํŠธ์— ์‚ฌ์šฉ๋  ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

 

 

๐ŸšจํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… 1 

ํ•„ํ„ฐ๋งํ•œ ๊ฐ’์— ๋˜ ํ•„ํ„ฐ๋ง์ด ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐ˜๋ณต๋˜์–ด ์ œ๋Œ€๋กœ ์ •๋ ฌ์ด ๋˜์ง€ ์•Š์•˜๋‹ค.

 

์‹œ๋„ 1. ์–•์€ ๋ณต์‚ฌ

tempPosts = [...post]; ๋กœ ์–•์€ ๋ณต์‚ฌ๋ฅผ ํ•˜์—ฌ ํ•„ํ„ฐ๋ง์— ์‚ฌ์šฉํ–ˆ๋‹ค.

 

์‹œ๋„ 2. ๊นŠ์€ ๋ณต์‚ฌ

structuredClone() ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊นŠ์€ ๋ณต์‚ฌ์˜ ๊ฐ’์„ ํ•„ํ„ฐ๋ง์— ์‚ฌ์šฉํ–ˆ๋‹ค.

 

์‹œ๋„ 3.  card์— ์ง์ ‘ ๊ฐ’ ๋ถ€์—ฌ

ํ•„ํ„ฐ๋งํ•œ ๊ฐ’์„ card ๋กœ์ง์— ์ง์ ‘ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

(card ๋กœ์ง์€ ์นด๋“œ ํ˜•ํƒœ๋ฅผ ๊ทธ๋ ค์ฃผ๊ธฐ๋งŒ ํ•˜๋ฏ€๋กœ ์ž˜๋ชป๋œ ์ ‘๊ทผ์ด๋‹ค.)

 

 

! ๋ฌธ์ œ ์›์ธ : ํ•„ํ„ฐ๋งํ•œ ๊ฐ’์„ setPosts์— ์ฃผ์–ด posts์˜ ๊ฐ’ ์ž์ฒด๊ฐ€ ๋ฐ”๋€Œ๋Š” ์ค‘์ด์—ˆ๋‹ค.

 

 

โœจํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

Context์—์„œ

const [ changePosts, setChangePosts ] = useState([...posts]);

๋กœ ์นด๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ state๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค.

 

 

๐ŸšจํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… 2

์ •๋ ฌ์€ ์ž˜ ๋˜์ง€๋งŒ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ์นด๋“œ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋œจ์ง€ ์•Š์•˜๋‹ค.

 

์ฝ˜์†”์— ํ™•์ธํ•ด๋ณด๋‹ˆ posts์˜ ๊ฐ’์ด ๋นˆ ๋ฐฐ์—ด์ด์—ˆ๋‹ค๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

! ๋ฌธ์ œ ์›์ธ :  ํ™”๋ฉด์ด ๋‹ค ๊ทธ๋ ค์ง€๊ณ  ๋‚œ ํ›„, DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋’ค๋Šฆ๊ฒŒ ๊ฐ’์ด ๋ฐ˜์˜๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

โœจํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

useEffect ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ posts์˜ ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ, useEffect๊ฐ€ ํ•œ ๋ฒˆ ๋” ์‹คํ–‰๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์˜์กด์„ฑ ๋ฐฐ์—ด์—๋Š” ๋ณ€ํ•˜๋Š” ๊ธฐ์ค€์˜ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ณ , ํ•จ์ˆ˜ ๋‚ด๋ถ€์—๋Š” ์‹คํ–‰ํ•  ๋กœ์ง์„ ์ž‘์„ฑํ•œ๋‹ค.

useEffect(() => {
    setChangePosts(posts);
  }, [posts]);

 

 

 

์ตœ์ข… ๋กœ์ง

styled-commponents ์ƒ๋žต

// Home.jsx
...

useEffect(() => {
    setChangePosts(posts);
  }, [posts]);

  const showPosts = where => {
    if (where === "all") {
      setChangePosts([...posts]);
      return;
    }
    if (where === "in") {
      const filterInPost = posts.filter(post => {
        return post.travel_location === "๊ตญ๋‚ด";
      });
      setChangePosts(filterInPost);
      return;
    }
    if (where === "out") {
      const filterOutPost = posts.filter(post => {
        return post.travel_location === "๊ตญ์™ธ";
      });
      setChangePosts(filterOutPost);
      return;
    }
  };

  const showModal = post => {
    setSelectedPost(post);
  };

  return (
    <>
      <StCategoryContainer>
        <StCategory onClick={() => showPosts("all")}>์ „์ฒด</StCategory>
        <StCategory onClick={() => showPosts("in")}>๊ตญ๋‚ด</StCategory>
        <StCategory onClick={() => showPosts("out")}>๊ตญ์™ธ</StCategory>
      </StCategoryContainer>
      <div>
        {changePosts.map((post, index) => {
          return (
            <MoveModal
              key={`${post.uid}-${index}`}
              onClick={e => {
                if (e.target.classList.contains("heart")) {
                  return;
                }
                showModal(post);
              }}
            >
              <HomePostCard post={post} />
            </MoveModal>
          );
        })}
      </div>
      {isSignin === true ? <AddPostButton /> : null}
      {selectedPost && (
        <ShowModal
          post={selectedPost}
          closeModal={() => setSelectedPost(null)}
        />
      )}
    </>
  );
};

export default Home;
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2026/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ