๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
side project

[React][side project] mbti๊ถํ•ฉ ํ…Œ์ŠคํŠธ(2)

by codnjs779 2021. 11. 26.

๐ŸŽˆ์ด์ „๊ธ€๊ณผ ์ด์–ด์ง€๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค.

 

5. MeinputPage & YouinputPage - 2,3๋ฒˆ์งธ ํ™”๋ฉด  & ๋ชจ๋‹ฌ

 

๐Ÿฅš MeinputPage - ๋‚˜์˜ ์ •๋ณด ์ž…๋ ฅ ํ”Œ๋žซํผ    

 

  <๊ธฐ๋Šฅ ๊ตฌํ˜„>

- ์ž…๋ ฅํ•œ ์ •๋ณด โฉ ๋ฆฌ๋•์Šค ์Šคํ† ์–ด์— ์ €์žฅ

- ์„ฑ๋ณ„ Click โฉ ๋‘˜ ์ค‘ ํ•œ๊ฐœ๋งŒ ํด๋ฆญ ๊ฐ€๋Šฅ

- ์ธํ’‹์ฐฝ ๊ณต๋ฐฑ โฉ ๋‹ค์ŒํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์—†์Œ

- ํ˜ˆ์•กํ˜• & MBTI Click โฉ ๋ชจ๋‹ฌ์ฐฝ์—์„œ ์„ ํƒํ•œ ๊ฐ’์œผ๋กœ ์ž…๋ ฅ(์ง์ ‘์ž…๋ ฅ ๋ถˆ๊ฐ€)

- ๋‹ค์Œ์œผ๋กœ  Click โฉ ๋‹ค์ŒํŽ˜์ด์ง€ ์ด๋™ (์ •๋ณด ๋ชจ๋‘ ์ž…๋ ฅ์‹œ)

 

๐Ÿฅš MeinputPage์— ์ž…๋ ฅ๊ฐ’ ๋“ค์–ด๊ฐˆ state ๋งŒ๋“ค๊ธฐ 

//MeinputPage.jsx
import React, { useState } from "react";

const MeinputPage = () => {
    const [name, setName] = useState("");
    const [gender, setGender] = useState("");
    const [born, setBorn] = useState("");
    const [blood, setBlood] = useState("");
    const [mbti, setMbti] = useState("");

const handleSubmit = (e) => {
        e.preventDefault();
    };
    
    return(
    <>
   <form onSubmit={handleSubmit}>
             <div>
                <label htmlFor="๋‚ด์ด๋ฆ„">๋‚ด ์ด๋ฆ„</label>
                   <input type="text"
                          placeholder="์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
                          onChange={(e) => {
                          setName(e.target.value);
                          }}
                    />
              </div>
              <div className="line" />

              <div className="genderType">
                 <label htmlFor="์„ฑ๋ณ„" className="genderTitle">์„ฑ๋ณ„ </label>
                    <input type="radio" className="radioInput" value="male" name="gener" onChange={(e) => setGender(e.target.value)} />
                      <label htmlFor="๋‚จ" className="labelGender">
                           <span>๋‚จ</span>
                       </label>
                      <input type="radio" className="radioInput" value="female" name="gener" onChange={(e) => setGender(e.target.value)} />
                         <label htmlFor="์—ฌ" className="labelGender">
                              <span>์—ฌ</span>
                         </label>
               </div>
               <div className="line" />
                       
                <div>
                   <label htmlFor="์ƒ๋…„์›”์ผ">์ƒ๋…„์›”์ผ</label>
                      <input type="text" placeholder="8์ž๋ฆฌ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”" value={born} maxLength="8" onChange={(e) => setBorn(e.target.value)} />
                 </div>
                 <div className="line" />
                       
                 <div>
                    <label htmlFor="ํ˜ˆ์•กํ˜•">ํ˜ˆ์•กํ˜•</label>
                        <input type="text"
                                placeholder="ํ˜ˆ์•กํ˜•์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
                                value={blood}
                                onChange={(e) => setBlood(e.target.value)}
                                onClick={() => {
                                    setBloodModal(!bloodModal);
                                }}
                                readOnly
                            />
                 </div>
                 <div className="line" />
                        
                  <div>
                     <label htmlFor="mbti">MBTI</label>
                        <input  type="text"
                                placeholder="MBTI๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
                                value={mbti}
                                onChange={(e) => setMbti(e.target.value)}
                                onClick={() => {
                                    setMbtiModal(!mbtiModal);
                                }}
                                readOnly
                            />
                        </div>
                        <div className="line" />
   </form>
   </>
   )}

- onChangeํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ธํ’‹์ฐฝ์— ์ž…๋ ฅ๋˜๋Š” ๊ฐ’์œผ๋กœ ๊ฐ state๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คฌ์Œ.

- form์— hadleSubmitํ•จ์ˆ˜๋ฅผ ์ ์šฉ์‹œ์ผœ์„œ ์ž๋™์œผ๋กœ ์ œ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€์‹œ์ผœ์คฌ์Œ.

 

 

๐Ÿ”ท ์ž…๋ ฅํ•œ ์ •๋ณด โฉ ๋ฆฌ๋•์Šค ์Šคํ† ์–ด์— ์ €์žฅ

$ npm install react-redux

1) src ํด๋”์— redux ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ์ค€๋‹ค. 

2) reducer.js

//reducer.js
const initialState = {
    meData: [],
    youData: [],
};

const reducer = (state = initialState, action) => {
    switch (action.type) {
        case "ADD_ME_DATA":
            return {
                ...state,
                meData: [...state.meData, action.payload],
            };
        case "ADD_YOU_DATA":
            return {
                ...state,
                youData: [...state.youData, action.payload],
            };
        default:
            return state;
    }
};

export default reducer;

 - meData, youData์˜ ์ดˆ๊ธฐ๊ฐ’์„ ๋นˆ๋ฐฐ์—ด๋กœ ์ƒ์„ฑํ•ด ์ค€๋‹ค. 

 - ์•ก์…˜ ํƒ€์ž…์ด ADD_ME_DATA์ผ ๋•Œ๋Š” meData์— ๊ฐ’์„ ์ €์žฅํ•ด์ฃผ๊ณ  ADD_YOU_DATA์ผ ๋•Œ๋Š” youData์— ๊ฐ’์„ ์ €์žฅํ•ด์ฃผ๋Š”     ๋ฆฌ๋“€์„œ๋ฅผ ์ž‘์„ฑํ•ด ์ค€๋‹ค.

 

3) index.js

//index.js
import { combineReducers } from "redux";
import reducer from "./reducer";

const reducers = combineReducers({
    data: reducer,
});

export default reducers;

 

4) store.js

//store.js
import { createStore } from "redux";
import reducers from "./index";
import { composeWithDevTools } from "redux-devtools-extension";

export const store = createStore(reducers, composeWithDevTools());

 ์Šคํ† ์–ด๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ณ  ๋ฆฌ๋“€์„œ ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค. composeWithDevTools()๋Š” redux dev tool์„ ์‚ฌ์šฉํ•ด์ฃผ๋ ค๋ฉด ์จ์ค˜์•ผํ•œ๋‹ค.

 

5) src index.js

// src index.js
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from "react-router-dom";

import App from "./components/App";
import reportWebVitals from "./reportWebVitals";

import { Provider } from "react-redux";
import { store } from "../src/redux/store";

ReactDOM.render(
    <Provider store={store}>
        <BrowserRouter>
            <App />{" "}
        </BrowserRouter>
    </Provider>,
    document.getElementById("root")
);


reportWebVitals();

<Provider>๋ฅผ ์ตœ์ƒ์œ„์— ๊ฐ์‹ธ์ฃผ๊ณ  store๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ์ด์ œ store์— ๋‹ด๊ธด ๊ฐ’๋“ค์„ ์ „์—ญ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์‚ฌ์šฉ ์ „์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ dispatch๋ฅผ ํ•ด์ค˜์•ผํ•œ๋‹ค.

