<StrictMode> γ―γ€ι–‹η™Ίη’°ε’ƒγ«γŠγ„γ¦γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?δΈ€θˆ¬ηš„γͺγƒγ‚°γ‚’ζ—©ζœŸγ«θ¦‹γ€γ‘γ‚‹οΏ½?に役立けます。

<StrictMode>
<App />
</StrictMode>

γƒͺフゑレンス

<StrictMode>

StrictMode を使用して、内側�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγƒ„γƒͺーに対して開発時専用�?ζŒ™ε‹•γ¨θ­¦ε‘Šγ‚’ζœ‰εŠΉγ«γ—γΎγ™γ€‚

import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';

const root = createRoot(document.getElementById('root'));
root.render(
<StrictMode>
<App />
</StrictMode>
);

さらに例を見る

Strict Mode では、δ»₯δΈ‹οΏ½?γ‚ˆγ†γͺ開発時専用�?ζŒ™ε‹•γŒζœ‰εŠΉγ«γͺγ‚ŠγΎγ™γ€‚

props

StrictMode は props γ‚’ε—γ‘δ»˜γ‘γΎγ›γ‚“γ€‚

注意点

  • δΈ€ζ—¦ <StrictMode> γ§γƒ©γƒƒγƒ—γ•γ‚ŒγŸγƒ„γƒͺー内で Strict Mode γ‚’η„‘εŠΉεŒ–γ™γ‚‹ζ–Ήζ³•γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€<StrictMode> ε†…οΏ½?すべて�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγƒγ‚§γƒƒγ‚―γ•γ‚Œγ¦γ„γ‚‹γ“γ¨γ‚’η’ΊδΏ‘γ§γγΎγ™γ€‚γ‚γ‚‹γƒ—γƒ­γƒ€γ‚―γƒˆε†…γ§γ€γƒγ‚§γƒƒγ‚―γ«δΎ‘ε€€γŒγ‚γ‚‹γ¨ζ„Ÿγ˜γ‚‹γ‹γ©γ†γ‹γ«ι–’γ—γ¦ 2 ぀�?チーム�?ζ„θ¦‹γŒε‰²γ‚ŒγŸε ΄εˆγ€εˆζ„γ«ι”γ™γ‚‹γ‹γ€γ‚‚γ—γγ― <StrictMode> をツγƒͺγƒΌοΏ½?δΈ‹ε΄γΈη§»ε‹•γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚

使用法

γ‚’γƒ—γƒͺ全体で Strict Mode γ‚’ζœ‰εŠΉγ«γ™γ‚‹

Strict Mode は、<StrictMode> γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆε†…οΏ½?ε…¨γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγƒ„γƒͺγƒΌγ«ε―Ύγ—γ¦θΏ½εŠ οΏ½?ι–‹η™Ίζ™‚ε°‚η”¨γƒγ‚§γƒƒγ‚―γ‚’ζœ‰εŠΉγ«γ—γΎγ™γ€‚γ“γ‚Œγ‚‰οΏ½?チェックは、開発プロセス�?早い�?οΏ½ιšŽγ§γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?δΈ€θˆ¬ηš„γͺバグを見぀ける�?に役立けます。

γ‚’γƒ—γƒͺ全体で Strict Mode γ‚’ζœ‰εŠΉγ«γ™γ‚‹γ«γ―γ€γƒ«γƒΌγƒˆγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹ιš›γ«γγ‚Œγ‚’ <StrictMode> でラップします。

import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';

const root = createRoot(document.getElementById('root'));
root.render(
<StrictMode>
<App />
</StrictMode>
);

η‰Ήγ«ζ–°γ—γδ½œζˆγ•γ‚ŒγŸγ‚’γƒ—γƒͺに぀いては、をプγƒͺ全体を Strict Mode γ§γƒ©γƒƒγƒ—γ™γ‚‹γ“γ¨γ‚’γŠε‹§γ‚γ—γΎγ™γ€‚createRoot οΏ½?呼び出しをθ‡ͺε‹•ηš„γ«θ‘Œγ†γƒ•γƒ¬γƒΌγƒ γƒ―γƒΌγ‚―γ‚’δ½Ώη”¨γ—γ¦γ„γ‚‹ε ΄εˆγ―γ€γƒ‰γ‚­γƒ₯パンテーションを参照して Strict Mode γ‚’ζœ‰εŠΉγ«γ™γ‚‹ζ–Ήζ³•γ‚’η’Ίθͺγ—てください。

Strict Mode οΏ½?チェックは開発中に�?み�?οΏ½θ‘Œγ•γ‚Œγ‚‹γ‚‚οΏ½?γ§γ™γŒγ€γ“γ‚Œγ‚‰γ―ζ—’γ«γ‚³γƒΌγƒ‰ε†…γ«ε­˜εœ¨γ™γ‚‹γŒζœ¬η•ͺ環咃で�?η’ΊοΏ½?οΏ½γͺε†ηΎγŒι›£γ—γ„γƒγ‚°γ‚’θ¦‹γ€γ‘γ‚‹οΏ½?に役立けます。Strict Mode γ‚’δ½Ώη”¨γ™γ‚‹γ“γ¨γ§γ€γƒγ‚°γ‚’γƒ¦γƒΌγ‚ΆγŒε ±ε‘Šγ—γ¦γγ‚‹ε‰γ«οΏ½?ζ­£γ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

補袳

Strict Mode は開発中にδ»₯δΈ‹οΏ½?γƒγ‚§γƒƒγ‚―γ‚’ζœ‰εŠΉγ«γ—γΎγ™οΌš

γ“γ‚Œγ‚‰οΏ½?γƒγ‚§γƒƒγ‚―γ―γ™γΉγ¦ι–‹η™Ίη’°ε’ƒε°‚η”¨γ§γ‚γ‚Šγ€ζœ¬η•ͺη”¨γƒ“γƒ«γƒ‰γ«γ―ε½±ιŸΏγ—γΎγ›γ‚“γ€‚


γ‚’γƒ—γƒͺοΏ½?一部で Strict Mode γ‚’ζœ‰εŠΉγ«γ™γ‚‹

γ‚’γƒ—γƒͺケーション�?任意�?δΈ€ιƒ¨εˆ†γ§οΏ½?み Strict Mode γ‚’ζœ‰εŠΉγ«γ™γ‚‹γ“γ¨γ‚‚ε―θƒ½γ§γ™γ€‚

import { StrictMode } from 'react';

function App() {
return (
<>
<Header />
<StrictMode>
<main>
<Sidebar />
<Content />
</main>
</StrictMode>
<Footer />
</>
);
}

上記�?例では、Strict Mode οΏ½?チェックは Header と Footer γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«ε―Ύγ—γ¦γ―οΏ½?οΏ½θ‘Œγ•γ‚ŒγΎγ›γ‚“γ€‚γ—γ‹γ—γ€Sidebar と Contentγ€γŠγ‚ˆγ³γγ‚Œγ‚‰οΏ½?中にあるすべて�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ«ε―Ύγ—γ¦γ―γ€γ©γ‚Œγ γ‘ζ·±γ„γ¨γ“γ‚γ«γ‚γ£γ¦γ‚‚γƒγ‚§γƒƒγ‚―γŒοΏ½?οΏ½θ‘Œγ•γ‚ŒγΎγ™γ€‚


ι–‹η™ΊδΈ­οΏ½?δΊŒι‡γƒ¬γƒ³γƒ€γƒΌγ«γ‚ˆγ£γ¦θ¦‹γ€γ‹γ£γŸγƒγ‚°οΏ½?οΏ½?ζ­£

React は、あγͺた�?書くすべて�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒη΄”ι–’ζ•° (pure function) であると�?οΏ½?οΏ½γ—γ¦γ„γΎγ™γ€‚γ“γ‚Œγ―γ€γ‚γͺγŸγŒζ›Έγ React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―γ€εŒγ˜ε…₯εŠ›οΌˆprops、state、contextοΌ‰γŒδΈŽγˆγ‚‰γ‚ŒγŸε ΄εˆγ«εΈΈγ«εŒγ˜ JSX を返さγͺγ‘γ‚Œγ°γͺらγͺいという意味です。

こ�?ルールを�?�らγͺγ„γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―δΊˆζΈ¬δΈθƒ½γͺζŒ™ε‹•γ‚’η€Ίγ—γ€γƒγ‚°γ‚’εΌ•γθ΅·γ“γ—γΎγ™γ€‚γ†γ£γ‹γ‚Šη΄”η²‹γ§γͺくγͺγ£γ¦γ—γΎγ£γŸγ‚³γƒΌγƒ‰γ‚’θ¦‹γ€γ‘γ‚‹γŸγ‚γ«γ€Strict Mode はあγͺた�?ι–’ζ•°οΏ½?δΈ€ιƒ¨οΌˆη΄”η²‹γ§γ‚γ‚‹γΉγγ‚‚οΏ½?だけ)を開発中に 2 ε›žε‘Όγ³ε‡Ίγ—γΎγ™γ€‚γ“γ‚Œγ«γ―δ»₯δΈ‹γŒε«γΎγ‚ŒγΎγ™γ€‚

  • あγͺた�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆι–’ζ•°ζœ¬δ½“οΌˆγƒˆγƒƒγƒ—γƒ¬γƒ™γƒ«οΏ½?ロジック�?γΏγ€‚γ‚€γƒ™γƒ³γƒˆγƒγƒ³γƒ‰γƒ©ε†…οΏ½?γ‚³γƒΌγƒ‰γ―ε«γΎγ‚ŒγΎγ›γ‚“γ€‚οΌ‰
  • useState、set 閒数、useMemoγ€γŠγ‚ˆγ³ useReducer に渑す閒数
  • constructor、render、shouldComponentUpdate γͺど�?一部�?γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγƒ‘γ‚½γƒƒγƒ‰οΌˆε…¨γƒͺγ‚Ήγƒˆγ‚’θ¦‹γ‚‹οΌ‰

