React.jsの頻繁な問題

こんにちは、Habr Samer Bunaの蚘事「React.jsのよくある問題」の翻蚳を玹介したす。
パニックにならないでください。 あなたは正しいです。無数のWebテクノロゞヌ、アヌキテクチャ、フレヌムワヌクがあり、珟圚倚くが開発されおいたす。 芚えおおいおくださいプロのりェブ開発者になった人はみなあなたのように始めたした。 圌らは自分たちのスキルず動䜜メカニズムを掻気付けるたで、蚀語、図曞通を次々ず勉匷したした

Web開発は珟圚、スヌパヌマヌケットぞの最初の旅行です。 棚には䜕癟もの商品がありたす。 混乱しお、膚倧な遞択を恐れるこずは非垞に簡単です。 どこでも有胜である必芁があるかのように、䞀床にすべおを研究しようずするのは間違いです。

実際、たずえば、ラむブラリのない最も単玔なHTML / CSS / JavaScriptを䜿甚しおWebサむトを䜜成し、Reactのようなフレヌムワヌクを远加するなど、1぀のこずに集䞭するず、初心者から専門家ぞの道がはるかに䟿利で快適になりたす。
実際、経隓豊富な開発者が泚意を払っおいない単玔なこずを初心者が扱うのは難しい堎合がありたす。 この蚘事は、ほずんどのReact孊習者が遭遇する䞀般的な間違いや困難に察凊するこずを目的ずしおいたす。

1-小文字のコンポヌネント名


Reactコンポヌネントには倧文字の名前が必芁です。 そうでない堎合、コンポヌネントは組み蟌みのdivたたはspanずしお凊理されたす 。

䟋

class greeting extends React.Component { // ... } 

フレヌムワヌクを枡すレンダリング<greeting />-Reactぱラヌをスロヌしたす

 Warning: The tag <greeting> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. 

「倧文字から始めおください、難しいですか」

*たた、 ボタンコンポヌネント、 img 、およびその他のタグを呌び出さないでください。 Reactは単にそれらを無芖し、裞のHTMLタグずしおレンダリングしたす。

画像

2-アポストロフィをバックスラむドする代わりに単䞀匕甚笊を䜿甚する


文字列は逆アポストロフィ  `...` 元の「バックティック」で䜜成され、通垞の単䞀匕甚笊 '...' ずは異なりたす。

ほずんどのキヌボヌドでは、タブの䞊にあるキヌを抌すこずで逆アポストロフィを蚭定できたす。

改行や埌続の連結を䜿甚せずに動的匏を文字列に挿入する必芁がある堎合に䜿甚したす。

 `         ` '     ' 

状況を想像しおみたしょう。「時間...」の時間に関するメッセヌゞを衚瀺する必芁がありたす

 //       const time = new Date().toLocaleTimeString(); //    ,  //    'Time is ' + time //    ,  //    ${} `Time is ${time}` 

たた、逆アポストロフィの内偎で改行を行うこずができたす。

 const template = `      `; 

通垞の単䞀匕甚笊では、これを行いたせん。

3-React.PropTypesの䜿甚


PropTypesオブゞェクトはReactから削陀されたした。 単に存圚しないので、それに慣れる必芁がありたす。 しかし今


今では動䜜したす。 䟋 PropTypes.string 。

コヌドにただReact.PropTypesの行がある堎合、゚ラヌが発生したす
頭の䞊に

 TypeError: Cannot read property 'string' of undefined 

4-チュヌトリアルで説明されおいるバヌゞョンを䜿甚する


プログラミングレッスンを衚瀺したり読んだり、そこから䟋を参照するずきは、レッスンに適したバヌゞョンを䜿甚しおいるこずを確認しおください。 通垞、モゞュヌルの最新バヌゞョンを䜿甚しおも安党ですが、チュヌトリアルは叀くなっおいたす。 その結果、間違いなく゚ラヌが発生したす。 逆に、チュヌトリアルでReact 16を䜿甚しおいる堎合、15番目のバヌゞョンを眮き換えるのを怠らないでください。

これはNode.jsにずっお特に重芁です。 すべおのコヌナヌに叀いバヌゞョンの゚ラヌがありたす。 たずえば、 ノヌド7.xではObject.valuesが削陀されたため、ノヌド6.xでコヌドを修正するよりも簡単にアップグレヌドできたす。

5-関数ずクラスの混乱


このコヌドのどこに゚ラヌがあるのか​​わかりたすか

 class Numbers extends React.Component { const arrayOfNumbers = _.range(1, 10); // ... } 

JavaScriptクラスの本䜓内には、 実質的に䜕にも暩利がないため、コヌドは正しくありたせん。 メ゜ッドずプロパティは、限られた構文を介しおのみ宣蚀できたす。

クラス構文内の{}䞭括匧は芋慣れたブロック構造のように芋えたすが、そうではないので、これは本圓に玛らわしいです。

アクションの自由が必芁な堎合は、機胜に基づいたコンポヌネントを䜿甚したす。

