HolyJs 2018のHeadHunterブヌスからの反応コンテストクむズ解析

こんにちは 9月24〜25日に、HolyJsフロント゚ンド開発者の䌚議https://holyjs-moscow.ru/がモスクワで開催されたした。 私たちは、クむズを開催したスタンドで䌚議に来たした。 メむンクむズがありたした-予遞4ラりンドず最終ラりンド1で、Apple WatchずLegoのコンストラクタヌがプレむされたした。 たた、個別に、反応知識クむズを実斜したした。


katの䞋-反応時のクむズタスクの解析。 正しいオプションはネタバレの䞋に隠されるので、分析を読むこずができるだけでなく、自分自身をチェックするこずもできたす:)


画像


行こう


䟿宜䞊、質問をセクションにグルヌプ化したした。


セクション1. this.setStateの操䜜の基本的な理解ずコンポヌネントのラむフサむクルの曎新


質問1。


      react-: 1) SetProps, SetState, ForceUpdate 2) ForceUpdate, SetState 3) ForceUpdate, SetState, Parent (re)render 4) ForceUpdate, SetState, directly call UpdateComponent 

答え

3ForceUpdate、SetState、Parentrerender


質問2。


  ,   this.setState({})  react 1)   ,  updating lifecycle 2)   ,    3) React    "Object cannot be empty" 4)    state   

答え

1コンポヌネントはダヌティずマヌクされ、曎新ラむフサむクルが呌び出されたす


質問1ず2の分析

質問に答えるために、2぀の郚分を分析したす。
1曎新サむクルに察する独自のコンポヌネント芁求
2コンポヌネント倖のリク゚スト


コンポヌネント自䜓には、自身を曎新する2぀の方法がありたす。
1this.setStateおよびthis.forceUpdate。 この堎合、コンポヌネントはダヌティずしおマヌクされ、「調敎」チェックで、レンダリングの優先順䜍にある堎合、曎新サむクルが開始されたす。


興味深い事実 this.setState({})ずthis.forceUpdateは異なりたす。 this.setState({})が呌び出されるず、shouldComponentUpdateメ゜ッドなしで曎新ルヌプが開始されるthis.forceUpdateずは異なり、完党な曎新ルヌプが呌び出されたす。 this.setState({})の䟋は、 https //codesandbox.io/s/m5jz2701l9にありたす 䟋でsetStateをforceUpdateに眮き換えるず、コンポヌネントの動䜜がどのように倉化するかを確認できたす。


2コンポヌネントの芪が再レンダリングされるず、vDOMパヌツ、曎新が必芁なすべおの子が返され、それらは完党曎新ラむフサむクルずも呌ばれたす。 shouldComponentUpdateを蚘述するか、コンポヌネントをPureComponentずしお定矩するこずにより、サブツリヌの完党な再カりントを回避できたす。


質問3


   Component  PureComponent (PC) 1) Component   ,    Pure 2) PC  SCU,  shallowEqual props  state 3) PC    ,    store 4)  PC    shouldComponentUpdate 

回答ず解析

2PCはSCUを実装し、shallowEqualプロップずステヌトを実行したす


前に説明したように、芪が再レンダリングするず、サブツリヌ党䜓が曎新ラむフサむクルに送信されたす。 ルヌト芁玠を曎新したず想像しおください。 この堎合、連鎖効果によるず、反応ツリヌのほが党䜓を曎新する必芁がありたす。 䞍芁な曎新を最適化しお送信しないようにするには、 shouldComponentUpdateメ゜ッドがあり、コンポヌネントを曎新する必芁がある堎合はtrueを返し、そうでない堎合はfalseを返すこずができたす。 reactでの比范を簡単にするために、 PureComponentから継承しおすぐに参照できるPureComponentを取埗できshouldComponentUpdate 。これは、参照オブゞェクト型に぀いお説明しおいる堎合たたは倀倀型に぀いお説明しおいる堎合によっお、コンポヌネントに入るすべおのshouldComponentUpdateず状態を比范したす。


質問4。


 this.setState(() => {}, () => {}) —       setState? 1) set   .    updating 2)       state 3) setState   1  

回答ず解析

22番目の関数は、状態の曎新埌に呌び出されたす


Reactラむフサむクルには、マりントルヌプ甚のcomponentDidMountず曎新甚のcomponentDidMount 2぀のメ゜ッドがあり、コンポヌネントの曎新埌にロゞックを远加できたす。 たずえば、httpリク゚ストを䜜成し、スタむルを倉曎し、html芁玠のメトリックを取埗し、条件によりsetStateを䜜成したす。 状態の特定のフィヌルドを倉曎した埌に䜕らかのアクションを実行する堎合、 componentDidUpdateメ゜ッドで比范を蚘述する必芁がありたす。


 componentDidUpdate(prevProp, prevState) { if (prevState.foo !== this.state.foo) { // do awesome things here } } 

たたは、setStateで実行できたす。


 setState( // set new foo {foo: 'baz'}, () => { // do awesome things here } ); 

それぞれの方法には長所ず短所がありたすたずえば、耇数の堎所でsetStateを倉曎する堎合、条件を1回蚘述する方が䟿利な堎合がありたす。


質問5。


       render: class A extends React.PureComponent { render() { console.log('render'); return <div /> } } function Test() { return <A foo='bar' onClick={() => console.log('foo')} /> } const rootElement = document.getElementById("root"); ReactDOM.render(<Test />, rootElement); setTimeout(() => ReactDOM.render(<Test />, rootElement)); 1) 1 2) 2 3) 3 4) 0 

答え

22


質問6。


       render: class A extends React.PureComponent { render() { console.log('render'); return <div /> } } function Test() { return <A foo='bar' /> } const rootElement = document.getElementById("root"); ReactDOM.render(<Test />, rootElement); setTimeout(() => ReactDOM.render(<Test />, rootElement)); 1) 1 2) 2 3) 3 4) 0 

答え

11


質問7。


       render: class A extends React.PureComponent { componentDidMount() { console.log('render'); } render() { return <div /> } } const rootElement = document.getElementById("root"); ReactDOM.render(<A />, rootElement); setTimeout(() => ReactDOM.render(<A />, rootElement)); 1) 1 2) 2 3) 3 4) 0 

答え

11


質問5-7の分析

質問5–7同じこずが必芁ですPureComponentの動䜜の理解ず、小道具の転送時のコンポヌネントの曎新を確認するためです。 renderメ゜ッド内でjsxコヌルバックを枡し、これをrender関数で盎接蚘述した堎合


 render () { return <Button onClick={() => {}} />; } 

次に、芪の各レンダリングは、このクリックハンドラヌを曎新したす。 これは、各レンダリングが䞀意のリンクを持぀新しい関数を䜜成するために発生したす。PureComponentで比范するず、新しい小道具が叀い小道具ず等しくないため、コンポヌネントを曎新する必芁がありたす。 すべおのチェックに合栌し、shouldComponentUpdateがfalseを返す堎合、曎新は行われたせん。


セクション2. Reactのキヌ


ここでキヌの詳现な分析を公開したした https : //habr.com/company/hh/blog/352150/


質問1。


     key,      ? 1)         key 2)    updating lifecycle 3)   key  4)    reconciliation 

回答ず解析

1キヌを倉曎するずきに、以前のむンスタンスを削陀し、新しいむンスタンスをマりントしたす


キヌを䜿甚しない堎合、reactはペアの芁玠のリストを䞊から䞋ぞ比范したす。 キヌを䜿甚するず、察応するキヌで比范が行われたす。 新しいキヌが出珟した堎合、そのようなコンポヌネントは誰ずも比范されず、すぐにれロから䜜成されたす。
芁玠が1぀でもこのメ゜ッドを䜿甚できたす。 <A key="1" />蚭定できたす。次のレンダリングでは<A key="2" />を指定したす。この堎合、reactは<A key="1" />を削陀し<A key="1" />そしお、最初から<A key="2" />を䜜成したす。


質問2。


       this.prop.key? 1)  2)  3)   static getKey 

回答ず解析

2いいえ


コンポヌネントは、小道具ずしお枡された子からキヌを孊習できたすが、キヌに぀いおは孊習できたせん。


質問3。


       render: class A extends React.PureComponent { componentDidMount() { console.log('render'); } render() { return <div /> } } const rootElement = document.getElementById("root"); ReactDOM.render(<A key='1' />, rootElement); setTimeout(() => ReactDOM.render(<A />, rootElement)); 1) 1 2) 2 3) 3 4) 0 

回答ず解析

22


キヌを倉曎するず、コンポヌネントが再䜜成されるため、レンダリングが2回衚瀺されたす。


セクション3. jsxに関する質問


質問1。


   .           1)    prop / context 2)        3)  setParentProps 4)  static getParentRef 

回答ず解析

1prop / contextの圢匏でのコヌルバック
2モデルのレむダヌを削陀し、䜜業を進める


正解は2぀ありたす。 クむズでそれらのいずれかを遞択するず、ポむントがカりントされたす。 この質問は、デヌタフロヌリアクションの知識のためのものです。 䞊から䞋ぞのデヌタは、小道具たたはコンテキストの圢で配垃され、コヌルバックを含めるこずができたす。コヌルバックは、以䞋のコンポヌネントが呌び出しおシステムの状態に圱響を䞎えるこずができたす。
モデルの削陀コンテキストずプロップを組み合わせた別の方法は、たずえば、react-reduxバむンディングです。
このラむブラリは、reactreduxから掟生したモデルを䜿甚したす。 プロバむダヌにredux.storeを蚭定したす。実際にコンテキストにストアを蚭定したす。 次に、開発者はHOC接続を䜿甚したす。これはコンテキストに入り、ストアに倉曎を登録store.subscribeし、ストアが倉曎されるずmapStateToProps関数を再mapStateToPropsたす。 デヌタが倉曎されおいる堎合、小道具でそれらをラップされたオブゞェクトに蚭定したす。
同時に、connectを䜿甚するず、開発者がコンポヌネントに枡す必芁のあるactionCreatorを指定するmapDispatchToPropsを指定できたす。 次に、倖郚からコンテキストなしでそれらを受け取り、 actionCreatorsをストアにバむンドし actionCreatorsでラップしたす、それらを小道具ずしおラップされたコンポヌネントに枡したす。


質問2。


   props   jsx?     1)   2)   children 

回答ず解析

1任意の


任意に転送できたす。 䟋


 <Button icon={<Icon kind='warning'/>}></Button> 

アむコン付きのボタンを描画したす。 このアプロヌチは、1぀の子の小道具を敎理するのではなく、コンポヌネントにさたざたな芁玠の盞察䜍眮を制埡する暩利を残すために䜿甚するず非垞に䟿利です。


セクション4. setStateの高床な理解


匷く関連する3぀の質問を次に瀺したす。


質問1。


 this.state = {a: 'a'}; ... this.setState({a: 'b'}); this.setState({a: this.state.a + 1}) this.state? 1) {a: 'a1'} 2) {a: 'b1'} 3)   4) {a: 'a'} 

答え

3デヌタ䞍足


質問2。


 this.state={a: 'a'} ... this.setState({a: 'b'}) this.setState(state => ({a: state.a + 1})) this.state? 1) {a: 'a1'} 2) {a: 'b1'} 3)   4) {a: 'ab1'} 

答え

2{a 'b1'}


質問3。


    2 setState  componentDidUpdate  updating lifecycle   1) 1 2) 2 3) 3 4)   

答え

11


質問1〜3の分析

setStateのすべおの䜜業は、ここで完党に説明されおいたす。
1 https://reactjs.org/docs/react-component.html#setstate
2 https://stackoverflow.com/questions/48563650/does-react-keep-the-order-for-state-updates/48610973#48610973


実際には、setStateは同期的に発生したせん。
たた、react-lifecycleメ゜ッド、react-eventのハンドラヌ関数onChange、onClick内にあるかどうかに応じお、setStateの呌び出しが連続しお耇数ある堎合、setStateの実行は異なりたす。
SetStateは、reactハンドラヌ内でバッチで動䜜したす呌び出しスタック内のナヌザヌ定矩関数が終了し、むベントハンドラヌずラむフサむクルメ゜ッドを呌び出した関数に入るず、倉曎がロヌルバックされたす。 それらは次々に回転するため、反応ハンドラ内にいる堎合、次のようになりたす。


 this.state = {a: 'a'}; // a: 'a' ... this.state.a // a: 'a' this.setState({a: 'b'}); // a: 'b' +   .       this.state.a // a: 'a' this.setState({a: this.state.a + 1}) // a: 'a1' 

倉曎がbatchevoで発生したため。
しかし同時に、reset-handlersの倖郚でsetStateが呌び出された堎合


 this.state = {a: 'a'}; // a: 'a' ... this.state.a // a: 'a' this.setState({a: 'b'}); // a: 'b' +     this.state.a // a: 'b' this.setState({a: this.state.a + 1}) // a: 'b1' +     

この堎合、倉曎は個別にロヌルされるためです。


セクション5. Redux


質問1。


     action,  () => {} ? 1) .  action      type 2) ,   action      type 3) ,    middleware   action 4) ,       dispatch 

回答ず解析

3はい、そのようなアクションのためにカスタムミドルりェアを定矩する必芁がありたす


最も単玔な䟋ずしおredux-thunkを取り䞊げおください。 すべおのミドルりェアは小さなコヌドブロックです。
https://github.com/reduxjs/redux-thunk/blob/master/src/index.js#L2-L9


 return ({ dispatch, getState }) => next => action => { if (typeof action === 'function') { return action(dispatch, getState, extraArgument); } return next(action); }; 

ミドルりェアはどのように機胜したすか
アクションがストアに到着する前に、コントロヌルを取埗したす。 したがっお、䞊曞きされたアクションは、最初にミドルりェアチェヌンを通過したす。
各ミドルりェアは、ストアむンスタンス、次のメ゜ッドを受け入れたす。これにより、アクションずアクション自䜓をさらに転送できたす。
ミドルりェアがredux-thunkなどのカスタムアクションを凊理する堎合、アクションが関数の堎合、アクションはそれ以䞊転送されず、「 "れ」、代わりにそこに枡されたdispatchおよびgetStateメ゜ッドでアクションを呌び出したす。
redux-thunkが次にアクションを実行した堎合、機胜はどうなりたすか
レデュヌサヌを呌び出す前に、storeはアクションのタむプをチェックしたす。 次の条件を満たす必芁がありたす。
1オブゞェクトでなければなりたせん
2タむプフィヌルドが必芁です
3型フィヌルドは文字列型でなければなりたせん


いずれかの条件が満たされない堎合、reduxぱラヌをスロヌしたす。


ボヌナスの質問


ボヌナス質問1。


   ? class Todos extends React.Component { getSnapshotBeforeUpdate(prevProps, prevState) { return this.props.list.length - prevProps.list.length; } componentDidUpdate(a, b, c) { console.log(c); } ... } ReactDOM.render(<Todos list={['a','b']} />, app); setTimeout(() => ReactDOM.render(<Todos list={['a','b','a','b']} />, app), 0); a) 0 b) 1 c) 2 d) undefined 

回答ず解析

c2


getSnapshotBeforeUpdateは、 getSnapshotBeforeUpdateでめったに䜿甚されない関数であり、スナップショットを取埗しお、それをcomponentDidUpdateに枡すこずができたす。 このメ゜ッドは、特定のデヌタを事前に蚈算し、それに基づいお、たずえばフェッチリク゚ストを䜜成するために必芁です。


ボヌナス質問2。


        2,5 ? function Input() { const [text, setText] = useState("World!"); useEffect( () => { let id = setTimeout(() => { setText("Hello " + text); }, 1000); return () => { clearTimeout(id); }; }, [text] ); return ( <input value={text} onChange={e => { setText(e.target.value); }} /> ); } a) "World!" b) "Hello World!" c) "Hello Hello World!" d)    

答え

c「Hello Hello World」


これはすでに、reactの新機胜を知るこずの問題であり、クむズには含たれおいたせん。 コメントを詊しお、最埌の質問のコヌドの動䜜を詳现に説明したしょう:)



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


All Articles