ι–’ζ•°γŒη΄”η²‹γ§γ‚γ‚Œγ°γ€η΅ζžœγ―ζ―Žε›žεŒγ˜γ«γͺγ‚‹οΏ½?で、2 ε›žοΏ½?οΏ½θ‘Œγ—γ¦γ‚‚γοΏ½?ζŒ―γ‚‹θˆžγ„γ―ε€‰γ‚γ‚ŠγΎγ›γ‚“γ€‚γ—γ‹γ—γ€ι–’ζ•°γŒη΄”η²‹γ§γͺγ„οΌˆδΎ‹γˆγ°γ€ε—γ‘ε–γ£γŸγƒ‡γƒΌγ‚Ώγ‚’ζ›Έγζ›γˆγ¦γ„γ‚‹οΌ‰ε ΄εˆγ€2 ε›žοΏ½?οΏ½θ‘Œγ™γ‚‹γ“γ¨γ§οΏ½?γ«θ¦‹γˆγ‚‹ε½±ιŸΏγŒε‡Ίγ‚‹οΌˆγΎγ•γ«γγ‚ŒγŒη΄”η²‹γ§γͺγ„γ¨γ„γ†γ“γ¨γ§γ™οΌοΌ‰ε‚Ύε‘γŒγ‚γ‚ŠγΎγ™γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€γƒγ‚°γ‚’ζ—©ζœŸγ«θ¦‹γ€γ‘γ¦οΏ½?正する�?に役立けます。

δ»₯下は、Strict Mode で�?δΊŒι‡γƒ¬γƒ³γƒ€γƒΌγŒγ©οΏ½?γ‚ˆγ†γ«ζ—©ζœŸγ«γƒγ‚°γ‚’θ¦‹γ€γ‘γ‚‹οΏ½?に役立぀かを瀺す例です。

こ�? StoryTray γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ― stories οΏ½?ι…εˆ—γ‚’ε—γ‘ε–γ‚Šγ€γοΏ½?ζœ€εΎŒγ« β€œCreate Story” という項�?γ‚’εŠ γˆγ¦θ‘¨η€Ίγ—γΎγ™γ€‚

export default function StoryTray({ stories }) {
  const items = stories;
  items.push({ id: 'create', label: 'Create Story' });
  return (
    <ul>
      {items.map(story => (
        <li key={story.id}>
          {story.label}
        </li>
      ))}
    </ul>
  );
}

上記�?γ‚³γƒΌγƒ‰γ«γ―ι–“ι•γ„γŒγ‚γ‚ŠγΎγ™γ€‚γ—γ‹γ—γ€εˆε›žοΏ½?ε‡ΊεŠ›γ―ζ­£γ—γθ¦‹γˆγ‚‹γŸγ‚γ€οΏ½?οΏ½ζ˜“γ«θ¦‹θ½γ¨γ—γ¦γ—γΎγ„γΎγ™γ€‚

StoryTray γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒθ€‡ζ•°ε›žγƒ¬γƒ³γƒ€γƒΌγ•γ‚Œγ‚‹γ¨γ“οΏ½?ι–“ι•γ„γ«ζ°—δ»˜γγ‚„γ™γγͺγ‚ŠγΎγ™γ€‚δΎ‹γˆγ°γ€γƒžγ‚¦γ‚Ήγ‚’ StoryTray οΏ½?δΈŠγ«γƒ›γƒγƒΌγ™γ‚‹γ¨θƒŒζ™―θ‰²γ‚’ε€‰γˆγ¦ StoryTray γŒε†γƒ¬γƒ³γƒ€γƒΌγ•γ‚Œγ‚‹γ‚ˆγ†γ«γ—γ¦γΏγΎγ—γ‚‡γ†γ€‚

import { useState } from 'react';

export default function StoryTray({ stories }) {
  const [isHover, setIsHover] = useState(false);
  const items = stories;
  items.push({ id: 'create', label: 'Create Story' });
  return (
    <ul
      onPointerEnter={() => setIsHover(true)}
      onPointerLeave={() => setIsHover(false)}
      style={{
        backgroundColor: isHover ? '#ddd' : '#fff'
      }}
    >
      {items.map(story => (
        <li key={story.id}>
          {story.label}
        </li>
      ))}
    </ul>
  );
}

