[KDT]FCFE-7週4日対応
20650 ワード
React
Hooks
hooksの前に
構成部品の内部にステータスがある場合?class
構成部品の内部にステータスがない場合?
class component
import React from 'react';
class ClassComponent extends React.Component {
render(){
return (<div>Hello</div>);
}
}
ReactDOM.render(
<ClassComponent/>,
document.querySelector('#root')
)
function component
import React from 'react';
function FunctionComponent () {
return (<div>Hello</div>);
}
ReactDOM.render(
<FunctionComponent/>,
document.querySelector('#root')
)
const FunctionComponent = () => <div>Hello</div>;
ReactDOM.render(
<FunctionComponent/>,
document.querySelector('#root')
)
createElement
最初のパラメータtype(タグ名文字列、反応素子、react.fragment)
2番目のパラメータ
[props]
(反応素子に配置されたデータオブジェクト)3番目のパラメータ
[...children]
(サブエレメントとして加えられたエレメント)// 1. 태그이름 문자열 type
ReactDOM.render(
React.createElement('h1', null, 'type 이 " 태그 이름 문자열 " 입니다. ' ),
document.querySelector("#root")
)
// 2. 리액트 컴포넌트 type
const Component = () => {
return React.createElement('p', null, `type이 "React 컴포넌트" 입니다.`)
}
ReactDOM.render(
React.createElement(Component, null, null),
document.querySelector("#root")
)
// 3. React.Fragment ( tag 없이 넣기 )
ReactDOM.render(
React.createElement(React.Fragment, null, `type이 "React Fragment" 입니다.`),
document.querySelector("#root")
)
// 4. 복잡한 리액트 엘리먼트 모임
ReactDOM.render(
React.createElement(
'div',
null,
React.createElement(
'div',
null,
React.createElement(
'h1',
null,
'주제'
),
React.createElement(
'ul',
null,
React.createElement(
'li',
null,
'React'
),
React.createElement(
'li',
null,
'Vue'
),
),
)
),
document.querySelector("#root")
)
JSX
読みやすさがよい
構文エラーの認識が容易
構文
最上位要素は1つでなければなりません.
トップレベルの要素を返す場合は、()でラップする必要があります.
子供たちをすぐに上陸させたいなら、
<>자식들</>
=>Fragmentを使ってもいいです.JavaScript式を使用するには、{式}を使用します.(${})
ドアが使えない場合.(3つの演算子または&&を使用)
styleを使用して埋め込み造形を行うことができます.
classではなくclassNameを使用してclassを適用できます.
サブエレメント、必須、サブエレメントなし、オン、オフ(
<br/>
)PropsとState
:Propsは、構成部品の外部から供給されるデータです.
:Stateは、構成部品内部で変更可能なデータです.
両方が変化すれば、ランダーが再び発生する可能性があります.
Render関数は、PropsとStateに基づいて構成部品を描画します.
PropsとStateが変更されると、構成部品が再描画されます.
構成部品の描画方法を説明する関数はランダー関数です.
Props
function Component(props){
return (
<div>
<h1>{props.message} 이것은 함수로 만든 컴포넌트 입니다.</h1>
</div>
)
}
ReactDOM.render(
<Component message="안녕하세요!!!"/>,
document.querySelector("#root")
)
class Component extends React.Component {
render(){
return (
<div>
<h1>{this.props.message} 이것은 클래스로 만든 컴포넌트 입니다.</h1>
</div>
)
}
}
ReactDOM.render(
<Component message="안녕하세요!!!"/>,
document.querySelector("#root")
)
function Component(props){
return (
<div>
<h1>{props.message} 이것은 함수로 만든 컴포넌트 입니다.</h1>
</div>
)
}
Component.defaultProps = {
message: "기본값",
};
ReactDOM.render(
<Component message="안녕하세요!!!"/>,
document.querySelector("#root")
)
class Component extends React.Component {
render(){
return (
<div>
<h1>{this.props.message} 이것은 클래스로 만든 컴포넌트 입니다.</h1>
</div>
)
}
}
Component.defaultProps = {
message: "기본값",
};
ReactDOM.render(
<Component/>,
document.querySelector("#root")
)
class Component extends React.Component {
render(){
return (
<div>
<h1>{this.props.message} 이것은 클래스로 만든 컴포넌트 입니다.</h1>
</div>
)
}
static defaultProps = {
message: "기본값2",
}
}
ReactDOM.render(
<Component/>,
document.querySelector("#root")
)
state
classではstateは常にオブジェクトのシェイプです
ステータス変更はsetState()で行います.
class Component extends React.Component {
// state = {
// count:0,
// };
constructor(props){
super(props);
this.state={count:0}
}
render(){
return (
<div>
<h1>{this.props.message} 이것은 클래스로 만든 컴포넌트 입니다.</h1>
<p>{this.state.count}</p>
</div>
)
}
componentDidMount(){
setTimeout(()=>{
this.setState(
// {
// count: this.state.count +1
// }
(previousState)=>{
const newState= {count: previousState.count +1}
return newState;
}
)
}, 1000
)
}
static defaultProps = {
message: "기본값2",
}
}
ReactDOM.render(
<Component/>,
document.querySelector("#root")
)
babel
:複数のバージョンでECMAScriptを使用できるコンパイラ
<div>Hello</div>
vコンパイル!React.createElemnet("div", null, "Hello");
Event Handling
HTML DOMでクリックイベントが発生した場合、対応する変更を行います.
JSXでイベントを設定できます.
CamelCaseとしてのみ使用できます.(onClick, onMouseEnter)
イベントに接続されているJavaScriptコードは関数です.(event={関数}とともに使用します.)
実際のDOM要素にのみ適用されます.(反応素子に使用される場合、propsに直接伝達される.)
関数の使用
function Component(props){
return (
<div>
<button onClick={()=>{console.log("click!!")}}>클릭!</button>
</div>
)
}
ReactDOM.render(
<Component/>,
document.querySelector("#root")
)
クラスの操作
class Component extends React.Component {
state = {
count: 0,
};
render(){
return (
<div>
<p>{this.state.count}</p>
<button
onClick={() => {
console.log("click!!");
this.setState((state) => {
console.log(state);
return {
...state,
count: state.count + 1,
};
});
}}
>
클릭!
</button>
</div>
);
}
click(){
console.log("click!!")
this.setState((state)=>({...state, count: state.count +1,}))
}
}
ReactDOM.render(
<Component/>,
document.querySelector("#root")
)
class Component extends React.Component {
state = {
count: 0,
};
constructor(props){
super(props);
this.click = this.click.bind(this);
}
render(){
return (
<div>
<p>{this.state.count}</p>
<button onClick={this.click}>클릭!</button>
</div>
)
}
click(){
console.log("click!!")
this.setState((state)=>({...state, count: state.count +1,}))
}
}
ReactDOM.render(
<Component/>,
document.querySelector("#root")
)
Component Lifecycle
:反応素子は開発者が誕生から死亡までの複数の場所で方法をカバーすることができる.
Declarative(宣言)
ライフサイクルの各場所で宣言する方法を使用します.
v16.3以前のライフサイクル
初期化:コンストラクション関数を呼び出します.(props、stateを設定します.)
「前」(ComponentWillMount)と「後」(ComponentDidMount)でrenderに基づいて宣言します.
upmentsはprops、statesの変更時に再ログインしたときに発表されます.
propsとstatesの違いはComponentWillReciptionPropsの存在です.
shouldComponentUpdateで渡されるboolean値が重要です.(不要なレンダリングを防ぐ-パフォーマンスの限界)
最初に現れるときはmountと呼ばれます.
componentWillReceiveProps
新しくpropsを指定するとすぐに呼び出されます.
stateの変更には反応しませんでした.
propsの値に基づいてstateを変更する必要がある場合はsetStateを使用してstateを変更します.
(次のイベントに移動するたびにではなく、一度に変更します.)
shouldComponentUpdate
(true面renderとfalse面renderは呼び出されません.)
コンポーネントライフサイクルの変更
mount
updation
コンポーネントエラーキャッシュ
componentDidCatch(error, info){this.setState({hasError: true});}
ErrorBoundary(上部から包囲)
自分の間違いに気づかない.
class App extends React.Component {
state = {
hasError : false,
};
render(){
if(this.state.hasError){
return <div>예상치 못한 에러가 발생했다.</div>;
}
return <WebService/>;
}
componentDidCatch(error, info){
this.setState({ hasError: true});
}
}
ReactDOM.render(<App name="Mark"/>, document.querySelector('#root'));
Reference
この問題について([KDT]FCFE-7週4日対応), 我々は、より多くの情報をここで見つけました https://velog.io/@leedocs/KDTFCFE-7주4일-React-Hooksテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol