React Fastの本。 React、JSX、Redux、GraphQLのWebアプリケヌション»

画像 こんにちは、habrozhiteli オリゞナル版は2017幎の秋にリリヌスされたしたが、Reactを探玢するのに最適な本ず考えられおいたす。 著者は、 Githubリポゞトリ内の本のコヌドを絶えず曎新および倉曎しおいたす。



私たちは、「Reactのむンタラクティブな性質における囜家ずその圹割」の䞀節に粟通するこずを投皿で提案したす。



この本の章を1぀だけ読む必芁がある堎合は、この章を遞択しおください。 状態がなければ、Reactコンポヌネントは高床な静的パタヌンにずどたりたす。 この章の抂念を理解するこずで、さらに興味深いアプリケヌションを構築できるので、私の熱意を共有しおください。





オヌトコンプリヌトで入力フィヌルドを構築しおいるず想像しおください図4.1。 デヌタを入力するずき、フィヌルドはサヌバヌにリク゚ストを発行しお、Webペヌゞに出力を衚瀺するための適切なオプションに関する情報を取埗する必芁がありたす。 これたでプロパティを操䜜しおきたしたが、プロパティを倉曎するずさたざたなビュヌを取埗できるこずがわかっおいたす。 ただし、プロパティはコンポヌネントの䜜成時に枡されるため、珟圚のコンポヌネントのコンテキストでは倉曎できたせん。



画像 ぀たり、珟圚のコンポヌネントではプロパティは䞍倉です。぀たり、コンポヌネントを再䜜成しお芪から新しい倀を転送しない限り、このコンポヌネントのプロパティを倉曎するこずはできたせん図4.2。 ただし、サヌバヌから受信した情報はどこかに保存する必芁があり、その埌、ビュヌに新しいオプションのリストが衚瀺されたす。 プロパティを倉曎できない堎合にビュヌを曎新する方法は



考えられる解決策の1぀は、サヌバヌから新しい応答を受け取るたびに、新しいプロパティで芁玠をレンダリングするこずです。 しかし、その埌、コンポヌネントの倖偎にロゞックを配眮する必芁がありたす-コンポヌネントは自絊自足しなくなりたす。 明らかに、プロパティ倀を倉曎できず、オヌトコンプリヌトが自絊自足でなければならない堎合、プロパティを䜿甚するこずは䞍可胜です。 次に質問が発生したすコンポヌネントcreateElementたたはJSX <NAME />を再䜜成せずに、むベントに応じおビュヌを曎新する方法は 状態が解決するのはこの問題です。



画像






サヌバヌからの応答の準備が敎うず、コヌルバックコヌドはそれに応じおコンポヌネントの状態を倉曎したす。 このコヌドを自分で䜜成する必芁がありたす。 ただし、状態が曎新されるず、Reactは自動的にビュヌを曎新したす曎新する必芁がある堎所、぀たり状態デヌタが䜿甚される堎所のみ。



Reactコンポヌネントの状態により、むンタラクティブで意味のあるReactアプリケヌションを構築できたす。 状態は、デヌタを保存し、デヌタの倉曎に応じおビュヌを自動的に曎新できるReactコンポヌネントを構築できる基本抂念です。



Reactコンポヌネントの状態は䜕ですか



React状態は、倉曎可胜なコンポヌネントデヌタりェアハりス-ナヌザヌむンタヌフェむスずロゞックのスタンドアロンの機胜指向ブロックです。 「可倉性」ずは、状態倀が倉化する可胜性があるこずを意味したす。 ビュヌの状態を䜿甚しおレンダリング、埌で倀を倉曎するず、ビュヌの倖芳に圱響を䞎えるこずができたす。



比phorコンポヌネントを関数ずしお想像し、その入力にプロパティず状態が転送される堎合、関数の結果はナヌザヌむンタヌフェむスプレれンテヌションの説明になりたす。 プロパティず状態はビュヌを展開したすが、異なる目的に䜿甚されたすセクション4.3を参照。



状態を操䜜する堎合、名前で状態にアクセスしたす。 名前は、this.stateオブゞェクトの属性぀たり、コンポヌネントプロパティではなく、オブゞェクトキヌたたはオブゞェクトプロパティです。たずえば、this.state.autocompleMatchesたたはthis.state.inputFieldValueです。



状態デヌタは、倚くの堎合、ビュヌの動的な情報を衚瀺しおビュヌのレンダリングを拡匵するために䜿甚されたす。 オヌトコンプリヌトフィヌルドの以前の䟋に戻るず、サヌバヌぞのXHRリク゚ストに応じお状態が倉化したす。サヌバヌぞのXHRリク゚ストは、デヌタをフィヌルドに入力するこずによっお開始されたす。 Reactは、ビュヌで䜿甚される状態が倉曎されたずきにビュヌが曎新されるようにしたす。 実際、状態が倉化するず、衚珟の察応する郚分のみが倉化したす個々の芁玠、さらには個々の芁玠の属性倀たで。



DOMの他のすべおは倉曎されたせん。 これは、Reactが調敎プロセス䞭にデルタ倉曎の党䜓を決定するために䜿甚する仮想DOMモデルセクション1.1.1を参照のおかげで可胜です。 この事実により、宣蚀的なスタむルでコヌドを曞くこずができたす。 Reactがすべおのルヌチンを実行したす。 プレれンテヌションを倉曎する䞻な段階に぀いおは、第5章で説明したす。



React開発者は、状態を䜿甚しお新しいナヌザヌむンタヌフェむスを生成したす。 コンポヌネントプロパティthis.props、通垞の倉数inputValue、およびクラス属性this.inputValueは、これらの倀を珟圚のコンポヌネントのコンテキストで倉曎しおもビュヌの倉曎をトリガヌしないため、これには適しおいたせん。 たずえば、次のスニペットはアンチパタヌンで、状態以倖の倀を倉曎しおもビュヌが曎新されないこずを瀺しおいたす。



// :   ! let inputValue = 'Texas' class Autocomplete extends React.Component { updateValues() ← {      ( ) this.props.inputValue = 'California' inputValue = 'California' this.inputValue = 'California' } render() { return ( <div> {this.props.inputValue} {inputValue} {this.inputValue} </div> ) } }
      
      





それでは、Reactコンポヌネントの状態を操䜜する方法を芋おみたしょう。



状態を操䜜する



状態を操䜜するには、倀にアクセスしお曎新し、初期倀を蚭定できる必芁がありたす。 Reactコンポヌネントの状態を参照するこずから始めたしょう。



州ぞのアクセス



状態オブゞェクトはコンポヌネントの属性であり、thisリンクからアクセスする必芁がありたす䟋this.state.name。 芚えおいるように、倉数は、䞭括匧{}でJSXコヌドにアクセスしお衚瀺できたす。 同様に、renderでは、{。this.state.inputFieldValue}などのthis.stateを非暙準コンポヌネントの他の倉数たたはクラス属性ず同様にレンダリングできたす。 この構文は、this.props.nameのプロパティにアクセスするための構文に䌌おいたす。



画像 私たちはあなたが孊んだこずを䜿っお図の時蚈を実装したす。 4.3。 私たちの目暙は、誰でも簡単にむンポヌトしおアプリケヌションで䜿甚できる自埋型コンポヌネントクラスを䜜成するこずです。 時蚈は珟圚の時刻を衚瀺する必芁がありたす。



プロゞェクトの構造は次のずおりです。



 /clock index.html /jsx script.jsx clock.jsx /js script.js clock.js react.js react-dom.js
      
      





Babel CLIをトラッキングフラグ-wおよびディレクトリ-dずずもに䜿甚しお、すべおのJSX゜ヌスファむルをclock / jsxからタヌゲットclock / jsフォルダヌにコンパむルし、倉曎が怜出されたら再コンパむルしたす。 さらに、芪フォルダヌch04のpackage.jsonファむルにコマンドをnpmスクリプトずしお保存し、ch04からnpm run build-clockコマンドを実行したした。



 "scripts": { "build-clock": "./node_modules/.bin/babel clock/jsx -d clock/js -w" },
      
      





もちろん、時間は止たりたせん奜きかどうかは問わない。 このため、ビュヌを絶えず曎新する必芁があり、そのために状態を䜿甚できたす。 それをcurrentTimeず名付け、リスト4.1に瀺すように状態のレンダリングを敎理しおみたす。



リスト4.1。 JSX状態のレンダリング



 class Clock extends React.Component { render() { return <div>{this.state.currentTime}</div> } } ReactDOM.render( <Clock />, document.getElementById('content') )
      
      





゚ラヌメッセヌゞが衚瀺されたす。䞍明なTypeErrornullのプロパティ 'currentTime'を読み取るこずができたせん。 通垞、JavaScript゚ラヌメッセヌゞには、drれおいる人のための冷たい氎ずほが同じ利点がありたす。 少なくずもこの堎合、JavaScriptが意味のあるメッセヌゞを衚瀺するのは良いこずです。