StoryTray γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?δΈŠγ«γƒžγ‚¦γ‚Ήγ‚’γƒ›γƒγƒΌγ™γ‚‹γŸγ³γ«γ€β€œCreate Story” γŒε†εΊ¦γƒͺγ‚Ήγƒˆγ«θΏ½εŠ γ•γ‚Œγ‚‹γ“γ¨γ«ζ³¨ζ„γ—γ¦γγ γ•γ„γ€‚γ‚³γƒΌγƒ‰οΏ½?ζ„ε›³γ―γ€ζœ€εΎŒγ«δΈ€εΊ¦γ γ‘θΏ½εŠ γ™γ‚‹γ“γ¨γ§γ—γŸγ€‚γ—γ‹γ—γ€StoryTray は props οΏ½? stories ι…εˆ—γ‚’η›΄ζŽ₯ζ›Έγζ›γˆγ¦γ„γΎγ™γ€‚StoryTray γŒγƒ¬γƒ³γƒ€γƒΌγ•γ‚Œγ‚‹γŸγ³γ«γ€εŒγ˜ι…εˆ—οΏ½?ζœ€εΎŒγ« β€œCreate Story” γ‚’ε†γ³θΏ½εŠ γ—γ¦γ„γΎγ™γ€‚γ€γΎγ‚Šγ€StoryTray は純閒数ではγͺγγ€θ€‡ζ•°ε›žοΏ½?οΏ½θ‘Œγ™γ‚‹γ“γ¨γ§η•°γͺγ‚‹η΅ζžœγŒθΏ”γ£γ¦γγΎγ™γ€‚

こ�?ε•ι‘Œγ‚’θ§£ζ±Ίγ™γ‚‹γŸγ‚γ«γ―γ€ι…εˆ—οΏ½?γ‚³γƒ”γƒΌγ‚’δ½œγ‚Šγ€ε…ƒοΏ½?ι…εˆ—οΏ½?δ»£γ‚γ‚Šγ«γοΏ½?γ‚³γƒ”γƒΌγ‚’ζ›Έγζ›γˆγ‚‹γ‚ˆγ†γ«γ§γγΎγ™γ€‚

export default function StoryTray({ stories }) {
const items = stories.slice(); // Clone the array
// βœ… Good: Pushing into a new array
items.push({ id: 'create', label: 'Create Story' });

γ“γ‚Œγ«γ‚ˆγ‚Šγ€StoryTray 閒数は純閒数にγͺγ‚ŠγΎγ™γ€‚ε‘Όγ³ε‡Ίγ•γ‚Œγ‚‹γŸγ³γ«γ€ζ–°γ—γ„ι…εˆ—οΏ½?γ‚³γƒ”γƒΌγ γ‘γŒζ›Έγζ›γ‚γ‚Šγ€ε€–ιƒ¨οΏ½?γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚„ε€‰ζ•°γ«γ―ε½±ιŸΏγ‚’δΈŽγˆγΎγ›γ‚“γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγƒγ‚°γ―οΏ½?ζ­£γ•γ‚ŒγΎγ—γŸγŒγ€ζŒ―γ‚‹θˆžγ„γ«ε•ι‘ŒγŒγ‚γ‚‹γ“γ¨γ«ζ°—δ»˜γ‘γ‚‹γ‚ˆγ†γ«γͺγ‚‹ε‰γ«γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’ι€šεΈΈγ‚ˆγ‚Šε€šγε†γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ—γŸγ€‚

こ�?δΎ‹γ§γ―γ€γƒγ‚°γŒζ˜Žγ‚‰γ‹γ§γ―γ‚γ‚ŠγΎγ›γ‚“γ§γ—γŸγ€‚γ§γ―γ€ε…ƒοΏ½?οΌˆγƒγ‚°γŒγ‚γ‚‹οΌ‰γ‚³γƒΌγƒ‰γ‚’ <StrictMode> γ§γƒ©γƒƒγƒ—γ—γ¦γΏγΎγ—γ‚‡γ†οΌš

export default function StoryTray({ stories }) {
  const items = stories;
  items.push({ id: 'create', label: 'Create Story' });
  return (
    <ul>
      {items.map(story => (
        <li key={story.id}>
          {story.label}
        </li>
      ))}
    </ul>
  );
}

Strict Mode は常にレンダー閒数を 2 ε›žε‘Όγ³ε‡Ίγ™γŸγ‚γ€γ™γγ«ι–“ι•γ£γŸη΅ζžœγŒοΏ½?にε…₯γ‚ŠγΎγ™οΌˆβ€œCreate Story” が 2 ε›žθ‘¨η€Ίγ•γ‚ŒγΎγ™οΌ‰γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€ζ—©ζœŸγ«γ“οΏ½?γ‚ˆγ†γͺ間違いに気γ₯γγ“γ¨γŒγ§γγΎγ™γ€‚Strict Mode γ§γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹γ‚ˆγ†γ«γ™γ‚‹γ“γ¨γ§γ€ε…ˆγ»γ©οΏ½?γƒ›γƒγƒΌζ©Ÿθƒ½οΏ½?γ‚ˆγ†γͺ、将ζ₯本η•ͺη’°ε’ƒγ§η™Ίη”Ÿγ—γ†γ‚‹ε€šγοΏ½?γƒγ‚°γ‚‚γ€γ‚γ‚‰γ‹γ˜γ‚ζ½°γ—γ¦γŠγ‘γ‚‹οΏ½?です。

import { useState } from 'react';

export default function StoryTray({ stories }) {
  const [isHover, setIsHover] = useState(false);
  const items = stories.slice(); // Clone the array
  items.push({ id: 'create', label: 'Create Story' });
  return (
    <ul
      onPointerEnter={() => setIsHover(true)}
      onPointerLeave={() => setIsHover(false)}
      style={{
        backgroundColor: isHover ? '#ddd' : '#fff'
      }}
    >
      {items.map(story => (
        <li key={story.id}>
          {story.label}
        </li>
      ))}
    </ul>
  );
}

Strict Mode がγͺγ‘γ‚Œγ°γ€ε†γƒ¬γƒ³γƒ€γƒΌγ‚’θΏ½εŠ γ—γͺγ„ι™γ‚Šγƒγ‚°γ‚’οΏ½?οΏ½ζ˜“γ«θ¦‹ι€ƒγ—γ¦γ—γΎγ†ηŠΆζ…‹γ§γ—γŸγ€‚Strict Mode γ―εŒγ˜γƒγ‚°γ‚’γ™γγ«θ¦‹γ€γ‹γ‚‹γ‚ˆγ†γ«γ—γΎγ™γ€‚Strict Mode は、チームやユーアに公開してしまう前にバグを見぀ける�?に役立けます。

γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’η΄”η²‹γ«δΏγ€ζ–Ήζ³•γ«γ€γ„γ¦θ©³γ—γθͺ­γ‚€

補袳

React DevTools γ‚’γ‚€γƒ³γ‚ΉγƒˆγƒΌγƒ«γ—γ¦γ„γ‚‹ε ΄εˆγ€2 ε›žοΏ½?οΏ½?レンダー呼び出し中�? console.log ε‘Όγ³ε‡Ίγ—γ―ε°‘γ—ζš—γθ‘¨η€Ίγ•γ‚ŒγΎγ™γ€‚React DevTools γ«γ―γ€γγ‚Œγ‚‰γ‚’οΏ½?οΏ½ε…¨γ«ιžθ‘¨η€Ίγ«γ™γ‚‹θ¨­οΏ½?οΏ½γ‚‚γ‚γ‚ŠγΎγ™οΌˆγƒ‡γƒ•γ‚©γƒ«γƒˆγ§γ―γ‚ͺフ)。


ι–‹η™ΊδΈ­γ«γ‚¨γƒ•γ‚§γ‚―γƒˆγ‚’ε†οΏ½?οΏ½θ‘Œγ—γ¦θ¦‹γ€γ‹γ£γŸγƒγ‚°οΏ½?οΏ½?ζ­£

Strict Mode γ―γ€γ‚¨γƒ•γ‚§γ‚―γƒˆοΏ½?バグを見぀ける�?にも役立けます。

すべて�?γ‚¨γƒ•γ‚§γ‚―γƒˆγ«γ―γ‚»γƒƒγƒˆγ‚’γƒƒγƒ—γ‚³γƒΌγƒ‰γŒγ‚γ‚Šγ€δΈ€ιƒ¨οΏ½?γ‚¨γƒ•γ‚§γ‚―γƒˆγ«γ―γ‚―γƒͺγƒΌγƒ³γ‚’γƒƒγƒ—γ‚³γƒΌγƒ‰γ‚‚γ‚γ‚ŠγΎγ™γ€‚ι€šεΈΈγ€React γ―γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγƒžγ‚¦γƒ³γƒˆοΌˆη”»ι’γ«θΏ½εŠ οΌ‰γ•γ‚ŒγŸγ¨γγ«γ‚»γƒƒγƒˆγ‚’γƒƒγƒ—γ‚³γƒΌγƒ‰γ‚’ε‘Όγ³ε‡Ίγ—γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγ‚’γƒ³γƒžγ‚¦γƒ³γƒˆοΌˆη”»ι’γ‹γ‚‰ε‰Šι™€οΌ‰γ•γ‚ŒγŸγ¨γγ«γ‚―γƒͺーンをップコードを呼び出します。そ�?εΎŒγ€ε‰ε›žοΏ½?レンダーδ»₯ι™γ«δΎε­˜ι…εˆ—γŒε€‰ζ›΄γ•γ‚ŒγŸε ΄εˆγ€React は再度クγƒͺγƒΌγƒ³γ‚’γƒƒγƒ—γ¨γ‚»γƒƒγƒˆγ‚’γƒƒγƒ—γ‚’ε‘Όγ³ε‡Ίγ—γΎγ™γ€‚