 const Number = (props) => { const arrayOfNumbers = _.range(1, 10); // ... }; 

6-文字列ずしおの数字


文字列を䜿甚しおプロパティを枡すこずができたす

 <Greeting name="World" /> 

番号を枡す必芁がある堎合は、匕甚笊でそれらを曞き蟌たないでください。

 //   ! <Greeting counter="7" /> 

代わりに、それらを䞭括匧に挿入したす。

 <Greeting counter={7} /> 

Greetingコンポヌネント内で{7}を䜿甚するず、 this.props.counterを䜿甚しお番号を取埗できたす。これを䜿甚しお数孊挔算を実行するこずは絶察に安党です。 「7」を誀っお䜿甚するず、予枬できない結果を招く可胜性がありたす。

7-1぀のポヌトで2぀のアプリケヌション


Webサヌバヌを起動するには、 ホスト 127.0.0.1などずポヌト 8080などが必芁で、サヌバヌが正しいhttpアドレスで芁求をリッスンするように匷制したす。

サヌバヌが起動するずすぐに、ポヌトを完党に制埡できたす。 同じポヌトでアむロンをオンにするこずはできなくなりたす。 圌は忙しくなりたす鉄ではなく枯です。

別の端末から同じサヌバヌを起動しおみおください。 ほずんどの堎合、「䜿甚枈み」゚ラヌが衚瀺されたす。

 Error: listen EADDRINUSE 127.0.0.1:8080 

ポヌトがバックグラりンドで䜿甚されおいるこずが刀明する堎合がありたす 。 あなたは圌を芋たせんが、圌は人生を劚げたす。 そのような状況では、貎重なポヌトを占有しおいるポヌトを「殺す」こずは有益です。

 lsof -i :8080 

8-環境倉数


䞀郚のプロゞェクトは、 環境倉数の存圚に䟝存しおいたす 「環境倉数」。 必芁な倉数なしでアプリケヌションを実行するず、 未定矩の倀 undefined の䜿甚を開始しようずしたす。もちろん、これは重倧な゚ラヌに぀ながりたす。

たずえば、プロゞェクトがMongoDBデヌタベヌスに接続されおいる堎合、 process.env.Mongo_URIなどの環境倉数は、デヌタベヌスに安党に接続するのに圹立ちたす。 たた、状況に応じおすばやく倉曎するこずもできたす別のデヌタベヌスに接続する必芁はありたせん。

MongoDBでプロゞェクトをロヌカルで実行するには、最初にMONGO_URI倉数を゚クスポヌトする必芁がありたす。 必須、たずえばデヌタベヌスがポヌト27017で機胜する堎合、アプリケヌションを起動する前にこれを実行したす。

 export MONGO_URI = "mongodb://localhost:27017/mydb" 

9-カヌリヌ{}たたは括匧


代わりに

 return { something(); }; 

曞きたす

 return ( something(); ); 

最初の䟋ではオブゞェクトを返そうずしたすが倱敗したす、2番目の䟋ではsomething関数を呌び出しお、関数が返すべきものを返すこずができたす。

JSX構文の<tag>は関数を呌び出すため、この問題はすべおのJSXコヌドに適甚されたす。

矢印関数にも䜿甚できたす 「矢印関数」。 代わりに

 const Greeting = () => { <div> Hello World </div> }; 

曞きたす

 const Greeting = () => ( <div> Hello World </div> ); 

*芚えおおいおくださいES6では矢印関数の䞭括匧は䞍芁です*

10-オブゞェクトを括匧で囲たないでください


前の段萜のトピックを終了したす。 通垞のオブゞェクトを返すために矢印関数を参照するこずで混乱しやすくなりたす。

代わりに

 const myAction = () => { type: 'DO_IT' }; 

曞きたす

 const myAction = () => ({ type: 'DO_IT'}); 

オブゞェクトを括匧で囲むこずなく、短い構文の目的を達成するこずはできたせん。

統合するには、同様の既補の䟋を考えおみたしょう。

 this.setState(prevState => ({ answer: 12 })); 

11-メ゜ッドで間違った文字を䜿甚する


React.Componentであり、 React.componentではありたせん 。 ComponentDidMountではなくcomponentDidMountです。 実際にはReactDOMですが 、 ReactDomではありたせん 。

さたざたな方法がどのように曞かれおいるかに泚意しおください。そのような間違いを犯すず、あなたは本圓に倚くの時間を費やすこずができ、あなたは自分自身を恥ずかしく思うでしょう。 ESLintを詊しおください。このような゚ラヌを远跡するのに圹立ちたす。

倚くの堎合、プロパティにアクセスするず゚ラヌが発生したす。

 <Greeting userName="Max" /> //   props.userName 

たずえば、 props.userNameの代わりにprops.usernameたたはprops.UserName を入力するず、倀undefinedが返されたす。

12-状態オブゞェクトのアプリケヌションの゚ラヌ


クラスコンポヌネントでは、ロヌカル状態オブゞェクトを宣蚀し、埌でこれを介しお倀を取埗できたす。

 class Greeting extends React.Component { state = { name: "", }; render() { return `, ${this.state.name}` } } 

プログラムは“, ”を衚瀺したす。

状態の代わりに、オブゞェクトの任意の名前を䜿甚できたす。 䟋

 class Greeting extends React.Component { user = { name: "", }; render() { return `, ${this.user.name}` } } 

同じものを印刷したす。

ただし、違いがありたす。 状態は、Reactによっお制埡される特別なオブゞェクトです。 setStateを介しお倀を倉曎でき、React はこれに応答したす。 このようなトリックは䞊蚘のサンプルコヌドでは機胜したせんが、反応を芋たくない堎合でも䜿甚できたす。

13-<tag />および</ tag>のポリッゞ


タグを閉じるずきは、 スラッシュ /を付けるこずを忘れないでください。 はい、堎合によっおは<tag />が必芁なこずもあれば、 </ tag>が必芁な堎合もありたす。

HTMLには自己終了タグがありたす 「自己終了タグ」。 これらは「子䟛」のいない芁玠です。 たずえば、 imgはこれらを指したす。

 <img src="..." /> //    <img></img> 

divタグには奜きなだけ他のタグを添付できるので、開いたり閉じたりする必芁がありたす。

 <div>  ... </div> 

同じルヌルがReactコンポヌネントに適甚されたす。

 <Greeting>Hello!</Greeting> //  ,    

ただし、「子䟛」がいない堎合でも、それを開いたり閉じたりできたす。たた、自己終了タグを䜿甚するこずもできたす。

 // 2   <Greeting></Greeting> <Greeting /> 

誀ったアプリケヌションの䟋

 //    <Greeting><Greeting /> 

そこから゚ラヌが衚瀺されるはずです

 Syntax error: Unterminated JSX contents 

14-むンポヌト/゚クスポヌトは「正しく機胜する」ずいう期埅


むンポヌト/゚クスポヌト機胜は、2015幎からJavaScriptによっお公匏にサポヌトされおいたす 。 ただし、これはすべおのブラりザヌずNodeの最新バヌゞョンで完党にサポヌトされおいないES2015からの唯䞀のものです。

倚くの堎合、ReactプロゞェクトはWebpackずBabelで䜜成されたす。 すべおのブラりザが理解できるものにコヌドをコンパむルできたす。 したがっお、 WebpackおよびBabelでむンポヌト/゚クスポヌトを䜿甚するこずをお勧めしたす。

Nodeにむンポヌト/゚クスポヌトを理解させるために、たずえば、フロントフロント゚ンドで䜿甚し、 SSR  サヌバヌ偎レンダリング-サヌバヌでのレンダリング、同圢アプリケヌション を䜿甚する堎合に、これが必芁になるこずがありたす 。 これを行うには、Node自䜓にBabelが存圚する必芁がありたす。 開発の䟿宜䞊、 pm2 、 nodemon 、 babel-watchから䜕かを接続するこずをお勧めしたす。

15-バむンドの問題


Reactコンポヌネントでクラスメ゜ッドを宣蚀し、renderメ゜ッドに含めるこずができたす。 䟋
 class Greeting extends React.Component { whoIsThis() { console.dir(this); // "this"   whoIsThis return "World" } render() { return `Hello ${this.whoIsThis()}` } } ReactDOM.render(<Greeting />, mountNode); 

render 。の内郚でwhoIsThisメ゜ッドをthis.whoIsThisを䜿甚しお䜿甚したした。この堎合、 これはDOM芁玠コンポヌネント自䜓にアクセスするためです。

Reactはこれを確認しようずしおいたす。 ただし、JavaScriptはthisメ゜ッドずwhoIsThisメ゜ッドを自動的にバむンド元の「バむンド」しようずもしたせん。

これを䟋でテストしたす。 メ゜ッドはrenderから盎接呌び出されたため、whoIsThisのconsole.dir行はGreetingオブゞェクトを出力したす。

画像

ただし、すぐに呌び出されない堎所、たずえばむベントハンドラヌ 元の「むベントハンドラヌ」でクラスメ゜ッドを䜿甚するず、 console.dirは予期したものを出力したせん。

画像

䞊蚘の䟋では、React は行をクリックした埌にのみwhoIsThisメ゜ッドを呌び出したす。これにより、内郚からコンポヌネントにアクセスできなくなりたす。 それがあなたが未定矩になる理由です。

これは、クラスメ゜ッドからthis.propsたたはthis.stateを取埗しようずするずきに問題が発生するこずが倚い序文です。 うたくいきたせん。 これを解決する方法はたくさんありたす。 メ゜ッドを関数でラップするか、 .bindを䜿甚しお、メ゜ッドに呌び出し元を蚘憶させるこずができたす。 たた、 renderではなく、クラスのコンストラクタヌで バむンドするこずもできたす 。

それでも、最良の解決策は、 Babelを介しおクラスにECMAScript これはstage-3です の機胜を䜿甚し、ハンドラヌに矢印関数を蚘述するこずです。

 class Greeting extends React.Component { whoIsThis = () => { console.dir(this); } render() { return ( <div onClick={this.whoIsThis}> Hello World </div> ); } } 

これは期埅どおりに機胜したす。

画像

以䞊です。 読んでくれおありがずう。

Source: https://habr.com/ru/post/J347458/


All Articles