이글은 단순히 제가 격은 이슈를 해결하는 과정을 적은 글입니다. 올바른 방법이 아닐 수도 있습니다.

 

 

d3 chart를 사용하려고 했다가, npm build가 안되는 상태 발생..

여러가지 찾다보니, 

"react": "^17.0.2",   // 17버전에서 해당 라이브러리가 지원이 안되는 것 같았음. 그래서 17을 16으로 바꾸고 빌드하니 됨.

 

로컬로 서버를 실행하니 restapi로 데이터를 못가져오고 여러가지 에러가 발생함

 

생각나는 것은 <></> 이게 react 17부터 지원되는거 같음.

또 찾아보니 axio 라이브러리에서 오류가 발생 하는 것 같음.

 

axio 사용한 소스의 차이점은 async / await  와 주소를 풀경로로 쓴것과 안쓴것 차이.

확실한건 http-proxy-middleware 패키지를 사용해서 경로를 생략했는데 이게 안먹히는 것 같음.

 

 

 

기존에 사용하던 소스 


function FuncLaboratory() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);
  useEffect(() => {
      const fetchData = async () => {
          try {
              setError(null);
              setUsers(null);
              setLoading(true);
              const response = await axios.get(
                  '/api/***/'
              );
              setData(response.data);
          } catch (e) {
              setError(e);
          }
          setLoading(false);
      };

      fetchData();
  }, []);

  if (loading) return <div>로딩중..</div>;
  if (error) return <div>에러가 발생했습니다</div>;
  if (!data) return null;
 
  return (
      <div>
              <MyLabTable dataSource={data}/>
          </div>            
      </div>
  );
}

 

변경한 소스

function FuncLaboratory() {
  
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);

  useEffect(() => {
    setError(null);
    setData(null);
    setLoading(true);

    axios.get('http://localhost:8888/api/***/'
    ).then(res => {
      setData(res.data);
    }).catch(e => {
      console.log((error));
      setError(e);
    });
    setLoading(false);
  }, []);
  
  if (loading) return <div>로딩중..</div>;
  if (error) return <div>에러가 발생했습니다</div>;
  if (!data) return null;

  return (
      <div>
              <MyLabTable dataSource={data}/>
      </div>
  );
}

앞서 주의사항!

 - 저도 공부하는 중이라 이해도가 낮아 설명에 있어서 부족한 부분이 있을 수 있습니다.

 - 하지만 도움이 되실 분도 있으리라 생각합니다.

 

SELECT 만들어볼 것

 - App.js

  + src

    +--- App.js

 

프로젝트를 생성하고 vs code실행

> npx create-react-app test

> cd test

> code .

 

소스코드

import logo from './logo.svg';
import './App.css';
import * as React from "react";


function App() {
  // 데이타를 준비
  const lookup =
    [
      { id: '1', query: '001', text: '조건검색1-1' },
      { id: '2', query: '001', text: '조건검색1-2' },
      { id: '3', query: '001', text: '조건검색2-1' },
      { id: '4', query: '002', text: '조건검색2-2' },
      { id: '5', query: '002', text: '조건검색2-3' }
    ];

  // state 사용
  const [selected, setSelected] = React.useState("");

  // 셀렉트 컴포넌트가 변경될때 불려짐
  const changeSelectOptionHandler = (event) => {
    setSelected(event.target.value);
  };

  // 선택된 아이템에 따라 값을 비교하고 데이타를 리턴
  var inquiries = lookup.filter(data => {
    if (selected === "001" && data.query.toLocaleLowerCase() === "001") {
      return data;
    } else if (selected === "002" && data.query.toLowerCase() === "002") {
      return data;
    }
  })

  return (
    <div
      style={{
        padding: "16px",
        margin: "16px",
      }}
    >
      <div>
        {/** onChange 될때 changeSelectOptionHandler 함수가 불려지도록 바인드
           */}
        <select onChange={changeSelectOptionHandler}>
          <option value="001">조건검색1</option>
          <option value="002">조건검색2</option>
        </select>
      </div>
      <div>
        {/** inquiries의 모든 텍스트를 출력
           */}
        {inquiries.map(inquiry => (
          <h3 >{inquiry.text}</h3>
        ))}
      </div>
    </div>
  );
}

export default App;

실행

> npm run start

 

결과화면



class App extends Component {

  componentDidMount() {
    document.title = "VoCoin";
  }

}

 

또는

public 폴더 아래에 index.html 직접 수정

 

<title>VoCoin</title>

<Menu.Item key="1">

<Link to="/" onClick={this.menuClick("Home")}/>

<span>Home</span>

</Menu.Item>

 

onclick 함수 사용시 다음과 같은 에러를 만날때.

 

Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops

 

# 인자가 있는 경우에

 

<Link to="/" onClick={() => this.menuClick("Home")}/>

 

# 인자를 사용하지 않는 경우

 

<Link to="/" onClick={this.menuClick}/>

+ Recent posts