Strict Mode がγ‚ͺン�?ε ΄εˆγ€React は開発中にすべて�?γ‚¨γƒ•γ‚§γ‚―γƒˆγ«ε―Ύγ—γ¦ 追加で 1 ε›žγ€γ‚»γƒƒγƒˆγ‚’γƒƒγƒ—+γ‚―γƒͺーンをップ�?ァむクルを�?οΏ½θ‘Œγ—γΎγ™γ€‚γ“οΏ½?ζŒ™ε‹•γ«ι©šγγ‹γ‚‚γ—γ‚ŒγΎγ›γ‚“γŒγ€ζ‰‹ε‹•γ§θ¦‹γ€γ‘γ‚‹οΏ½?γŒι›£γ—γ„οΏ½?妙γͺγƒγ‚°γ‚’ζ˜Žγ‚‰γ‹γ«γ™γ‚‹οΏ½?に役立けます。

Strict Mode γ§γ‚¨γƒ•γ‚§γ‚―γƒˆγ‚’ε†οΏ½?οΏ½θ‘Œγ™γ‚‹γ“γ¨γŒγ€ζ—©ζœŸγ«γƒγ‚°γ‚’θ¦‹γ€γ‘γ‚‹οΏ½?にど�?γ‚ˆγ†γ«ε½Ήη«‹γ€γ‹γ‚’η€Ίγ™δΎ‹γ‚’η€Ίγ—γΎγ™γ€‚

δ»₯δΈ‹οΏ½?δΎ‹γ§γ―γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γƒγƒ£γƒƒγƒˆγ«ζŽ₯ηΆšγ—γ¦γ„γΎγ™γ€‚

import { useState, useEffect } from 'react';
import { createConnection } from './chat.js';

const serverUrl = 'https://localhost:1234';
const roomId = 'general';

export default function ChatRoom() {
  useEffect(() => {
    const connection = createConnection(serverUrl, roomId);
    connection.connect();
  }, []);
  return <h1>Welcome to the {roomId} room!</h1>;
}

こ�?γ‚³γƒΌγƒ‰γ«γ―ε•ι‘ŒγŒγ‚γ‚ŠγΎγ™γŒγ€γ™γγ«γ―ζ˜Žγ‚‰γ‹γ§γ―γͺγ„γ‹γ‚‚γ—γ‚ŒγΎγ›γ‚“γ€‚

ε•ι‘Œγ‚’οΏ½?η«‹γŸγ›γ‚‹γŸγ‚γ€ζ©Ÿθƒ½γ‚’οΏ½?�装してみましょう。δ»₯δΈ‹οΏ½?例では、roomId γ―γƒγƒΌγƒ‰γ‚³γƒΌγƒ‰γ•γ‚Œγ¦γŠγ‚‰γšγ€δ»£γ‚γ‚Šγ«γ€γƒ¦γƒΌγ‚Άγ―γƒ‰γƒ­γƒƒγƒ—γƒ€γ‚¦γƒ³γ‹γ‚‰ζŽ₯ηΆšγ—γŸγ„ roomId γ‚’ιΈζŠžγ§γγΎγ™γ€‚β€œOpen chat” γ‚’γ‚―γƒͺγƒƒγ‚―γ—γ€ζ¬‘γ«γ²γ¨γ€γšγ€η•°γͺγ‚‹γƒγƒ£γƒƒγƒˆγƒ«γƒΌγƒ γ‚’ιΈζŠžγ—γ¦γγ γ•γ„γ€‚γ‚³γƒ³γ‚½γƒΌγƒ«γ§γ‚’γ‚―γƒ†γ‚£γƒ–γͺζŽ₯碚�?ζ•°γ‚’ζ•°γˆγ¦γΏγ¦γγ γ•γ„γ€‚

import { useState, useEffect } from 'react';
import { createConnection } from './chat.js';

const serverUrl = 'https://localhost:1234';

function ChatRoom({ roomId }) {
  useEffect(() => {
    const connection = createConnection(serverUrl, roomId);
    connection.connect();
  }, [roomId]);

  return <h1>Welcome to the {roomId} room!</h1>;
}

export default function App() {
  const [roomId, setRoomId] = useState('general');
  const [show, setShow] = useState(false);
  return (
    <>
      <label>
        Choose the chat room:{' '}
        <select
          value={roomId}
          onChange={e => setRoomId(e.target.value)}
        >
          <option value="general">general</option>
          <option value="travel">travel</option>
          <option value="music">music</option>
        </select>
      </label>
      <button onClick={() => setShow(!show)}>
        {show ? 'Close chat' : 'Open chat'}
      </button>
      {show && <hr />}
      {show && <ChatRoom roomId={roomId} />}
    </>
  );
}

