카테고리 없음
React component props (Cannot assign to read only property 'prototype' of function )
Canyi
2022. 11. 10. 15:14
App.js
import './App.css';
import React, {} from 'react';
import MyComponent from './myComponent';
function App(){
return(
<>
<MyComponent name = "리엑트"/>
</>
)
}
export default App;
myComPonent.js
function MyComponent() {
return (
<div>나의 component</div>
);
}
export default MyComponent;
결과

myComponent.js (화살표 함수로 변경 및 props 전달)
//화살표 함수
const MyComponent = (props) => {
return (
<div>
{props.name}<br/>
{props.children}
</div>
);
}
export default MyComponent;
console.log를 확인해 보면 props가 Object로 들어가있고 name에 App.js의 '리엑트' , JS값이 들어가있다.

App.js
import './App.css';
import React, {} from 'react';
import MyComponent from './myComponent';
//JSX
function App(){
return(
<>
<MyComponent name = "리엑트">JS</MyComponent>
</>
)
}
export default App;

만약 props에 값이 들어가 있지 않는다. 그러면 아무값도 나오지 않기 때문에
defaultProps 기능 사용 (myComponent.js)
import PropTypes from 'prop-types';
MyComponent.defaultProps = {
name : "prop에 값이 비어 있습니다.",
}
App.js (MyComponent에 아무값도 넣지 않)
import './App.css';
import React, {} from 'react';
import MyComponent from './myComponent';
//JSX
function App(){
return(
<>
<MyComponent/>
</>
)
}
export default App;

App.js에서 name에서 숫자를 넣을 경우
PropTypes.string 으로 강제로 Type Casting에러 발생하게 하기
일단 myComponent.js에 있는 화살표 함수를 class형식으로 변경하기 (기존에 있는 코드는 주석)
먼저 PropTypes 를 import를 한다.
import PropTypes from 'prop-types';
그리고 class형식으로 마이그레이션
class MyComponent extends Component{
render(){
const {name,children} = this.props;
console.log({name, children});
return (
<div>
{name}<br/>
{children}
</div>
);
}
}
PropTypes String 추가
//propTypes
MyComponent.prototype = {
//name: PropTypes.string,
name : PropTypes.string
};
App.js에서 함수로 App 호출
import MyComponent from './myComponent';
function App(){
return(
<>
<MyComponent name = {10}>JS</MyComponent>
</>
)
}

prototype를 읽지 못한다는 에러가 뜸....
prototype이 아니라 propTypes 임.... (자동완성을 하면 propTypes 이 대문자로 나와서 이부분 주의하자.... )
//propTypes
MyComponent.propTypes = {
//name: PropTypes.string,
name : PropTypes.string
};
실행을 해보면 type 캐스팅 오 뜸

App.js에 있는 MyCompnent를 String값으로 변경 ... 실행이 잘됨
function App(){
return(
<>
<MyComponent name = {10}>JS</MyComponent>
</>
)
}
잔체코드
myComponent.js
import PropTypes from 'prop-types';
import React, {Component} from 'react';
// function MyComponent() {
// return (
// <div>나의 component</div>
// );
// }
//화살표 함수
// const MyComponent = ({name, children}) => {
// //const {name, children} = props;
// //console.log(props);
// return (
// <div>
// {name}<br/>
// {children}
// </div>
// );
// }
class MyComponent extends Component{
render(){
const {name,children} = this.props;
//console.log({name, children});
return (
<div>
{name}<br/>
{children}
</div>
);
}
}
//defaultProps
MyComponent.defaultProps = {
name : "prop에 값이 비어 있습니다.",
};
//propTypes
MyComponent.propTypes = {
//name: PropTypes.string,
name : PropTypes.string
};
export default MyComponent;
App.js
import './App.css';
import MyComponent from './myComponent';
function App(){
//const name = "리액트";
return(
<>
<MyComponent/>
{/* <MyComponent name = "리엑트">JS</MyComponent> */}
{/* <MyComponent name = {10}>JS</MyComponent> */}
</>
)
}
export default App;