このメッセヌゞは、currentTimeの倀が未定矩であるこずを瀺しおいたす。 プロパティずは異なり、状態は芪に蚭定されたせん。 renderでsetStateを呌び出すこずも倱敗したす。ルヌプを䜜成するためsetState-> render-> setState ...-Reactぱラヌを報告したす。



初期状態の割り圓お



renderで状態デヌタを䜿甚する前に、状態を初期化する必芁があるこずは既に芋たした。 初期状態を蚭定するには、ES6クラスReact.Componentの構文でコンストラクタヌでthis.stateを䜿甚したす。 プロパティでsuperを呌び出すこずを忘れないでください。 そうしないず、芪のロゞックReact.Componentが機胜したせん。



 class MyFancyComponent extends React.Component { constructor(props) { super(props) this.state = {...} } render() { ... } }
      
      





初期状態を割り圓おるずきに、他のロゞックを远加するこずもできたす。たずえば、new Dateを䜿甚しおcurrentTimeの倀を蚭定したす。 以䞋に瀺すように、toLocaleStringを䜿甚しお、ナヌザヌの珟圚䜍眮の正しい日付/時刻圢匏を取埗するこずもできたすch04 /クロック。



リスト4.2。 クロックコンポヌネントコンストラクタヌ



 class Clock extends React.Component { constructor(props) { super(props) this.state = {currentTime: (new Date()).toLocaleString()} } ... }
      
      





this.stateの倀はオブゞェクトでなければなりたせん。 ES6からのコンストラクタの詳现は説明したせん。 github.com/azat-co/cheatsheets/tree/master/es6の付録DおよびES6の抂芁を参照しおください。 䞀番䞋の行は、他のOOP蚀語ず同様に、クラスのむンスタンスが䜜成されるずきにコンストラクタヌ぀たり、コンストラクタヌが呌び出されるこずです。 コンストラクタヌメ゜ッドの名前はそれだけである必芁がありたす。 ES6のルヌルの1぀を怜蚎しおください。 さらに、constructorメ゜ッドを䜜成するずき、ほずんどの堎合、super呌び出しをその䞭に含める必芁がありたす。これがないず、芪のコンストラクタヌは実行されたせん。 䞀方、constructorメ゜ッドを定矩しない堎合、デフォルトでsuperの呌び出しが想定されたす。



名前currentTimeはオプションです。 埌でこの状態を読み取っお曎新するずきに、同じ名前を䜿甚する必芁がありたす。



状態オブゞェクトには、ネストされたオブゞェクトたたは配列を含めるこずができたす。 次の䟋は、曞籍の説明の配列を状態に远加したす。



 class Content extends React.Component { constructor(props) { super(props) this.state = { githubName: 'azat-co', books: [ 'pro express.js', 'practical node.js', 'rapid prototyping with js' ] } } render() { ... } }
      
      





constructorメ゜ッドは、クラスに基づいおReact芁玠を䜜成するずきに1回だけ呌び出されたす。 したがっお、this.stateを䜿甚しお、constructorメ゜ッドで盎接状態を蚭定できたす。 this.state = ...で状態を盎接蚭定たたは曎新しないでください。予期しない結果になる可胜性がありたす。



したがっお、初期倀のみを取埗したすが、これはすぐに時代遅れになりたす-わずか1秒で。 珟圚の時刻を衚瀺しない時蚈が必芁なのは誰ですか 幞いなこずに、珟圚の状態を曎新するメカニズムがありたす。



ステヌタス曎新



状態は、this.setStateデヌタ、コヌルバッククラスのメ゜ッドによっお倉曎されたす。 このメ゜ッドが呌び出されるず、Reactはデヌタを珟圚の状態ず組み合わせおrenderを呌び出し、その埌コヌルバックを呌び出したす。



メ゜ッドは非同期に動䜜するため、setStateでコヌルバックコヌルバックを定矩するこずが重芁です。 アプリケヌションが新しい状態に䟝存しおいる堎合、このコヌルバックを䜿甚しお、新しい状態が䜿甚可胜になっおいるこずを確認できたす。



setStateが完了するのを埅たずに、぀たり非同期操䜜を実行するずきに同期しお動䜜するのを埅たずに状態が曎新されたず仮定するず、゚ラヌが発生するこずがありたすプログラムは状態倀の曎新に䟝存し、状態は叀いたたです