開いているζŽ₯碚�?ζ•°γŒε’—γˆηΆšγ‘γ¦γ„γγ“γ¨γ«γŠζ°—γ₯きでしょう。�?οΏ½ιš›οΏ½?γ‚’γƒ—γƒͺγ‚±γƒΌγ‚·γƒ§γƒ³γ§γ―γ€γ“γ‚Œγ«γ‚ˆγ‚Šγƒ‘γƒ•γ‚©γƒΌγƒžγƒ³γ‚Ήγ‚„γƒγƒƒγƒˆγƒ―γƒΌγ‚―οΏ½?ε•ι‘ŒγŒη™Ίη”Ÿγ—γΎγ™γ€‚ε•ι‘Œγ―γ€γ‚¨γƒ•γ‚§γ‚―γƒˆγ«γ‚―γƒͺγƒΌγƒ³γ‚’γƒƒγƒ—ι–’ζ•°γŒγͺいことです。

useEffect(() => {
const connection = createConnection(serverUrl, roomId);
connection.connect();
return () => connection.disconnect();
}, [roomId]);

γ“γ‚Œγ§γ‚¨γƒ•γ‚§γ‚―γƒˆγŒθ‡ͺθΊ«γ‚’γ€Œγ‚―γƒͺーンをップ」し、叀いζŽ₯ηΆšγ‚’η ΄ζ£„γ™γ‚‹γ‚ˆγ†γ«γͺった�?で、γƒͺγƒΌγ‚―γ―θ§£ζΆˆγ•γ‚ŒγΎγ—γŸγ€‚γ—γ‹γ—γ€ε•ι‘ŒγŒθ¦‹γˆγ¦γγ‚‹οΏ½?γ―γ€γ‚ˆγ‚Šε€šγοΏ½?ζ©Ÿθƒ½οΌˆιΈζŠžγƒœγƒƒγ‚―γ‚ΉοΌ‰γ‚’θΏ½εŠ γ—γŸεΎŒγ§γ—γŸγ€‚

ε…ƒοΏ½?δΎ‹γ§γ―γ€γƒγ‚°γ―ζ˜Žγ‚‰γ‹γ§γ―γ‚γ‚ŠγΎγ›γ‚“γ§γ—γŸγ€‚γ§γ―γ€ε…ƒοΏ½?οΌˆγƒγ‚°οΏ½?ある)コードを <StrictMode> γ§γƒ©γƒƒγƒ—γ—γ¦γΏγΎγ—γ‚‡γ†οΌš

import { useState, useEffect } from 'react';
import { createConnection } from './chat.js';

const serverUrl = 'https://localhost:1234';
const roomId = 'general';

export default function ChatRoom() {
  useEffect(() => {
    const connection = createConnection(serverUrl, roomId);
    connection.connect();
  }, []);
  return <h1>Welcome to the {roomId} room!</h1>;
}

Strict Mode γ‚’δ½Ώη”¨γ™γ‚‹γ¨γ€γ™γγ«ε•ι‘ŒγŒγ‚γ‚‹γ“γ¨γŒγ‚γ‹γ‚ŠγΎγ™οΌˆγ‚’γ‚―γƒ†γ‚£γƒ–γͺζŽ₯碚�?ζ•°γŒ 2 γ«θ·³γ­δΈŠγŒγ‚ŠγΎγ™οΌ‰γ€‚Strict Mode は、すべて�?γ‚¨γƒ•γ‚§γ‚―γƒˆγ«ε―Ύγ—γ¦γ‚»γƒƒγƒˆγ‚’γƒƒγƒ—+γ‚―γƒͺーンをップ�?γ‚΅γ‚€γ‚―γƒ«γ‚’θΏ½εŠ γ§οΏ½?οΏ½θ‘Œγ—γΎγ™γ€‚γ“οΏ½?γ‚¨γƒ•γ‚§γ‚―γƒˆγ«γ―γ‚―γƒͺγƒΌγƒ³γ‚’γƒƒγƒ—γƒ­γ‚Έγƒƒγ‚―γŒγͺγ„γŸγ‚γ€δ½™εˆ†γͺζŽ₯ηΆšγŒδ½œζˆγ•γ‚Œγ¦γ‚‚η ΄ζ£„γ•γ‚ŒγΎγ›γ‚“γ§γ—γŸγ€‚γ“γ‚Œγ―γ€γ‚―γƒͺγƒΌγƒ³γ‚’γƒƒγƒ—ι–’ζ•°γŒζ¬ γ‘γ¦γ„γ‚‹γ“γ¨γ‚’η€Ίγ™γƒ’γƒ³γƒˆγ§γ™γ€‚

