TIL react 02(アセンブリとアウトライン)
コンポーネントとProps
概念的に、コンポーネントはJavaScript関数に似ています.
propsという入力を受信すると、
反応ユニットに戻ります.
構成部品を定義する最も簡単な方法はJavaScript関数を記述することです.
function Welcome(props) {
return <h1> Hello, {props.name}</h1>;
}
構成部品の名前は常に大文字で始まる.この関数は、データを含む
props
オブジェクトパラメータを受信する.反応素子を戻すので、有効な反応素子です.
これらの素子はJavaScript関数であるため,その名の通り関数素子である.
さらに、
class
を使用して構成要素を定義することもできる.class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>
}
}
上記2つの構成部品は同じ構成部品です.ここで重要なのは、反応器がクラス素子の
render()
方法を自動的に実行することである.classを使用してコンポーネントを作成するには、いくつかの追加機能を使用します.
これについてはstateの処理時に詳しく説明します.
レンダー構成部品
反応素子は、ユーザ定義の素子としても表すことができる.
const element = <Welcome name="Sara" />
ユーザ定義の構成部品で作成されたエンティティが見つかった場合、JSX言語ツリーとサブアイテムを単一のオブジェクトとしてコンポーネントに渡します.
このオブジェクトは
props
と呼ばれます.function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
const element = <Welcome name="Sara" />;
ReactDOM.render(
element,
document.getElementById('root')
);
上記のコードをレンダリングすると、次のことが起こります.<Welcome name="Sara" />
エリメントロ コールReactDOM.render()
.{name: 'Sara'}
を道具に、 Welcome
構成部品を呼び出します.Welcome
結果は構成部品 <h1>Hello, Sara</h1>
ライセンスを返却します.<h1>Hello, Sara</h1>
DOMを効果的に更新して要素を一致させる.Fragments
1つの構成部品に複数の構成部品を戻す方法.
class Table extends React.Component {
render() {
return (
<table>
<tr>
<Columns />
</tr>
</table>
);
}
}
class Columns extends React.Component {
render() {
return (
<div>
<td>Hello</td>
<td>World</td>
</div>
);
}
}
このような素子があると仮定する私が望む出力結果は次のとおりです.
<table>
<tr>
<td>Hello</td>
<td>World</td>
</tr>
</table>
実際には以下のように出力されます.<table>
<tr>
<div>
<td>Hello</td>
<td>World</td>
</div>
</tr>
</table>
このようにした原因は以下の通りです.構成部品は1つの最上位セグメントのみを返さなければなりません.
そのため、
Columns
もdiv
のラベルで子供たちを保護した.Fragements
は、これらの問題を解決するために生じたものである.class Columns extends React.Component {
render() {
return (
<React.Fragment>
<td>Hello</td>
<td>World</td>
</React.Fragment>
);
}
}
Columns
がこのように記述されると、複数のユニットを出力するようにします.
このように書くときの出力結果は、私が望んでいる出力結果になります.
<table>
<tr>
<td>Hello</td>
<td>World</td>
</tr>
</table>
Fragment
をより簡潔に書く方法があります.class Columns extends React.Component {
render() {
return (
<>
<td>Hello</td>
<td>World</td>
</>
);
}
}
ただし、fragmentにキーがある場合は、構文で明確に宣言する必要があります.function Glossary(props) {
return (
<dl>
{props.items.map(item => (
// React는 `key`가 없으면 key warning을 발생합니다.
<React.Fragment key={item.id}>
<dt>{item.term}</dt>
<dd>{item.description}</dd>
</React.Fragment>
))}
</dl>
);
}
条件付きレンダリング
応答では、条件レンダリングはJavaScriptで条件文を使用するのと同じです.
次の2つの構成部品があるとします.
function UserGreeting(props) {
return <h1>Welcome back!</h1>;
}
function GuestGreeting(props) {
return <h1>Please sign up.</h1>;
}
上記の構成部品を条件付きでレンダリングするには下図のように記入すればいいです.
function Greeting(props) {
const isLoggedIn = props.isLoggedIn;
if (isLoggedIn) {
return <UserGreeting />;
}
return <GuestGreeting />;
}
ReactDOM.render(
// Try changing to isLoggedIn={true}:
<Greeting isLoggedIn={false} />,
document.getElementById('root')
);
if-else文を使用する必要がある場合は、3つの演算子を使用する必要があります.render() {
const isLoggedIn = this.state.isLoggedIn;
return (
<div>
The user is <b>{isLoggedIn ? 'currently' : 'not'}</b> logged in.
</div>
);
}
読みやすさは悪いが、より大きな式にも使用できる.render() {
const isLoggedIn = this.state.isLoggedIn;
return (
<div>
{isLoggedIn
? <LogoutButton onClick={this.handleLogoutClick} />
: <LoginButton onClick={this.handleLoginClick} />
}
</div>
);
}
次の例では、エラーの条件付きレンダリングを作成します.const tweet = <Tweet writer="Pangho">
{
if (nowLearning) {
return 'React'
} else {
return 'Videogame'
}
}is Awesome!
</Tweet>
下図のように修正可能です.function React(props) {
return <div>React</div>
}
function Videogame(porps) {
return <div>Videogame</div>
}
function Tweet(props) {
const user = props.writer;
return (
<div> {user}: {nowLearning ? <React /> : <Videogame />}is Awesome!</div>
)
}
このように記述すると、条件付きレンダリングになります.Props
関数構成部品またはクラス構成部品は、構成部品自体のpropsを変更できません.
関数は、入力値を変更せずに常に同じ入力値の同じ結果を返します.
純関数と呼ぶ.
反応器はこれらの純粋な関数規則を厳格に守らなければならないからだ.
反応素子は,自分のpropsを操作する際には,純粋な関数のように操作しなければならない.
(同じ入力値については、入力値を変更せずに同じ結果を返します.)
リストとキー
構成部品でリストをレンダリングする方法について
まず、JavaScriptは
map()
関数を使用します.リストを変換する方法を知っています.
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map((number) => number * 2);
console.log(doubled);
上記の例は、JavaScriptで使用されるmap()
例である.numbers
配列の値を2倍にし、doubled
変数に新しい配列を割り当てます.ログのコードを確認します.
反応においても,アクセサリーリストに配列する方式はほぼ同じである.
Ellimentアクセントを作成し、カッコを使用してJSXに含めることができます.
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
<li>{number}</li>
)
配列のmap()
法と同様に,パラメータとしてコールバック関数に入る値は同じである.こうして作られたアクセサリーは
listItems
に保存されている.これをDOMにレンダリングすればいいです
ReactDOM.render(
<ul>{listItems}</ul>
document.getElementById('root')
);
上記の例では、1~5の数字からなるリストを示します.これを素子にすると、次のようにできます.
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
<li>{number}</li>
);
return (
<ul>{listItems}</ul>
)
}
const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
<NumberList numbers={numbers} />
document.getElementById('root')
);
問題は、ここでコードを実行すると、リスト内の各項目に鍵を追加する必要があるという警告が表示されます.keyは、別名リストを作成する際に含める必要がある特殊な文字列属性です.
これらの警告を除去するには、まずlistItemsにkeyを割り当てる必要があります.
const listItems = numbers.map((number) =>
<li key={number.toString()}>{number}</li>
);
keyは、反応器がどの項目を変更、追加、または削除するかを決定するのに役立ちます.装飾に安定した固有性を与え、内部に並ぶ装飾に指定する.
キーを指定する最善の方法は、アイテムを一意に識別可能な文字列に指定することです.
ほとんどの場合、データのidは鍵として使用されます.
データにidがない場合は、インデックスを鍵として使用します.
DOMノードのサブノードを再帰的に処理する場合、応答はデフォルトで
同時に2つのリストを巡回して、違いがあれば変更します.
キーがない場合、2つのリストは同じなので、違いは見つかりません.
あなたが望むようにリストを変更することはできません.
逆に、キーがある場合は、2つのリストのキー値を比較し、違いを探して変更します.
そういう理由で、必ず鍵が必要です.なぜkeyが必要なの?
Reference
この問題について(TIL react 02(アセンブリとアウトライン)), 我々は、より多くの情報をここで見つけました https://velog.io/@pangho/TIL-React02-Component와-Propsテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol