<Activity>
<Activity> ã䜿ããUI ã®äžéšãé衚瀺ã«ããã衚瀺ãããããŸãã
<Activity mode={visibility}>
<Sidebar />
</Activity>ãªãã¡ã¬ã³ã¹
<Activity>
Activity ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®äžéšãé衚瀺ã«ããããšãã§ããŸãã
<Activity mode={isShowingSidebar ? "visible" : "hidden"}>
<Sidebar />
</Activity>Activity ããŠã³ããªã hidden ã«ãªã£ãŠããå ŽåãReact 㯠display: "none" ã® CSS ããããã£ã䜿ã£ãŠãã®åãèŠèŠçã«é衚瀺ã«ããŸãããŸãããããã®ãšãã§ã¯ããç Žæ£ããããšã§ãã¹ãŠã®ã¢ã¯ãã£ããªãµãã¹ã¯ãªãã·ã§ã³ãã¯ãªãŒã³ã¢ããããŸãã
é衚瀺ã®éããåã¯æ°ãã props ã«åå¿ããŠåã¬ã³ããŒãããŸãããä»ã®ã³ã³ãã³ããããäœãåªå 床ã§è¡ãããŸãã
ããŠã³ããªãåã³ visible ã«ãªããšãReact ã¯ä»¥åã® state ã埩å ããç¶æ ã§åã衚瀺ãããšãã§ã¯ããåäœæããŸãã
ãã®ããã«ãActivity ã¯ãããã¯ã°ã©ãŠã³ãã¢ã¯ãã£ããã£ããã¬ã³ããŒããããã®ã¡ã«ããºã ãšèããããšãã§ããŸããå床衚瀺ãããå¯èœæ§ãé«ãã³ã³ãã³ããå®å šã«ç Žæ£ãã代ããã«ãActivity ã䜿çšããããšã§ãã®ã³ã³ãã³ãã® UI ãšå éšç¶æ ãç¶æã»åŸ©å ãã€ã€ãé衚瀺ã®ã³ã³ãã³ããäžèŠãªå¯äœçšãæããªãããã«ããããšãã§ããŸãã
props
children: 衚瀺ã»é衚瀺ãåãæ¿ããã UIãmode:'visible'ãŸãã¯'hidden'ã®æååãçç¥æã¯'visible'ã«ãªãã
泚æç¹
ViewTransitionã®å éšã§ Activity ãã¬ã³ããŒãããstartTransitionã«ãã£ãŠåŒãèµ·ããããæŽæ°ã®çµæãšããŠè¡šç€ºãããããã«ãªããšãViewTransitionã®enterã¢ãã¡ãŒã·ã§ã³ãäœåããŸããé衚瀺ã«ãªããšãexitã¢ãã¡ãŒã·ã§ã³ãäœåããŸãã- ããã¹ãã®ã¿ãã¬ã³ããŒãã Activity ã¯ãé衚瀺ã®ããã¹ããã¬ã³ããŒããã®ã§ã¯ãªããäœãã¬ã³ããŒããŸãããããã¯ãå¯èŠæ§ã®å€åãé©çšããããã®å¯Ÿå¿ãã DOM èŠçŽ ããªãããã§ããäŸãã°ã
<Activity mode="hidden"><ComponentThatJustReturnsText /></Activity>ã¯ãconst ComponentThatJustReturnsText = () => "Hello, World!"ã®å Žåã« DOM ã«äœãåºåããŸããã
äœ¿çšæ³
é衚瀺ã³ã³ããŒãã³ãã® state ã埩å ãã
React ã§ã¯ãæ¡ä»¶ã«å¿ããŠã³ã³ããŒãã³ãã®è¡šç€ºãé衚瀺ãåãæ¿ãããå Žåãå žåçã«ã¯æ¡ä»¶åå²ã«ãã£ãŠã³ã³ããŒãã³ããããŠã³ããããã¢ã³ããŠã³ããããããŸãã
{isShowingSidebar && (
<Sidebar />
)}ãããã³ã³ããŒãã³ããã¢ã³ããŠã³ããããšå éšã® state ãç Žæ£ãããŠããŸããããã¯å¿ ãããæãŸããã¯ãããŸããã
Activity ããŠã³ããªãçšããŠã³ã³ããŒãã³ããé衚瀺ã«ãããšãReact 㯠state ãåŸã§äœ¿ãããã«ãã»ãŒããããŠããããšãã§ããŸãã
<Activity mode={isShowingSidebar ? "visible" : "hidden"}>
<Sidebar />
</Activity>ããã«ãããã³ã³ããŒãã³ããé衚瀺ã«ããåŸã§ã以åã® state ãä¿æããç¶æ ã§åŸ©å ããããšãå¯èœã§ãã
次ã®äŸã«ã¯ãå±éå¯èœãªã»ã¯ã·ã§ã³ãæã€ãµã€ãããŒããããŸããâOverviewâ ãæŒããšããã®äžã«ãã 3 ã€ã®ãµãã¢ã€ãã ã衚瀺ãããŸããã¢ããªã®ã¡ã€ã³é åã«ã¯ããµã€ãããŒã衚瀺ãããé衚瀺ã«ãããããããã®ãã¿ã³ããããŸãã
Overview ã»ã¯ã·ã§ã³ãå±éããŠããããµã€ãããŒãéãããŸãéããŠã¿ãŠãã ããã
import { useState } from 'react'; import Sidebar from './Sidebar.js'; export default function App() { const [isShowingSidebar, setIsShowingSidebar] = useState(true); return ( <> {isShowingSidebar && ( <Sidebar /> )} <main> <button onClick={() => setIsShowingSidebar(!isShowingSidebar)}> Toggle sidebar </button> <h1>Main content</h1> </main> </> ); }
Overview ã»ã¯ã·ã§ã³ã¯ã衚瀺ããããšãã«æ¯åæããããŸããç¶æ
ã§è¡šç€ºãããŠããŸããŸããisShowingSidebar ã false ã«ãªãéã«ãµã€ãããŒãã¢ã³ããŠã³ãããããããã®å
éšã® state ããã¹ãŠå€±ãããŠããŸãã®ã§ãã
ãã㯠Activity ã®å®ç§ãªãŠãŒã¹ã±ãŒã¹ã§ãããµã€ãããŒãèŠèŠçã«é衚瀺ã«ããŠããéã§ãããã®å éš state ãä¿æããããšãã§ããŸãã
ãµã€ãããŒã®æ¡ä»¶ä»ãã¬ã³ããŒã Activity ããŠã³ããªã«çœ®ãæããŠã¿ãŸãããã
// Before
{isShowingSidebar && (
<Sidebar />
)}
// After
<Activity mode={isShowingSidebar ? 'visible' : 'hidden'}>
<Sidebar />
</Activity>æ°ããåäœã確èªããŠã¿ãŠãã ããã
import { Activity, useState } from 'react'; import Sidebar from './Sidebar.js'; export default function App() { const [isShowingSidebar, setIsShowingSidebar] = useState(true); return ( <> <Activity mode={isShowingSidebar ? 'visible' : 'hidden'}> <Sidebar /> </Activity> <main> <button onClick={() => setIsShowingSidebar(!isShowingSidebar)}> Toggle sidebar </button> <h1>Main content</h1> </main> </> ); }
ãµã€ãããŒã®å®è£ ã倿Žããããšãªããå éšã® state ã埩å ãããããã«ãªããŸããã
é衚瀺ã³ã³ããŒãã³ãã® DOM ãä¿æãã
Activity ããŠã³ããªã¯ display: none ã䜿ã£ãŠåãé衚瀺ã«ãããããéè¡šç€ºç¶æ
ã®å Žåã«ã¯åã® DOM ãä¿æãããŸããããã«ããããŠãŒã¶ãåã³æäœããå¯èœæ§ããã UI ã®äžæçãªç¶æ
ãä¿æããŠããã®ã«ã圹ç«ã¡ãŸãã
以äžã®äŸã§ã¯ãContact ã¿ãã«ã¯ãŠãŒã¶ãã¡ãã»ãŒãžãå
¥åããããã® <textarea> ããããŸããäœãããã¹ããå
¥åããHome ã¿ãã«åãæ¿ããŠãåã³ Contact ã¿ãã«æ»ããšãäžæžãã®ã¡ãã»ãŒãžã¯æ¶ããŠããŸããŸãã
export default function Contact() { return ( <div> <p>Send me a message!</p> <textarea /> <p>You can find me online here:</p> <ul> <li>admin@mysite.com</li> <li>+123456789</li> </ul> </div> ); }
ãã㯠App å
ã® Contact ãå®å
šã«ã¢ã³ããŠã³ãããŠããããã§ããContact ã¿ããã¢ã³ããŠã³ãããããšã<textarea> èŠçŽ å
ã® DOM ã®ç¶æ
ã倱ãããŠããŸããŸãã
Activity ããŠã³ããªãçšããŠè¡šç€ºã»éè¡šç€ºç¶æ ãåãæ¿ããããã«ããããšã§ãããããã®ã¿ãã® DOM èŠçŽ ãä¿æããããšãã§ããŸããããã¹ããå ¥åããåŸã«ã¿ããåãæ¿ããäžæžãã¡ãã»ãŒãžãæ¶ããªããªã£ãããšã確èªããŠãã ããã
import { Activity, useState } from 'react'; import TabButton from './TabButton.js'; import Home from './Home.js'; import Contact from './Contact.js'; export default function App() { const [activeTab, setActiveTab] = useState('contact'); return ( <> <TabButton isActive={activeTab === 'home'} onClick={() => setActiveTab('home')} > Home </TabButton> <TabButton isActive={activeTab === 'contact'} onClick={() => setActiveTab('contact')} > Contact </TabButton> <hr /> <Activity mode={activeTab === 'home' ? 'visible' : 'hidden'}> <Home /> </Activity> <Activity mode={activeTab === 'contact' ? 'visible' : 'hidden'}> <Contact /> </Activity> </> ); }
ä»åããActivity ããŠã³ããªã®ãããã§ãContact ã¿ãã®å®è£ ãæžãæããããšãªãããã®å éšç¶æ ãä¿æã§ããããã«ãªã£ãããã§ãã
衚瀺ãããå¯èœæ§ãé«ãã³ã³ãã³ãã®ããªã¬ã³ããŒ
ãããŸã§ã¯ããŠãŒã¶ãäœããã®æäœãè¡ã£ãã³ã³ãã³ããé衚瀺ã«ããåŸããActivity ããã®äžæçãªç¶æ ãä¿æã§ããããšããäŸãèŠãŠããŸããã
ããã Activity ããŠã³ããªã¯ããŠãŒã¶ãã³ã³ãã³ããåããŠç®ã«ããåã«ãããæºåããŠããããã«äœ¿çšããããšãå¯èœã§ãã
<Activity mode="hidden">
<SlowComponent />
</Activity>Activity ããŠã³ããªãååã¬ã³ããŒæã« hidden ã«ãªã£ãŠããå Žåããã®åã¯ããŒãžäžã§ã¯è¡šç€ºãããŸããããã¬ã³ããŒã¯çºçããŸãããã ã衚瀺ãããŠããã³ã³ãã³ããããåªå 床ã¯äœããªãããã€ãšãã§ã¯ãã®ã»ããã¢ãããèµ·ããŸããã
ãã®ããªã¬ã³ããªã³ã°ã«ãããåã¯äºåã«å¿ èŠãªã³ãŒããããŒã¿ãããŒãã§ããŸãããã®ããåŸã§ Activity ããŠã³ããªã衚瀺ãããå Žåã«ãåãããçãèªã¿èŸŒã¿æéã§çŽ æ©ã衚瀺ã§ããŸãã
äŸãèŠãŠã¿ãŸãããã
以äžã®ãã¢ã§ã¯ãPosts ã¿ãããšããããŒã¿ãããŒãããŠããŸããæŒããšãããŒã¿ããã§ãããããŠããéããµã¹ãã³ã¹ãã©ãŒã«ããã¯ã衚瀺ãããŠããŸã£ãŠããŸãã
import { useState, Suspense } from 'react'; import TabButton from './TabButton.js'; import Home from './Home.js'; import Posts from './Posts.js'; export default function App() { const [activeTab, setActiveTab] = useState('home'); return ( <> <TabButton isActive={activeTab === 'home'} onClick={() => setActiveTab('home')} > Home </TabButton> <TabButton isActive={activeTab === 'posts'} onClick={() => setActiveTab('posts')} > Posts </TabButton> <hr /> <Suspense fallback={<h1>ð Loading...</h1>}> {activeTab === 'home' && <Home />} {activeTab === 'posts' && <Posts />} </Suspense> </> ); }
ããã¯ã¿ããã¢ã¯ãã£ãã«ãªããŸã§ App 㯠Posts ãããŠã³ãããªãããã§ãã
App ãæžãæããŠãActivity ããŠã³ããªã䜿ã£ãŠã¿ãã®è¡šç€ºç¶æ
ãåãæ¿ããããã«ãããšãPosts ã¯ã¢ããªã®ååèªã¿èŸŒã¿æã«ããªã¬ã³ããŒãããŸãããã®ããã¿ããå®éã«è¡šç€ºãããåã«ããŒã¿ã®ãã§ãããè¡ããŸãã
Posts ã¿ããã¯ãªãã¯ããŠã¿ãŠãã ããã
import { Activity, useState, Suspense } from 'react'; import TabButton from './TabButton.js'; import Home from './Home.js'; import Posts from './Posts.js'; export default function App() { const [activeTab, setActiveTab] = useState('home'); return ( <> <TabButton isActive={activeTab === 'home'} onClick={() => setActiveTab('home')} > Home </TabButton> <TabButton isActive={activeTab === 'posts'} onClick={() => setActiveTab('posts')} > Posts </TabButton> <hr /> <Suspense fallback={<h1>ð Loading...</h1>}> <Activity mode={activeTab === 'home' ? 'visible' : 'hidden'}> <Home /> </Activity> <Activity mode={activeTab === 'posts' ? 'visible' : 'hidden'}> <Posts /> </Activity> </Suspense> </> ); }
é衚瀺㮠Activity ããŠã³ããªã®ãããã§ãPosts ã¯çŽ æ©ãã¬ã³ããŒã«åããããšãã§ããŸããã
é衚瀺㮠Activity ããŠã³ããªã䜿ã£ãã³ã³ããŒãã³ãã®ããªã¬ã³ããŒã¯ããŠãŒã¶ãæ¬¡ã«æäœããå¯èœæ§ãé«ã UI ã®ããŒãæéãççž®ããããã®åŒ·åãªæ¹æ³ã§ãã
ããŒãžèªã¿èŸŒã¿äžã®ãŠãŒã¶æäœã®é«éå
React ã«ã¯ãéžæçãã€ãã¬ãŒã·ã§ã³ (Selective Hydration) ãšåŒã°ããå éšçãªããã©ãŒãã³ã¹æé©åæ©èœãå«ãŸããŠããŸããããã¯ãã¢ããªã®åæ HTML ãåå²ããŠãã€ãã¬ãŒã·ã§ã³ããããšã§ãããŒãžäžã®ä»ã®ã³ã³ããŒãã³ãããŸã ã³ãŒããããŒã¿ãããŒãããŠããªãå Žåã§ããäžéšã®ã³ã³ããŒãã³ããæäœå¯èœã«ãããšãããã®ã§ãã
ãµã¹ãã³ã¹ããŠã³ããªã¯éžæçãã€ãã¬ãŒã·ã§ã³ã®æ§æèŠçŽ ã§ããã³ã³ããŒãã³ãããªãŒãäºãã«ç¬ç«ããåäœã«èªç¶ã«åå²ãããã®ã ããã§ãã
function Page() {
return (
<>
<MessageComposer />
<Suspense fallback="Loading chats...">
<Chats />
</Suspense>
</>
)
}ããã§ã¯ãMessageComposer ã¯ãChats ãããŠã³ããããŠããŒã¿ã®ãã§ãããéå§ããåã§ãã£ãŠããããŒãžã®ååã¬ã³ããŒæã«å®å
šã«ãã€ãã¬ãŒãã§ããŸãã
ãã®ããã«ããµã¹ãã³ã¹ã䜿ã£ãŠã³ã³ããŒãã³ãããªãŒãåå¥ã®ãŠãããã«åå²ããããšã§ãReact ã¯ãµãŒãã§ã¬ã³ããŒãããã¢ããªã® HTML ãåå²ããŠãã€ãã¬ãŒã·ã§ã³ã§ããããã«ãªããã¢ããªã®äžéšãå¯èœãªéãéãæäœå¯èœã«ã§ããŸãã
ãµã¹ãã³ã¹ã䜿çšããŠããªãããŒãžã ãšã©ããªãã®ã§ããããïŒ
以äžã®ãã¿ãã®äŸãèŠãŠã¿ãŸãããã
function Page() {
const [activeTab, setActiveTab] = useState('home');
return (
<>
<TabButton onClick={() => setActiveTab('home')}>
Home
</TabButton>
<TabButton onClick={() => setActiveTab('video')}>
Video
</TabButton>
{activeTab === 'home' && (
<Home />
)}
{activeTab === 'video' && (
<Video />
)}
</>
)
}ãã®å ŽåãReact ã¯ããŒãžå
šäœãäžåºŠã«ãã€ãã¬ãŒã·ã§ã³ããªããã°ãªããŸãããHome ãŸã㯠Video ã®ã¬ã³ããŒãé
ãå Žåããã€ãã¬ãŒã·ã§ã³äžã«ã¿ããã¿ã³ãåå¿ããªãããã«æããããå¯èœæ§ããããŸãã
ã¢ã¯ãã£ããªã¿ãã®åšãã«ãµã¹ãã³ã¹ã远å ããã°ãããã¯è§£æ±ºããŸãã
function Page() {
const [activeTab, setActiveTab] = useState('home');
return (
<>
<TabButton onClick={() => setActiveTab('home')}>
Home
</TabButton>
<TabButton onClick={() => setActiveTab('video')}>
Video
</TabButton>
<Suspense fallback={<Placeholder />}>
{activeTab === 'home' && (
<Home />
)}
{activeTab === 'video' && (
<Video />
)}
</Suspense>
</>
)
}âŠããããååã¬ã³ããŒæã« Placeholder ãã©ãŒã«ããã¯ã衚瀺ããããããUI ã®èŠãç®ãå€ãã£ãŠãããŸããŸãã
代ããã« Activity ã䜿çšããããšãã§ããŸããActivity ããŠã³ããªã¯åãè¡šç€ºç¶æ ãåãæ¿ããããã®ãã®ãªã®ã§ããã§ã«èªç¶ãšã³ã³ããŒãã³ãããªãŒãç¬ç«ãããŠãããã«åå²ããŠããããšã«ãªããŸããã€ãŸããµã¹ãã³ã¹ãšåæ§ããã®æ©èœã«ããéžæçãã€ãã¬ãŒã·ã§ã³ãæ§æããããšãã§ããã®ã§ãã
äžèšã®äŸãæŽæ°ããŠãã¢ã¯ãã£ããªã¿ãã®åšãã« Activity ããŠã³ããªã䜿çšããŠã¿ãŸãããã
function Page() {
const [activeTab, setActiveTab] = useState('home');
return (
<>
<TabButton onClick={() => setActiveTab('home')}>
Home
</TabButton>
<TabButton onClick={() => setActiveTab('video')}>
Video
</TabButton>
<Activity mode={activeTab === "home" ? "visible" : "hidden"}>
<Home />
</Activity>
<Activity mode={activeTab === "video" ? "visible" : "hidden"}>
<Video />
</Activity>
</>
)
}ããã§ããµãŒãã§ã¬ã³ããŒãããåæ HTML ã¯å
ã®ããŒãžã§ã³ãšåãã«ãªããŸãããActivity ã®ãããã§ãReact 㯠Home ã Video ãããŠã³ãããåã«ãã¿ããã¿ã³ãå
ã«ãã€ãã¬ãŒãããããšãã§ããŸãã
ãã®ããã«ãã³ã³ãã³ããé衚瀺ã«ããã衚瀺ãããããããšã«å ããŠãActivity ããŠã³ããªã¯ãããŒãžã®ã©ã®éšåãç¬ç«ããŠæäœå¯èœã«ãªãããã React ã«ç¥ãããããšã§ããã€ãã¬ãŒã·ã§ã³äžã®ã¢ããªã®ããã©ãŒãã³ã¹ãåäžãããã®ã«åœ¹ç«ã¡ãŸãã
ãããŠããŒãžãã³ã³ãã³ãã®äžéšãé衚瀺ã«ããããšããªãå Žåã§ããåžžã« visible 㪠Activity ããŠã³ããªã远å ããããšã§ããã€ãã¬ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããããšãå¯èœã§ãã
function Page() {
return (
<>
<Post />
<Activity>
<Comments />
</Activity>
</>
);
}ãã©ãã«ã·ã¥ãŒãã£ã³ã°
é衚瀺ã³ã³ããŒãã³ãã«æãŸãããªãå¯äœçšããã
Activity ããŠã³ããªã¯ãåã« display: none ãèšå®ãããã®ãšãã§ã¯ããã¯ãªãŒã³ã¢ããããããšã§ãã³ã³ãã³ããé衚瀺ã«ããŸãããããã£ãŠãå¯äœçšãé©åã«ã¯ãªãŒã³ã¢ããããè¡åã®è¯ã React ã³ã³ããŒãã³ãã®ã»ãšãã©ã¯ãActivity ã«ãã£ãŠé衚瀺ã«ãããŠãåé¡ãªãåäœããã¯ãã§ãã
ããããé衚瀺ã«ãããã³ã³ããŒãã³ãããã¢ã³ããŠã³ããããå Žåãšã¯ç°ãªãåäœãããç¶æ³ãååšããŸããç¹ã«é¡èãªã®ã¯ãé衚瀺ã³ã³ããŒãã³ãã® DOM ã¯ç Žæ£ãããªãããããã® DOM ããã®å¯äœçšã¯ãã³ã³ããŒãã³ããé衚瀺ã«ãªã£ãåŸã§ãæç¶ãããšããããšã§ãã
äŸãšããŠã<video> ã¿ã°ãèããŠã¿ãŸããããéåžžãããã¯ã¯ãªãŒã³ã¢ãããå¿
èŠãšããŸããããªããªãããããªãåçããŠããæäžã§ãã£ãŠããã¿ã°ãã¢ã³ããŠã³ãããã°ãã©ãŠã¶ã§ã®ãããªãšé³å£°ã®åçã¯åæ¢ããããã§ãã以äžã®ãã¢ã§ããããªãåçããŠãã Home ãæŒããŠã¿ãŠãã ããã
import { useState } from 'react'; import TabButton from './TabButton.js'; import Home from './Home.js'; import Video from './Video.js'; export default function App() { const [activeTab, setActiveTab] = useState('video'); return ( <> <TabButton isActive={activeTab === 'home'} onClick={() => setActiveTab('home')} > Home </TabButton> <TabButton isActive={activeTab === 'video'} onClick={() => setActiveTab('video')} > Video </TabButton> <hr /> {activeTab === 'home' && <Home />} {activeTab === 'video' && <Video />} </> ); }
äºæ³éãããããªã®åçã忢ããŸããã
ã§ã¯æ¬¡ã«ããŠãŒã¶ãæåŸã«èŠèŽããŠããæç¹ã®ã¿ã€ã ã³ãŒããä¿æããŠãVideo ã¿ãã«æ»ã£ããšãã«æåããåçãçŽããªãããã«ããããšããŸãããã
ãã㯠Activity ã®çŽ æŽããããŠãŒã¹ã±ãŒã¹ã§ãïŒ
App ãæŽæ°ããŠãéã¢ã¯ãã£ããªã¿ããã¢ã³ããŠã³ããã代ããã«ãhidden ç¶æ
ã® Activity ããŠã³ããªã§é ãããã«ããä»åºŠã¯ãã¢ãã©ãåäœãããèŠãŠã¿ãŸãããã
import { Activity, useState } from 'react'; import TabButton from './TabButton.js'; import Home from './Home.js'; import Video from './Video.js'; export default function App() { const [activeTab, setActiveTab] = useState('video'); return ( <> <TabButton isActive={activeTab === 'home'} onClick={() => setActiveTab('home')} > Home </TabButton> <TabButton isActive={activeTab === 'video'} onClick={() => setActiveTab('video')} > Video </TabButton> <hr /> <Activity mode={activeTab === 'home' ? 'visible' : 'hidden'}> <Home /> </Activity> <Activity mode={activeTab === 'video' ? 'visible' : 'hidden'}> <Video /> </Activity> </> ); }
ãã£ãšïŒ ã¿ãã® <video> èŠçŽ ããŸã DOM ã«æ®ã£ãŠãããããé衚瀺ã«ãªã£ãåŸããããªãšé³å£°ãåçããç¶ããŠããŸããŸãã
ãããä¿®æ£ããã«ã¯ããããªãäžæåæ¢ããã¯ãªãŒã³ã¢ãã颿°ãæã€ãšãã§ã¯ãã远å ããŸãã
export default function VideoTab() {
const ref = useRef();
useLayoutEffect(() => {
const videoRef = ref.current;
return () => {
videoRef.pause()
}
}, []);
return (
<video
ref={ref}
controls
playsInline
src="..."
/>
);
}useEffect ã®ä»£ããã« useLayoutEffect ãåŒã³åºããŠããŸããããã¯æŠå¿µçã«ãã¯ãªãŒã³ã¢ããã³ãŒããã³ã³ããŒãã³ãã® UI ãèŠèŠçã«é衚瀺ã«ãããããšã«çµã³ã€ããŠããããã§ããéåžžã®ãšãã§ã¯ãã䜿çšãããšãïŒããšãã°ïŒåãµã¹ãã³ããããµã¹ãã³ã¹ããŠã³ããªããã¥ãŒé·ç§» (view transition) ã«ãã£ãŠã³ãŒãã®å®è¡ãé
å»¶ããå¯èœæ§ããããŸãã
æ°ããåäœãèŠãŠã¿ãŸãããããããªãåçããHome ã¿ãã«åãæ¿ãããã®åŸ Video ã¿ãã«æ»ããŠã¿ãŠãã ããã
import { Activity, useState } from 'react'; import TabButton from './TabButton.js'; import Home from './Home.js'; import Video from './Video.js'; export default function App() { const [activeTab, setActiveTab] = useState('video'); return ( <> <TabButton isActive={activeTab === 'home'} onClick={() => setActiveTab('home')} > Home </TabButton> <TabButton isActive={activeTab === 'video'} onClick={() => setActiveTab('video')} > Video </TabButton> <hr /> <Activity mode={activeTab === 'home' ? 'visible' : 'hidden'}> <Home /> </Activity> <Activity mode={activeTab === 'video' ? 'visible' : 'hidden'}> <Video /> </Activity> </> ); }
å®ç§ã«åäœããŸããïŒ ã¯ãªãŒã³ã¢ãã颿°ã«ãããActivity ããŠã³ããªã§é衚瀺ã«ãããå Žåã«ãããªã確å®ã«åæ¢ããããã«ãªããŸãããããã«è¯ãããšã«ã<video> ã¿ã°ãç Žæ£ãããªããããã¿ã€ã ã³ãŒãã¯ä¿æããããŠãŒã¶ãæ»ã£ãŠããŠèŠèŽãç¶ããéã«ãããªãå床åæåãããããŠã³ããŒããããããå¿
èŠããããŸããã
ããã¯ãé衚瀺ã«ãªãããŠãŒã¶ãããã«åã³æäœããå¯èœæ§ãé«ã UI ããŒãã«ã€ããŠãäžæç㪠DOM ã®ç¶æ ãä¿æããããã« Activity ã䜿çšã§ãããåªããäŸã§ãã
ãã®äŸã¯ã<video> ã®ãããªç¹å®ã®ã¿ã°ã§ã¯ãã¢ã³ããŠã³ããšé衚瀺ã§åäœãç°ãªãããšã瀺ããŠããŸããã³ã³ããŒãã³ããå¯äœçšãæã€ DOM ãã¬ã³ããŒããŠããŠãActivity ããŠã³ããªããããé衚瀺ã«ãããšãã«ãã®å¯äœçšãé²ãããå Žåã¯ãã¯ãªãŒã³ã¢ããããããã®é¢æ°ãè¿ããšãã§ã¯ãã远å ããããã«ããŠãã ããã
ãããæãäžè¬çã«åœãŠã¯ãŸãã®ã¯ã以äžã®ã¿ã°ã§ãã
<video><audio><iframe>
ãã ãéåžžã¯ãReact ã³ã³ããŒãã³ãã®ã»ãšãã©ã¯ãActivity ããŠã³ããªã«ãã£ãŠé衚瀺ã«ãããŠãåé¡ãªãåäœããã¯ãã§ãããããŠæŠå¿µçã«ã¯ããé衚瀺ãã® Activity ã¯ã¢ã³ããŠã³ããããŠãããã®ãšããŠèããã¹ãã§ãã
é©åãªã¯ãªãŒã³ã¢ãããè¡ã£ãŠããªããšãã§ã¯ããç©æ¥µçã«çºèŠããããã«ã<StrictMode> ã®äœ¿çšããå§ãããŸãããã㯠Activity ããŠã³ããªã ãã§ãªããReact ã®ä»ã®å€ãã®åäœã«ãšã£ãŠãéèŠã§ãã
é衚瀺ã³ã³ããŒãã³ãã®ãšãã§ã¯ããå®è¡ãããªã
<Activity> ã âhiddenâ ã®å Žåãåã®ãã¹ãŠã®ãšãã§ã¯ããã¯ãªãŒã³ã¢ãããããŸããæŠå¿µçã«ã¯ãåã¯ã¢ã³ããŠã³ããããŸãããReact ã¯åŸã§äœ¿ãããã« state ãä¿åããŸãããã㯠Activity ã®æ©èœã§ããã€ãŸããUI ã®é衚瀺éšåã«å¯ŸããŠãµãã¹ã¯ãªãã·ã§ã³ãã¢ã¯ãã£ãã«ãªããªããããé衚瀺ã³ã³ãã³ãã«å¿
èŠãªè² è·ãåæžãããŸãã
ã³ã³ããŒãã³ãã®å¯äœçšãã¯ãªãŒã³ã¢ããããããã«ãšãã§ã¯ãã®ããŠã³ãã«äŸåããŠããå Žåã¯ã代ããã«ãšãã§ã¯ãããè¿ãã¯ãªãŒã³ã¢ãã颿°å ã§ãã®äœæ¥ãè¡ãããããšãã§ã¯ãããªãã¡ã¯ã¿ãªã³ã°ããŠãã ããã
åé¡ã®ãããšãã§ã¯ããç©æ¥µçã«èŠã€ããããã«ã<StrictMode> ã远å ããããšããå§ãããŸãããã㯠Activity ã®ã¢ã³ããŠã³ããšããŠã³ããç©æ¥µçã«å®è¡ããŠãäºæããªãå¯äœçšããã£ããããŸãã