Learning React(3.Reactプロパティの転送)

43702 ワード

1.転送属性

  • の階層では、構成部品間の属性の伝達は簡単で問題ありませんが、複数の階層にわたって構成部品間で属性を伝達する必要がある場合は、難易度が高くなります.
  • この方法は拡張性もメンテナンスも容易ではありません
    渡す属性を追加または削除するたびに、各構成部品の宣言にコード
  • を追加または削除する必要があります.
  • と、ある時点で属性の名前を変更する必要がある場合、すべてのコンポーネントに属性名を変更する手間がかかります.
  • 01.問題分析

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>React!</title>
      <!-- 리액트 라이브러리와 리액트가 DOM에 대한 작업할 때 필요한 다양한 기능을 추가 -->
      <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
      <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
      <!-- 바벨, 자바스크립트 컴파일러의 참조 -->
      <script src="https://unpkg.com/[email protected]/babel.min.js"></script>
      <style>
        #container {
          padding: 50px;
          background-color: #EEE;
        }
      </style>
    </head>
    
    <body>
      <div id="container"></div>
    
      <script type="text/babel">
        var destination = document.querySelector("#container");
    
        class Display extends React.Component {
          render() {
            return (
              <div>
                <p>{this.props.color}</p>
                <p>{this.props.num}</p>
                <p>{this.props.size}</p>
              </div>
            )
          }
        }
    
        class Label extends React.Component {
          render() {
            return (
              <Display
                color={this.props.color}
                num={this.props.num}
                size={this.props.size}
              />
            )
          }
        }
    
        class Shirt extends React.Component {
          render() {
            return (
              <div>
                <Label
                  color={this.props.color}
                  num={this.props.num}
                  size={this.props.size}
                />
              </div>
            )
          }
        }
        
        ReactDOM.render(
          <div>
            <Shirt color="steelblue" num="3.14" size="medium" />
          </div>,
          destination
        );
      </script>
    </body>
    
    </html>


    02.スプレッドシート演算子(展開演算子)との面会

  • ...前面使用
  • -1.スプレッドシート演算子の例

  • は、アレイ内の個々の要素を外部に放出する役割を果たす
  • である.
    <script>
        var items = ["1", "2", "3"];
    
        function printArray(a, b, c) {
          console.log("print : " + a + " " + b + " " + c);
        }
    
        printArray(items[0], items[1], items[2]);
    
        // spread operator
        printArray(...items);
    </script>

    -2.スプレッドシート演算子の使用

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>React!</title>
      <!-- 리액트 라이브러리와 리액트가 DOM에 대한 작업할 때 필요한 다양한 기능을 추가 -->
      <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
      <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
      <!-- 바벨, 자바스크립트 컴파일러의 참조 -->
      <script src="https://unpkg.com/[email protected]/babel.min.js"></script>
      <style>
        #container {
          padding: 50px;
          background-color: #EEE;
        }
      </style>
    </head>
    
    <body>
      <div id="container"></div>
    
      <script type="text/babel">
        var destination = document.querySelector("#container");
    
        class Display extends React.Component {
          render() {
            return (
              <div>
                <p>{this.props.color}</p>
                <p>{this.props.num}</p>
                <p>{this.props.size}</p>
              </div>
            )
          }
        }
    
        class Label extends React.Component {
          render() {
            return (
              <Display {...this.props} />
            )
          }
        }
    
        class Shirt extends React.Component {
          render() {
            
            return (
              
              <div>
                <Label {...this.props} />
              </div>
            )
          }
        }
        
        ReactDOM.render(
          <div>
            <Shirt color="steelblue" num="3.14" size="medium" />
          </div>,
          destination
        );
      </script>
    </body>
    
    </html>


    2.JSXと再会


    01.JSXプロファイル

  • JSXを純JavaScript
  • に変換

    -1. JSX

    class Card extends React.Component {
    	render() {
    		var cardStyle = {
    		height : 200,
    		width : 150,
    		padding : 0,
    		margin : 10,
    		display : "inline-block",
    		backgroundColor : "#FFF",
    		boxShadow : "0px 0px 5px #666"
    		};
    
    	return (
    		<div style={cardStyle}>
    			<Square color={this.props.color} />
    			<Label color={this.props.color} />
    		</div>
    		)
    	}
    }

    -2. JavaScript

    class Card extends React.Component {
    	render() {
        	var cardStyle = {
            	height : 200
                , width : 150
                , padding : 0
                , backgroundColor : "#FFF"
                , boxShadow : "0px 0px 5px #666"
            };
            
            return React.createElement(
            	"div"
                , { style : cardStyle }
                , React.createElement(Square, { color : this.props.color })
                , React.createElement(Label, { color : this.props.color })
            );
        }
    }

    02.重要なJSX特徴


    -1.式評価

  • JSXはJavaScriptとみなされます.つまり、JSXは以下のコードの静的コンテンツに制限されません.
  • {}は、括弧を用いる複数の表現法
  • を出力することができる.
    class Stuff extends React.Component {
    	render() {
    		return(
    			<h1>Boring static content!</h1>
    		)
    	}
    }
    
    class Stuff extends React.Component {
    	render() {
    		return(
    			<h1>Boring {Math.random() * 100} content!</h1>
    		)
    	}
    }

    -2、復讐のアリマン・トリトン


    1.類似配列を使用する構文

  • には、複数のアイテムを返すことができる事項があります.これは、各アイテムにキー属性と固有値を指定することです.
  • キーを指定することで、どの領域を使用すべきか、変更が発生したかをよりよく理解できます.
  • class Stuff extends React.Component {
    	render() {
    		return(
    			[
    			<p key="1">I am</p>,
    			<p key="2">returning a list</p>,
    			<p key="3">of thing!</p>
    			]
    		)
    	}
    }

    2.計画(Fragments)

  • react v16.2.0から追加されたパターン
  • 1. React.分割コンポーネントは実際にはDOM要素として生成されるものではなく,JSXがHTMLに変換する際に存在しないものと見なすことを伝える.
  • 2. これらのアイテムはアレイで返されないため、カンマや他の区切り文字は必要ありません.
  • 3. key属性とcout値を指定する必要はなく、それに関連するすべての事項は物理ユニットによって管理される
  • .
    class Stuff extends React.Component {
    	render() {
    		return(
    			<React.Fragment>
    				<p key="1">I am</p>,
    				<p key="2">returning a list</p>,
    				<p key="3">of thing!</p>
    			</React.Fragment>
    		)
    	}
    }
  • の代わりに<>を使用
    class Stuff extends React.Component {
    	render() {
    		return(
    			<>
    				<p key="1">I am</p>,
    				<p key="2">returning a list</p>,
    				<p key="3">of thing!</p>
    			</>
    		)
    	}
    }

    -3.インラインCSSは使用できません

  • JSXでは、スタイル属性にCSSを直接含めることはできません.スタイル情報を含むオブジェクトは、次のコードを参照してください.
  • -キャメルマーキング法の代わりに属性を指定する
  • class Card extends React.Component {
    	render() {
    		var cardStyle = {
    			height : 200,
    			width : 150,
    			padding : 0,
    			margin : 10,
    			display : "inline-block",
    			backgroundColor : "#FFF",
    			boxShadow : "0px 0px 5px #666"
    		};
    
    		return (
    		<div style={cardStyle}>
    			<Square color={this.props.color} />
    			<Label color={this.props.color} />
    		</div>
    		)
    	}
    }

    -4.コメント

  • 注釈はJSに類似するものを除き、そのうちの1つはタグのサブ位置に注釈を追加する場合、以下に示すように、注釈を式として解釈するには、括弧で囲まなければならない.
    class Stuff extends React.Component {
    	render() {
    		return(
    		<div>
    			{/* 자식으로서의 주석*/}
    		</div>
    		)
    	}
    }

    -5.大文字と小文字の区別

  • HTMLタグを表示する場合は小文字で
  • を記入する.
    class Stuff extends React.Component {
    	render() {
    		return(
    		<div>
    			<p>HTML TAG</p>
    		</div>
    		)
    	}
    }
  • 構成部品が表示された場合、その名前は大文字でなければなりません.
    class Stuff extends React.Component {
    	render() {
    		return(
    		<div>
    			<Letter/>
    		</div>
    		)
    	}
    }

    03.随所に見られるJSX


    これまでJSXコードはrenderまたはreturn関数のみであったが,
  • というケースもあった.
    var swatchComponent = <Swatch color="#2F004F"></Swatch>
    
    ReactDOM.render(
    	<div>
    		{swatchComponent}
    	</div>
    	, document.querySelector("#container")
    )