Strict Mode を使用すると、こ�?γ‚ˆγ†γͺγƒŸγ‚Ήγ‚’ζ—©ζœŸγ«ζ°—δ»˜γγ“γ¨γŒγ§γγΎγ™γ€‚Strict Mode γ§γ‚¨γƒ•γ‚§γ‚―γƒˆγ«γ‚―γƒͺγƒΌγƒ³γ‚’γƒƒγƒ—ι–’ζ•°γ‚’θΏ½εŠ γ—γ¦οΏ½?ζ­£γ™γ‚‹γ“γ¨γ§γ€ε…ˆγ»γ©οΏ½?ιΈζŠžγƒœγƒƒγ‚―γ‚ΉοΏ½?γ‚ˆγ†γͺ、将ζ₯本η•ͺη’°ε’ƒγ§η™Ίη”Ÿγ—γ†γ‚‹ε€šγοΏ½?γƒγ‚°γ‚‚γ€γ‚γ‚‰γ‹γ˜γ‚ζ½°γ—γ¦γŠγ‘γ‚‹οΏ½?です。

import { useState, useEffect } from 'react';
import { createConnection } from './chat.js';

const serverUrl = 'https://localhost:1234';

function ChatRoom({ roomId }) {
  useEffect(() => {
    const connection = createConnection(serverUrl, roomId);
    connection.connect();
    return () => connection.disconnect();
  }, [roomId]);

  return <h1>Welcome to the {roomId} room!</h1>;
}

export default function App() {
  const [roomId, setRoomId] = useState('general');
  const [show, setShow] = useState(false);
  return (
    <>
      <label>
        Choose the chat room:{' '}
        <select
          value={roomId}
          onChange={e => setRoomId(e.target.value)}
        >
          <option value="general">general</option>
          <option value="travel">travel</option>
          <option value="music">music</option>
        </select>
      </label>
      <button onClick={() => setShow(!show)}>
        {show ? 'Close chat' : 'Open chat'}
      </button>
      {show && <hr />}
      {show && <ChatRoom roomId={roomId} />}
    </>
  );
}

γ‚³γƒ³γ‚½γƒΌγƒ«γ«θ‘¨η€Ίγ•γ‚Œγ‚‹γ‚’γ‚―γƒ†γ‚£γƒ–γͺζŽ₯碚�?ζ•°γŒε’—γˆγ¦γ„γ‹γͺくγͺγ£γŸγ“γ¨γ«ζ³¨οΏ½?してください。

Strict Mode がγͺγ‘γ‚Œγ°γ€γ‚¨γƒ•γ‚§γ‚―γƒˆγŒγ‚―γƒͺーンをップを必要としていることを�?οΏ½ζ˜“γ«θ¦‹ι€ƒγ™γ¨γ“γ‚γ§γ—γŸγ€‚ι–‹η™ΊδΈ­γ«γ‚¨γƒ•γ‚§γ‚―γƒˆγ«ε―Ύγ—γ¦γ€Œγ‚»γƒƒγƒˆγ‚’γƒƒγƒ— β†’ γ‚―γƒͺーンをップ β†’ γ‚»γƒƒγƒˆγ‚’γƒƒγƒ—γ€γ‚’οΏ½?οΏ½θ‘Œγ™γ‚‹γ“γ¨γ§γ€Strict Mode はクγƒͺγƒΌγƒ³γ‚’γƒƒγƒ—γƒ­γ‚Έγƒƒγ‚―γŒζ¬ γ‘γ¦γ„γ‚‹γ“γ¨γ«γ‚ˆγ‚Šζ°—δ»˜γγ‚„γ™γγ—γŸοΏ½?です。

γ‚¨γƒ•γ‚§γ‚―γƒˆοΏ½?γ‚―γƒͺーンをップ�?οΏ½?�装に぀いて詳しくθͺ­γ‚€


Strict Mode γ«γ‚ˆγ£γ¦ζœ‰εŠΉεŒ–γ•γ‚ŒγŸιžζŽ¨ε₯¨θ­¦ε‘ŠοΏ½?οΏ½?ζ­£

React は、<StrictMode> ツγƒͺγƒΌε†…οΏ½?γ„γšγ‚Œγ‹οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒδ»₯δΈ‹οΏ½?非推ε₯¨ API γ‚’δ½Ώη”¨γ—γ¦γ„γ‚‹ε ΄εˆγ«θ­¦ε‘Šγ‚’η™Ίγ—γΎγ™γ€‚

γ“γ‚Œγ‚‰οΏ½? API γ―δΈ»γ«ε€γ„γ‚―γƒ©γ‚Ήγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§δ½Ώη”¨γ•γ‚Œγ¦γ„γ‚‹γ‚‚οΏ½?γ§γ‚γ‚Šγ€ηΎεœ¨οΏ½?γ‚’γƒ—γƒͺγ‚±γƒΌγ‚·γƒ§γƒ³γ§γ―γ»γ¨γ‚“γ©θ¦‹γ‚‰γ‚ŒγΎγ›γ‚“γ€‚