質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Material-UI

Material-UIは、Material Designを利用可能なオープンソースのReact向けUIコンポーネントキットです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

2163閲覧

React×Typescriptにおけるmaterial-uiのtabの挙動がおかしい

it-tsumugi

総合スコア11

Material-UI

Material-UIは、Material Designを利用可能なオープンソースのReact向けUIコンポーネントキットです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

1クリップ

投稿2021/07/23 04:10

編集2021/07/26 03:48

#解決したいこと
現在React×Typescript×styled-components×material-uiでポートフォリオサイトを作ろうと考えています。
matterial-uiのTab,Tabs,AppBarを用いてヘッダーをを作成できたのですが、サイトのホームから他のタブに移る際の動作がおかしいです。
この問題に関連していそうなソースを一応載せておきます

App.tsx

1import { ComponentRouter } from "./router/ComponentRouter"; 2import { StylesProvider } from '@material-ui/styles'; 3import {MuiThemeProvider} from '@material-ui/core/styles' 4 5import {theme} from './assets/styles/theme' 6 7export function App (){ 8 return ( 9 <StylesProvider injectFirst> 10 <MuiThemeProvider theme={theme}> 11 <ComponentRouter /> 12 </MuiThemeProvider> 13 </StylesProvider> 14 ); 15}; 16

ComponentRouter.tsx

1import { BrowserRouter, Route, Switch } from "react-router-dom"; 2import { FC } from "react"; 3import { DefaultLayout } from "../components/templates/DefaultLayout"; 4import { HeaderOnly } from "../components/templates/HeaderOnly"; 5import { Home } from "../components/pages/Home"; 6import { Profile } from "../components/pages/Profile"; 7import { Skill } from "../components/pages/Skill"; 8import { Product } from "../components/pages/Product"; 9import { Book } from "../components/pages/study/Book"; 10import { Contact } from "../components/pages/Contact"; 11 12export const Path = { 13 home: "/", 14 profile: "/profile", 15 skill: "/skill", 16 product: "/product", 17 study: "/book", 18 contact: "/contact", 19 }; 20 21 22export const ComponentRouter:FC = () =>{ 23 return ( 24 <BrowserRouter basename={process.env.PUBLIC_URL}> 25 <Switch> 26 <Route exact path={Path.home}> 27 <DefaultLayout> 28 <Home /> 29 </DefaultLayout> 30 </Route> 31 <Route path={Path.profile}> 32 <HeaderOnly> 33 <Profile /> 34 </HeaderOnly> 35 </Route> 36 <Route path={Path.skill}> 37 <HeaderOnly> 38 <Skill /> 39 </HeaderOnly> 40 </Route> 41 <Route path={Path.product}> 42 <HeaderOnly> 43 <Product /> 44 </HeaderOnly> 45 </Route> 46 <Route path={Path.study}> 47 <HeaderOnly> 48 <Book /> 49 </HeaderOnly> 50 </Route> 51 <Route path={Path.contact}> 52 <HeaderOnly> 53 <Contact /> 54 </HeaderOnly> 55 </Route> 56 </Switch> 57 </BrowserRouter> 58 ); 59}

Header.tsx

1import styled from "styled-components"; 2import {VFC, } from "react"; 3import { Link, useHistory} from "react-router-dom"; 4 5import { Tab, Tabs, AppBar } from "@material-ui/core"; 6 7interface headerItemPropsType{ 8 id: number; 9 route: string; 10 label: string 11} 12const headerItem: headerItemPropsType[] = [ 13 { 14 id: 1, 15 route: "/", 16 label: "HOME", 17 }, 18 { 19 id: 2, 20 route: "/profile", 21 label: "PROFILE", 22 }, 23 { 24 id: 3, 25 route: "/skill", 26 label: "SKILL", 27 }, 28 { 29 id: 4, 30 route: "/product", 31 label: "PRODUCT", 32 }, 33 { 34 id: 5, 35 route: "/book", 36 label: "STUDY", 37 }, 38 { 39 id: 6, 40 route: "/contact", 41 label: "CONTACT", 42 }, 43]; 44 45export const Header: VFC = () => { 46 const history = useHistory(); 47 return ( 48 <SAppBar position="static" color="inherit"> 49 <Tabs 50 value={history.location.pathname} 51 variant="fullWidth" 52 indicatorColor="secondary" 53 centered 54 aria-label="simple tabs example" 55 > 56 {headerItem.map((val) => { 57 return ( 58 <Tab 59 label={val.label} 60 value={val.route} 61 key={val.id} 62 component={Link} 63 to={val.route} 64 /> 65 ); 66 })} 67 </Tabs> 68 </SAppBar> 69 ); 70}; 71const SAppBar = styled(AppBar)` 72 background: #193278; 73 color: #fff; 74 padding: 8px 0; 75`;

#質問内容

公開しているサイトのHOMEから他のタブに移動(書き換え)する際のみ、インジケータが滑らかに移動しません。
これがなぜなのか分かる方がいらっしゃれば回答いただけるとありがたいです。

#やったこと
material-uiのドキュメントも見たのですが、分かりませんでした。
stateを用いて書いてみたり、useLocationをしたりしたのですが変わりませんでした。
そもそもなぜインジケータが滑らかに移動しているのかがmaterial-uiにブラックボックス化されているので原因が全く分かりません。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anozon

2021/07/23 04:57

<Tabs の部分で `history.location.pathname` が "/" と想定している部分で "" が返ってきているという可能性はどうですか?
it-tsumugi

2021/07/23 10:48

console.log()で確認しましたが"/"が返ってきていました。
anozon

2021/07/24 01:44

一旦 / を無くして /top にしてみるのはどうですか? あとはタブの順序を変えるなど
it-tsumugi

2021/07/24 04:17

/topにしたらホームは映らなくなりました。 順番を変えても直りません。homeから他のタブ、他のタブからhomeへの移動がやはりスムーズにいきません。
guest

回答1

0

ベストアンサー

ルート内にそれぞれヘッダーを書いているため、タブをクリックする度にヘッダ部分も再描画(再配置)されていてなめらかに移動していないように見えるだけではないでしょうか?
HeaderはRoute外に設置して一度だけ配置されるようにするべきではないでしょうか。

投稿2021/07/27 02:01

p19ljk

総合スコア146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

it-tsumugi

2021/07/27 14:59

直りました。ありがとうございます。 atomicDesignを意識した結果template内のコンポーネントで別々に配置してこうなってしまったのですが、通常ヘッダーは別に設置するものなのでしょうか。
p19ljk

2021/07/28 01:18

ヘッダーをそれぞれProfileとかSkillに書かずにHeaderOnlyというコンポーネントに分割している、という点でAtomic Designは達成されています。(それぞれを別々に配置するかはAtomicDesignの範疇外?) ヘッダは別設置ですねー。 それぞれのコンポーネントを表示エリアだと考え、そのエリアがどの親に属するのが正しいのかを意識すると良いのではないでしょうか。 今回の場合ですとProfileだったりSkillだったりがHeaderエリアの子であることが正しいのかというところですね。 ページの構造としてヘッダエリアとコンテンツエリアがあって、このコンテンツエリア部分がルータによって切り替わるというのが正しい構造だと思います。 元のソースだとページにヘッダエリアのみ存在してそのヘッダエリア内にコンテンツが配置されている。 そして、ルータでヘッダエリアまるごと切り替わるという形になっているので、やはり正しい構造ではないかと。 うまく説明できているかわかりませんが、ご参考までに。
it-tsumugi

2021/07/28 08:28

分かりやすい解説でよく分かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問