// App.js
function App() {
  const Login = lazy(() => import('./page/Login'));
  const LogOut = lazy(() => import('./page/LogOut'));
  const SignPage = lazy(() => import('./page/SignPage/SignPgae'));
  const Questions = lazy(() => import('./page/Questions'));
  const CreateQuestionPage = lazy(() => import('./page/CreateQuestionPage'));
  const Post = lazy(() => import('./components/Post/Post'));
  const AnswerEdit = lazy(() => import('./page/AnswerEdit'));
  //const User = lazy(() => import('./page/User'));
  const Tags = lazy(() => import('./page/Tags'));
  const User = lazy(() => import('./page/User'));

  const [datas, setDatas] = useState(dummyData);

return (
    <Router>
      <GlobalStyles />
      <Main>
        <Suspense fallback={<div>Loading...</div>}>
          <Routes>
			// ... 생략
            <Route
              path="/questions/:id"
              element={<Post datas={datas} setDatas={setDatas} />}
            />
            // ... 생략

dummyData에서 데이터를 datas 배열로 가져와서 Post 로 보내줬다.

그리고 Post에서 꺼내와서 {} 로 값을 동적으로 주면 되는데 datas 에서 어떻게 꺼내야 할 지 감을 전혀 못잡고 있었다

 

 

//dummyData.js

const dummyData = [
  {
    id: 1,
    title: '게시글 제목',
    likes: 0,
    answers: 0,
    views: 2,
    body: `I am building a large project on a remote machine using Bazel. Clean build times are around 30 minutes. Incremental builds (changing code in 1-2 files) typically take around 10-20 seconds.

    The problem I have is that when I log out of my machine and log back in again after 1-2 days the build command takes around 10 minutes even though I have not modified any source code.
    
    If I call bazel shutdown and then call bazel build again the "no-build" op takes around 5-10 seconds (i.e. much better than the other "no-build" op).
    
    If I log out and log back in again immediately I can see there is still a bazel process running in the background, which disappears when I call bazel shutdown. I am guessing that when I do not shut bazel down properly it gets killed in such a way that corrupts or deletes cached data. The long "no-build" op then spends a long time reconstructing data that was previously stored in the Bazel cache.
    
    Is there a way to automatically shut down the bazel server when I am disconnected? Preferably this should work both when (i) I call exit from the command-line to log out, (ii) I get automatically disconnected through some kind of timeout or interruption in network connectivity.`,
    tag: ['java', 'c++'],
    user: {
      username: 'Heera',
      createdAt: 'asked 46 secs ago',
    },
  },
  {
    id: 2,
    title: '2번째 글',
    likes: 2,
    answers: 10,
    views: 56,
    body: '2번재 오랜만에 글을 작성해 보는데 말이죠... 이거는 정말,.. 제가 할 수 있는 일인가에 대한걸 다시 고민해봐야 할 시점인것 같습니다만.. 얼마나 길게 쓴게 잘려서 나올지 한번 테스트 해보도록 하겠습니다.. 이정도면 엄청 길게 쓴게 아닐까요?? 정말 고민이 많이 됩니다.. 이게 한꺼번에 다 나오지 않아야 할텐데 말이죠... 조금만 더 길게 적어보겠습니다.조금만 더 길게 적어보겠습니다.조금만 더 길게 적어보겠습니다. 이정도면 될거같은데, 사이즈가 늘어나 버려서 더 길게 작성하고, 크기 가 넘어가는 내용은 안나오는지 확인해 보려고 합니다~',
    tag: ['java', 'javascript', 'python'],
    user: {
      username: 'seoyeon',
      createdAt: 'asked 46 secs ago',
    },
  },
  {
    id: 3,
    title: '세번째 글입니다만...',
    likes: 34,
    answers: 668,
    views: 23234,
    body: '안녕하세요 제 질문은요/..',
    tag: ['java', 'logic', 'nameerror', 'firebase-authentication'],
    user: {
      username: 'kim.s.y',
      createdAt: 'asked 5 mins ago',
    },
  },
  {
    id: 4,
    title: '4번째 글',
    likes: 2,
    answers: 8,
    views: 45,
    body: '444444 내용이랄게 없지만서도 적으면 또 적을수도 있는데,.. 데체 긴 내용은 어떻게 길이를 줄일까요',
    tag: ['java', 'c++'],
    user: {
      username: 'harnry',
      createdAt: 'asked 7 mins ago',
    },
  },
 //... 생략
 ]

export default dummyData;

더미 데이터는 배열 안에 객체가 들어가있는 형태.

객체다 보니까 인덱스 값이 없었다.

 

const { id } = useParams();

를 사용해 console.log({id})를 찍어보면 url의 id 값이 잘 찍혔다.

{ id }과 datas의 id 값이 같은 걸 찾아서 post에 뿌려주면 될 거 같다는 윤곽이 잡혔다.

 

그런데 datas.id 가 계속 null 혹은 undefined가 나왔다 (객체니까....)

여기서부터 6시간 이상을 별 시도를 다 해봤다.

이것저것 찾다가 아래의 글을 보고 아이디어를 얻었다.

 

https://velog.io/@lilyoh/js-object-%EC%9A%94%EC%86%8C%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B3%A0-%EC%88%9C%ED%9A%8C%ED%95%98%EA%B8%B0

 

[js] object 요소에 접근하고 순회하기

info 객체에 키를 생성하고 값을 할당해주려고 한다. 키와 값은 변수를 통해 받아온다.위와 같은 변수가 주어졌을 때, info 객체에 키와 값을 할당하는 방법은 2 가지가 있다.객체의 요소는 인덱스(

velog.io

 

for in 문으로 객체를 순회해서 datas[i].id 를 구하고 그것을   { id } 와 비교하자!

개발자도구에 바로 시도를 해봤다.

 

잘 뜬다!

이걸로 시도를 해봤다

 

시도한 코드

=> 문제점

  • if문이 제대로 작동을 안함
    • {id} ==! datas[i].id 가 false 인게 맞다면 error 가 떠야하는데 <Container> 가 화면에 뜸
  • {id} 를 콘솔에 수십번을 찍어봤는데도 문자열이라는 걸 눈치못챔
  • {id} 는 url의 `.../:id` 에 맞게 변하는데 datas[i].id 는 1에서 변하질 않음
    • 그래서인지 질문리스트에서 다른 제목을 눌러봐도 {id}만 제대로 바뀌고, 안에 Post 내용들은 1번째 글이랑 똑같이 뜸...
const Post = () => {
  const { id } = useParams();
  const [datas, setDatas] = useState(dummyData);

  for(let i in datas){
    if({id} ==! datas[i].id){
      return(
        <div>result error</div>
      )
    }
    console.log(`data[i].id`, datas[i], datas[i].id, {id})
    return(
      <>
      <div>
        <Container>
          <Nav />
          <Content>
            <div className="div-css">
              <div>
                <PostTitle datas={datas[i]} setDatas={setDatas} />
              </div>
              <div className="div-inline-block">
                <div className="div-flex">
                  <Like />
                  <PostMainText datas={datas[i]} />
                  <PostAside>
                    <div>aside</div>
                  </PostAside>
                </div>
              </div>
              <Answers />
            </div>
          </Content>
        </Container>
        <Footer />
      </div>
    </>
    );
  }
}

 

구글링으론 원하는 결과가 안 나와서 유튜브에 검색했다.

검색어 : js useParams

그러다가 아래의 영상을 보게 되었다.

 

https://youtu.be/vI-XtN_Zdfg

 

유레카!!

아무 기대없이 봤는데 내 상황에 써먹을 수 있겠다는 생각이 들어 침대에서 벌떡 일어나 다시 노트북을 켰다

 

 

수정한 코드

=> 문제점

  • .map() 을 사용해 data.id와 {id} 가 같은 데이터를 Post에 뿌려주기 때문에 id가 같으면 post가 똑같은 내용이 두번 뜸
    • 하지만 ID는 고유값이기 때문에 괜찮음 ㅎ
  • Answers 컴포넌트도 .map() 안에 넣어야 함.
    • Answers의 답변 내용들도 질문마다 다르기 때문에 넣어야함 근데 넣으면 레이아웃 잡아둔 거 난리날까봐 내일수정하기로 함
const Post = () => {
  const { id } = useParams();
  const [datas, setDatas] = useState(dummyData);
  const datasSame = datas.filter((data) => data.id === Number(id));

  console.log(`dataSame`, datasSame);
  return (
    <>
      <div>
        <Container>
          <Nav />
          <Content>
            <div className="div-css">
              <div className="예시">
                {datasSame.map((data) => (
                  <>
                    <div key={data.id}>
                      <div>
                        <PostTitle datas={data} setDatas={setDatas} />
                      </div>
                      <div className="div-inline-block">
                        <div className="div-flex">
                          <Like />
                          <PostMainText datas={data} />
                          <PostAside>
                            <div>aside</div>
                          </PostAside>
                        </div>
                      </div>
                    </div>
                  </>
                ))}
              </div>
              <Answers />
            </div>
          </Content>
        </Container>
        <Footer />
      </div>
    </>
  );
};

콘솔에도 잘 뜬다

 

=> 추가 (22.11.08)

map 과 필터를 지워져도 정상적으로 구동되게 코드를 아래와 같이 변경하였다.

기존과는 다르게 app.js 데이터를 props 로 내려주지 않고, Post.js 에서 fetch 로 데이터를 바로 받아오면서 수정하게 된 코드이다.

const Post = ({ qid, setQid,setAid, setAnswerEditContent }) => {
  const { id } = useParams();
  const [posts, setPosts] = useState([]);
  
  useEffect(() => {
    fetch(
      `url주소/${id}`,
      { method: 'GET' },
    )
      .then((response) => response.json())
      .then((post) => {
        setPosts(post.data);
        setQid(id);
      });
  }, [id]);
  return (
    <>
      <div>
        <Container>
          <Nav />
          <Content>
            <div className="div-css">
              <div className="예시">
                    <div key={posts.questionId} className="div-css">
                      <div>
                        <PostTitle datas={posts} key={id} />
                      </div>
                      <div className="div-inline-block">
                        <div className="div-flex">
                          <div className="div-inline-flex">
                            <div className="div-inline-block">
                              <div className="div-flex">
                              <Like datas={posts} />
                              <PostMainText datas={posts} />
                              </div>
                              <Answers answers={posts.answers} qid={qid} setAid={setAid} setAnswerEditContent={setAnswerEditContent}/>
                            </div>
                          </div>
                          //...생략

버튼이 죽어도 오른쪽 정렬이 안됨

=> 각 요소를 양쪽 정렬 시켜서 해결

display: flex;
    justify-content: space-between;

 

ask 버튼을 <link> 안에 넣으니 Margin-left:auto 가 안 먹힘

=> Link 태그에 CSS 로 Margin-left:auto 주니 해결 완료

pre 프로젝트 중에 '/post' 화면에서 suspense 로 띄운 Loding... 만 뜨고 페이지가 Post 로 안 넘어가면서 갑자기 이런 에러가 떴다

다른 페이지에선 안 뜨는 에러라 찾아보니

 

https://sudo-minz.tistory.com/100

 

리액트 uncaught syntaxerror: unexpected token '<' 해결

리액트 uncaught syntaxerror: unexpected token '

sudo-minz.tistory.com

http://lab.naminsik.com/4011

 

lab.naminsik

lab.naminsik - 개발자 남인식 Lab.

lab.naminsik.com

https://egg-stone.tistory.com/28

 

[JS]Uncaught SyntaxError: Unexpected token '<'

웹사이트를 만들고나서 개발자모드로 확인하던 도중 오류를 발견하게 되었어. 말그대로 '

egg-stone.tistory.com

https://shanepark.tistory.com/125

 

<!DOCTYPE html> 에 Uncaught SyntaxError: Unexpected token '<' 뜰때 해결하기

Controller에서 일정 패턴으로 URL을 맵핑 시키고 있었습니다. PathVariable을 적극적으로 이용해서 심플한 url 패턴을 만들어보자! 해서 localhost/project이름/로그인사용자닉네임/사용모듈 ... 으로 depth 구

shanepark.tistory.com

https://iot624.tistory.com/88

 

Uncaught SyntaxError: Unexpected token '<' in <!DOCTYPE html> 자문자답 ^0^ - Node.js

https://antdev.tistory.com/32 [NodeJS] npm으로 express, socket.io 모듈 설치 및 웹 서버 구축, 소켓 연결하기 [express와 socket.io을 이용 2019/02/27 - [NodeJS/NodeJS로 간단한 채팅기능 만들기] - [NodeJS] 채팅방UI 구성, 소

iot624.tistory.com

 

나와 같은 사람들은 많았으나 저 해결 방법들 중 맞는 게 없었다.

콘솔 로그에  codemirror.js  에서 생긴 오류라고 떴는데 이게 토스트 Ui 와 함께 사용하려고 넣은 뷰어였다.

리액트 18 버전에선 안 되는지 에러를 뿜뿜 뿜어내길래 여기서 에러를 띄우는 건가 싶었다. 

 

내 해결 방법은

 

index.html 에서

    <!-- <link rel="stylesheet" href="lib/codemirror.css">
    <script src="lib/codemirror.js"></script> -->

적혀 있던 부분을 주석 처리해버리는 거였다.

 

 

토스트 UI 랑 뷰어 오류 정말... 진절머리가 난다.

 

+ Recent posts