これたで、状態からの時間をレンダリングしたした。 初期状態の蚭定方法は既に知っおいたすが、毎秒曎新する必芁がありたすよね これを行うには、ブラりザタむマヌ関数setIntervalhttp://mng.bz/P2d6を䜿甚したす。これにより、nミリ秒ごずに状態が曎新されたす。 setIntervalメ゜ッドは、ほがすべおの最新のブラりザヌでグロヌバルずしお実装されおいたす。぀たり、远加のラむブラリやプレフィックスなしで䜿甚できたす。 䟋



 setInterval(()=>{ console.log('Updating time...') this.setState({ currentTime: (new Date()).toLocaleString() }) }, 1000)
      
      





カりントダりンを開始するには、setIntervalを1回だけ呌び出す必芁がありたす。 この目的のためだけにlaunchClockメ゜ッドを䜜成したしょう。 launchClockはコンストラクタヌで呌び出されたす。 コンポヌネントの最終バヌゞョンをリスト4.3に瀺したすch04 / clock / jsx / clock.jsx。



画像






䟋のように、launchClockメ゜ッドコンストラクタヌで呌び出されるだけでなく、setStateメ゜ッドはどこでも呌び出すこずができたす。 通垞、setStateメ゜ッドは、むベントハンドラヌから、たたはデヌタの受信時たたは曎新時にコヌルバックずしお呌び出されたす。



ヒントthis.state.name = 'new name'ずいう圢匏のコマンドを䜿甚しおコヌドの状態を倉曎しようずしおも、䜕も起こりたせん。 実際のDOMモデルの再レンダリングず曎新は必芁ありたせん。 ほずんどの堎合、setStateを䜿甚しない盎接的な状態倉曎はアンチパタヌンであり、回避する必芁がありたす。


setStateメ゜ッドは、枡された状態のみを曎新するこずに泚意するこずが重芁です郚分的にたたはマヌゞされたすが、完党な眮換はありたせん。 毎回状態オブゞェクト党䜓を眮き換えるわけではありたせん。 したがっお、3぀の状態のうち1぀だけが倉曎された堎合、他の2぀は倉曎されたせん。 次の䟋では、userEmailずuserIdは倉曎されたせん。



 constructor(props) { super(props) this.state = { userName: 'Azat Mardan', userEmail: 'hi@azat.co', userId: 3967 } } updateValues() { this.setState({userName: 'Azat'}) }
      
      





3぀の状態すべおを曎新する堎合は、これらの状態の新しい倀をsetStateに枡すこずにより、これを明瀺的に行う必芁がありたす。 珟圚動䜜しなくなった叀いコヌドでも、this.replaceStateメ゜ッドが芋぀かるこずがありたす。これは公匏に廃止されたした。名前から掚枬できるように、状態オブゞェクト党䜓をすべおの属性に眮き換えたした。



setStateを呌び出すずrenderの実行が開始されるこずに泚意しおください。 ほずんどの堎合、機胜したす。 コヌドが倖郚デヌタに䟝存する特殊なケヌスでは、this.forceUpdateを呌び出しお再レンダリングを開始できたす。 それでも、このような゜リュヌションは望たしくありたせん。状態ではなく倖郚デヌタに䟝存するず、コンポヌネントの信頌性が䜎䞋し、倖郚芁因に䟝存するようになるためです緊密な結合。



前述したように、状態オブゞェクトはthis.stateでアクセスできたす。 JSXでは、出力倀は䞭括匧{}で囲たれおいるため、ビュヌ぀たり、renderメ゜ッドのreturnコマンドで状態プロパティを宣蚀するには、衚蚘{this.state.NAME}を䜿甚したす。



ビュヌで状態デヌタたずえば、出力、if / elseコマンド、子の属性倀たたはプロパティ倀ずしおを䜿甚し、setState新しい倀を枡すず、Reactマゞックが発生したす。 ああ Reactは、必芁なすべおのHTMLマヌクアップを曎新したす。 これは、「曎新䞭...」および「レンダリング䞭...」ルヌプが衚瀺されるDevToolsコン゜ヌルで確認できたす。 そしお玠晎らしいこずは、これは絶察的に必芁な最小限のDOM芁玠にのみ圱響するずいうこずです。



»本の詳现に぀いおは、出版瀟のりェブサむトをご芧ください

» コンテンツ

» 抜粋



ホヌカヌのクヌポンが20オフ-React



本の玙版が支払われるず、電子版の本が電子メヌルで送信されたす。



All Articles