//MeinputPage.jsx
import { useDispatch } from "react-redux";
import React, { useState } from "react";

const MeinputPage = () => {
    const dispatch = useDispatch();
 
    const [name, setName] = useState("");
    const [gender, setGender] = useState("");
    const [born, setBorn] = useState("");
    const [blood, setBlood] = useState("");
    const [mbti, setMbti] = useState("");
//์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ state๋“ค

    const onClick = () => {
        if (name.length !== 0 && gender.length !== 0 && born.length !== 0 && blood.length !== 0 && mbti.length !== 0) {
            dispatch({
                type: "ADD_ME_DATA",
                payload: {
                    name,
                    gender,
                    born,
                    blood,
                    mbti,
                },
            });}
 //์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ’์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ dispatch๋˜์ง€ ์•Š๊ฒŒ ์กฐ๊ฑด๋ฌธ์„ ๊ฑธ์–ด์คŒ 
 
 return ( 
 		<button type="submit" className="blackBtn" onClick={onClick}> ๋‹ค์Œ์œผ๋กœ
         </button>
     };

๋‹ค์Œ์œผ๋กœ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ ADD_ME_DATA action์ด ๋ฐœ์ƒํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์‹ฃ๋Š” ๋™์ž‘์ด ์ผ์–ด๋‚˜๊ฒŒ ํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๊ณ  ๋นˆ์นธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  redux devTool์„ ํ™•์ธํ•ด๋ณด๋ฉด,  ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”ท์„ฑ๋ณ„ Click โฉ ๋‘˜ ์ค‘ ํ•œ๊ฐœ๋งŒ ํด๋ฆญ ๊ฐ€๋Šฅ

  ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋‹จ, input radio๋ฅผ ํ†ตํ•ด ์„ ํƒ๋ฒ„ํŠผ์„ ์ƒ์„ฑํ•ด ์ค€๋‹ค. name๊ฐ’์— "gener" ๋ผ๊ณ  ์จ์ฃผ๋ฉด ๋‘˜ ์ค‘ ํ•œ๊ฒŒ๋งŒ ์„ ํƒ ๋  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

<label htmlFor="์„ฑ๋ณ„" className="genderTitle"> ์„ฑ๋ณ„ </label>
     <input type="radio" className="radioInput" value="male" name="gener" onChange={(e) => setGender(e.target.value)} />
     <label htmlFor="๋‚จ" className="labelGender">
        <span>๋‚จ</span>
     </label>
     
     <input type="radio" className="radioInput" value="female" name="gener" onChange={(e) => setGender(e.target.value)} />
     <label htmlFor="์—ฌ" className="labelGender">
          <span>์—ฌ</span>
     </label>

 

๐Ÿ”ท ์ธํ’‹์ฐฝ ๊ณต๋ฐฑ โฉ ๋‹ค์ŒํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์—†์Œ / ๐Ÿ”ท ๋‹ค์Œ์œผ๋กœClick โฉ ๋‹ค์ŒํŽ˜์ด์ง€ ์ด๋™(์ •๋ณด์ž…๋ ฅ์‹œ)

 ์œ„์— ์ป๋˜ onClick ์ด๋ฒคํŠธ ํ•จ์ˆ˜์— ๊ธ€์ž์ˆ˜๊ฐ€ 0์ผ๋•Œ alert์ฐฝ์ด ๋œฐ ์ˆ˜ ์žˆ๊ฒŒ ์กฐ๊ฑด๋ฌธ์„ ์ถ”๊ฐ€ํ•ด์คฌ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ์ž๋™์œผ๋กœ ํŽ˜์ด์ง€๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ์•ˆ๋˜๋‹ˆ๊นŒ useNavigateํ•จ์ˆ˜๋ฅผ ์กฐ๊ฑด๋ฌธ ์•ˆ์—์„œ ์‚ฌ์šฉํ•ด์คฌ๋‹ค.

import { useNavigate } from "react-router-dom";
import { useDispatch } from "react-redux";

const MeinputPage = () => {
let navigate = useNavigate();
    const dispatch = useDispatch();

const onClick = () => {

  if (name.length === 0) {
            alert("์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”");
        }
        if (gender.length === 0) {
            alert("์„ฑ๋ณ„์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”");
        }
        if (born.length === 0) {
            alert("์ƒ๋…„์›”์ผ 8์ž๋ฆฌ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”");
        }
        if (blood.length === 0) {
            alert("ํ˜ˆ์•กํ˜•์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”");
        }
        if (mbti.length === 0) {
            alert("mbti๋ฅผ ์„ ํƒํ•ด์ฃผ์„ธ์š”");
        }
        
        if (name.length !== 0 && gender.length !== 0 && born.length !== 0 && blood.length !== 0 && mbti.length !== 0) {
            navigate("/youpage");
            dispatch({
                type: "ADD_ME_DATA",
                payload: {
                    name,
                    gender,
                    born,
                    blood,
                    mbti,
                },
            });}

 

 

๐Ÿ”ท ํ˜ˆ์•กํ˜• & MBTI Click โฉ ๋ชจ๋‹ฌ์ฐฝ์—์„œ ์„ ํƒํ•œ ๊ฐ’์œผ๋กœ ์ž…๋ ฅ(์ง์ ‘์ž…๋ ฅ ๋ถˆ๊ฐ€)

  ๋ชจ๋‹ฌ ์ฐฝ์—์„œ ์„ ํƒ๋œ ๊ฐ’์„ ๋ฐ›์•„์˜ค๋ ค๋ฉด setState๋ฅผ props๋กœ ๋„˜๊ฒจ์ค˜์•ผํ•œ๋‹ค. BloodModal, MbtiModal์ฐฝ์„ ๋ณ„๋„์˜ ์ปดํฌ๋„ŒํŠธ์— ๋”ฐ๋กœ ์ œ์ž‘ํ•œ ๋‹ค์Œ MeinputPage์— ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ true์ผ๋•Œ ๋ชจ๋‹ฌ์ด ๋ณด์ด๊ณ  false์ผ ๋•Œ๋Š” ๋ณด์ด์ง€ ์•Š๊ฒŒ ํ•ด์ค€๋‹ค์Œ, props๋กœ  BloodModal, MbtiModal์— ํ•ด๋‹น ๊ฐ’์„ ๋ฐ›์•„์˜ฌ state, setState๋ฅผ propsํ•ด์ค˜์•ผ ํ•œ๋‹ค. 

๊ทธ๋Ÿผ ๊ฐ ๋ชจ๋‹ฌ์ฐฝ์—์„œ๋Š” ํด๋ฆญ์‹œ setState๋ฅผ ํ†ตํ•ด state๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด ๋œ๋‹ค. 

 

//MeinputPage.jsx

//๋ชจ๋‹ฌ ๊ธฐ๋ณธ๊ฐ’ false๋กœ ์„ค์ •
const [bloodModal, setBloodModal] = useState(false);
const [mbtiModal, setMbtiModal] = useState(false);
    
//1. ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋‹ฌ true/ false ์ผ ๋•Œ ์กฐ๊ฑด ๋งŒ๋“ค์–ด์ฃผ๊ธฐ & propsํ•ด์ฃผ๊ธฐ 
{bloodModal === true ? <BloodModal setBloodModal={setBloodModal} setBlood={setBlood} /> : null}
{mbtiModal === true ? <MbtiModal setMbtiModal={setMbtiModal} setMbti={setMbti} /> : null}

//2. input์ฐฝ ํด๋ฆญ์‹œ ๋ชจ๋‹ฌ์ด ๋‚˜์˜ค๋„๋ก ์„ค์ • & 
     ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ readOnly๋ฅผ ์จ์คŒ(์ด๋ž˜์•ผ ๋ชจ๋‹ฌ๊ฐ’์„ ์ง์ ‘์ž…๋ ฅํ•  ์ˆ˜ ์—†๊ณ  ํด๋ฆญ๊ฐ’๋งŒ ๋“ค์–ด๊ฐ€๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ)
 <input
     type="text"
     placeholder="ํ˜ˆ์•กํ˜•์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
     value={blood}
     onChange={(e) => setBlood(e.target.value)}
     onClick={() => {setBloodModal(!bloodModal);}} readOnly />

  
  <label htmlFor="mbti">MBTI</label>
       <input
          type="text"
          placeholder="MBTI๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
          value={mbti}
          onChange={(e) => setMbti(e.target.value)}
          onClick={() => {setMbtiModal(!mbtiModal);}} readOnly/>

 

ํ•ด๋‹น ํ˜ˆ์•กํ˜•์„ ํด๋ฆญํ•˜๋ฉด props๋กœ ๋ฐ›์•„์˜จ state๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ์ž๋™์œผ๋กœ ์ฐฝ์ด ์ข…๋ฃŒ๋œ ๋’ค ๊ทธ ๊ฐ’์ด ์ธํ’‹์ฐฝ์— ์ž…๋ ฅ๋จ.

//BloodModal.jsx

import React from "react";
import styled from "styled-components";
import { ModalBack } from "./IconModal";

let BloodModal = (props) => {
    const onClick = () => {
        props.setBloodModal(false);
    };
    return (
        <ModalStyle>
            <ModalBack>
                <div className="BloodModal">
                    <div className="bloodTitle">ํ˜ˆ์•กํ˜•</div>
                    <div
                        className="bloodType"
                        id="A"
                        onClick={() => {
                            props.setBlood("A");
                            props.setBloodModal(false);
                        }}
                    >
                        Aํ˜•
                    </div>
                    <div
                        className="bloodType"
                        id="B"
                        onClick={() => {
                            props.setBlood("B");
                            props.setBloodModal(false);
                        }}
                    >
                        Bํ˜•
                    </div>
                    <div
                        className="bloodType"
                        id="O"
                        onClick={() => {
                            props.setBlood("O");
                            props.setBloodModal(false);
                        }}
                    >
                        Oํ˜•
                    </div>
                    <div
                        className="bloodType"
                        id="AB"
                        onClick={() => {
                            props.setBlood("AB");
                            props.setBloodModal(false);
                        }}
                    >
                        ABํ˜•
                    </div>
                </div>
                <div className="modalBack" onClick={onClick}></div>
            </ModalBack>
        </ModalStyle>
    );
};

๐Ÿฅš [๋‚˜์˜ ์ •๋ณด, ์ƒ๋Œ€ ์ •๋ณด] ,  [ํ˜ˆ์•กํ˜• ๋ชจ๋‹ฌ, MBTI ๋ชจ๋‹ฌ]  ๋Š” ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ๋งŒ ์ •๋ฆฌํ•ด๋‘๋ ค๊ณ  ํ•œ๋‹ค.(์ž‘๋™ ๋ฐฉ์‹์ด ์œ ์‚ฌํ•จ)

 

6. ResultPage (๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€)

 

 <๊ธฐ๋Šฅ ๊ตฌํ˜„>

์ž…๋ ฅํ•œ ์ •๋ณด ์กฐํ•ฉํ•œ ์ ์ˆ˜ ๋„์šฐ๊ธฐ 

- ์ž…๋ ฅํ•œ ์ •๋ณด ์กฐํ•ฉํ•œ ๊ฒฐ๊ณผ ๋„์šฐ๊ธฐ 

- ๋‹ค์‹œํ•˜๊ธฐClick โฉ ์•ž์„œ ์ •๋ฆฌํ–ˆ๋˜ useNavigeteํ•จ์ˆ˜ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉ

- ๊ฒฐ๊ณผ๋งํฌ ๊ณต์œ  Click  โฉ mbti(1)ํฌ์ŠคํŒ…์— ์ •๋ฆฌํ•ด๋‘ (CopyToClipboard)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๐Ÿ”ท ์ ์ˆ˜ & ๊ฒฐ๊ณผ ๋„์šฐ๊ธฐ

 

Axios post๋ฅผ ํ•ด์„œ ๋ฐ›์•„์˜จ ๊ฒฐ๊ณผ๊ฐ’์„ ์›ํ•˜๋Š” ์œ„์น˜์— ๋ฟŒ๋ ค์ฃผ๋ฉด ๋˜๋Š”๋ฐ

 

1) redux store์— ์ €์žฅํ–ˆ๋˜ ๊ฐ’์„ useSelector๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๊ธฐ

//ResultPage.jsx

import axios from "axios";

const ResultPage = () => {
    const state = useSelector((state) => state);
}

ํ•ด๋‹น๊ฐ’ ์ฝ˜์†”์ฐฝ์„ ๋„์›Œ๋ณด๋ฉด, ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ๊ฐ€์ง€๊ณ  ์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฐ’์„ API๊ฐ€ ์š”๊ตฌํ•˜๋Š” ํ˜•์‹์— ๋งž์ถฐ์„œ postํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

useEffect์— ๋นˆ๋ฐฐ์—ด์„ ๋„ฃ์–ด์ค˜์„œ ๋ฌดํ•œ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ฃผ๊ณ , ๊ทธ์•ˆ์— axios ์š”์ฒญ์„ ํ•œ๋‹ค. 

๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋‘” state์— ์ €์žฅํ•ด์ค€๋‹ค. ์ด ๋ฐฉ์‹์œผ๋กœ ํ•˜๋ฉด ์–ด์ฉ” ์ˆ˜ ์—†์ด ๊ฐ€์žฅ ์ฒ˜์Œ์— undefined๊ฐ€ ์ฐํžˆ๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด undefined์ผ ๋•Œ๋Š” ํ™”๋ฉด์— ์ถœ๋ ฅํ•  ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ํ™”๋ฉด์— ์ถœ๋ ฅํ•  ๋•Œ ์กฐ๊ฑด๋ฌธ์„ ํ•˜๋‚˜ ์ž‘์„ฑํ•ด์„œ undefined์ด ์•„๋‹ ๋•Œ๋งŒ ๋™์ž‘์ด ์ผ์–ด๋‚˜๊ฒŒ ํ•ด์ค˜์•ผํ•œ๋‹ค. 

const [result, setResult] = useState();
   
useEffect(() => {
        axios
            .post("https:// api์ฃผ์†Œ๋งํฌ", {
                me: state.data.meData[0],
                you: state.data.youData[0],
            })
            .then((res) => {
                setResult(res.data.result);
            })
            .catch((err) => {
                console.log(err);
            }, []);

        return <></>;
    }, []);

 

์ฝ˜์†”์ฐฝ์— ํ•ด๋‹น res ๊ฐ’์„ ๋„์›Œ๋ณด๋ฉด, post๋ฅผ ์„ฑ๊ณตํ•œ ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ œ ์ด ๋ฐ์ดํ„ฐ๋“ค์„ ์›ํ•˜๋Š” ์ž๋ฆฌ์— ๋ฐฐ์น˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์กฐ๊ฑด๋ฌธ ๋งŒ์กฑ์‹œ์—๋งŒ ๋‚ด๋ถ€ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜๋Š” ์กฐ๊ฑด๋ฌธ ์ž‘์„ฑ 

const resultContentsBox = () => {
        if (result !== undefined) {
        
        return(
        //์ถœ๋ ฅํ•  ๋‚ด์šฉ๋“ค ์ž‘์„ฑ)
        }

์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๊ณ  ResultPage return ๊ฐ’์— ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

return (
        <>
            <ResultStyle>{resultContentsBox()}</ResultStyle>
        </>
    );

 

๐Ÿšฉ ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ์ž‘์„ฑํ•œ ์ตœ์ข…์ฝ”๋“œ ๐Ÿ”ฝ

https://github.com/codnjs779/chemistry-test.git

 

GitHub - codnjs779/chemistry-test

Contribute to codnjs779/chemistry-test development by creating an account on GitHub.

github.com