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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Riot.js

Riot.jsは、React.jsに似たコンポーネント指向なJSフレームワークです。非常に軽量であり、コンポーネントで設計しやすいといったメリットがあります。また、MVCのように分割できることも特徴です。

JavaScript

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

Q&A

解決済

1回答

1635閲覧

Riot.jsのタブの中でアイコンを使用する方法を教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

Riot.js

Riot.jsは、React.jsに似たコンポーネント指向なJSフレームワークです。非常に軽量であり、コンポーネントで設計しやすいといったメリットがあります。また、MVCのように分割できることも特徴です。

JavaScript

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

0グッド

0クリップ

投稿2016/09/18 13:17

編集2016/09/19 16:03

HTML

1<ul> 2 <li each={ tab, i in tabs } class="tabItem { is-active: parent.isActiveTab(tab.ref) }" onclick={ parent.toggleTab }>{tab.title}</li> 3</ul> 4<div class="tabContent"> 5 <div each={ tab, i in tabs } class="tabContent__item { is-active: parent.isActiveTab(tab.ref) }">{tab.content}</div> 6</div>

Javascript

1this.tabs = [ 2 { title: <i class='fa fa-picture-o' aria-hidden='true'></i>, ref: 'tab1', content: "aaa" }, 3 { title: 'Tab 2', ref: 'tab2', content: "bbb" }, 4 { title: 'Tab 3', ref: 'tab3', content: "ccc" } 5] 6 7this.activeTab = 'tab1' 8isActiveTab(tab) { 9 return this.activeTab === tab 10} 11 12toggleTab(e) { 13 this.activeTab = e.item.tab.ref 14 return true 15}

HTML側に記述

上記のようなコードだと、JacaScript側の2行目にあるようにHTML表記のものを入れてしまうと、rollupでのコンパイル時にエラーが表示されてしまったため、下記のようにHTML側に記述する方法をいろいろ試してみたのですが、タブのコンテンツ側をうまく表示させることができなくて困っています。
現状、ロードした時点で、tab1のコンテンツも表示されない状況です。

また、toggleTab関数の方ではtab.refという変数がなくなってしまったために、どうやってタブを切り替えるのかもわからなくなってしまいました。。
どのようにすれば良いかわかる方、教えていただければと思います。

HTML

1<ul> 2 <li class="tabItem {is-active: parent.isActiveTab(tab1) }" onclick={ parent.toggleTab }> <span class='fa fa-picture-o' aria-hidden='true'></span> </li> 3 <li class="tabItem {is-active: parent.isActiveTab(tab2) }" onclick={ parent.toggleTab }>Tab 2</li> 4 <li class="tabItem {is-active: parent.isActiveTab(tab3) }" onclick={ parent.toggleTab }>Tab 3</li> 5</ul> 6<div class="tabContent"> 7 <div class="tabContent__item { is-active: parent.isActiveTab(tab1) }">(1) Lorem ispum dolor...</div> 8 <div class="tabContent__item { is-active: parent.isActiveTab(tab2) }">(2) Lorem ispum dolor...</div> 9 <div class="tabContent__item { is-active: parent.isActiveTab(tab3) }">(3) Lorem ispum dolor...</div> 10</div>

Javascript

1this.activeTab = 'tab1' 2isActiveTab(tab) { 3 return this.activeTab === tab 4} 5 6toggleTab(e) { 7 this.activeTab = e.item.tab.ref 8 return true 9}

2つの組み合わせ

HTML

1<ul> 2 <li each={ tab, i in tabs } class="tabItem { is-active: parent.isActiveTab(tab.ref) }" onclick={ parent.toggleTab }><i class="fa { tab.title }" aria-hidden="true"></i></li> 3</ul> 4<div class="tabContent"> 5 <div class="tabContent__item { is-active: parent.isActiveTab(tab1) }">(1) Lorem ispum dolor...</div> 6 <div class="tabContent__item { is-active: parent.isActiveTab(tab2) }">(2) Lorem ispum dolor...</div> 7 <div class="tabContent__item { is-active: parent.isActiveTab(tab3) }">(3) Lorem ispum dolor...</div> 8</div>

Javascript

1this.tabs = [ 2 { title: 'fa-picture-o', ref: 'tab1' }, 3 { title: 'fa-picture-o', ref: 'tab2' }, 4 { title: 'fa-picture-o', ref: 'tab3' } 5] 6 7this.activeTab = 'tab1' 8isActiveTab(tab) { 9 return this.activeTab === tab 10} 11 12toggleTab(e) { 13 this.activeTab = e.item.tab.ref 14 return true 15}

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

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

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

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

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

guest

回答1

0

ベストアンサー

これか
title: '<i class="fa fa-picture-o" aria-hidden="true"></i>',
これ
title: '<i class=&quot;fa fa-picture-o&quot; aria-hidden=&quot;true&quot;></i>',
ではいかがでしょうか?

投稿2016/09/18 13:30

編集2016/09/18 13:32
gin

総合スコア2722

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

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

退会済みユーザー

退会済みユーザー

2016/09/18 14:48

またまたご回答ありがとうございます。 そちらも試してみたのですが、そもそも''で囲ってあると、文字列認識されてしまい、文字列をしてそのまま表示されてしまいます。 そして上下両方とも''を外すとコンパイル時にエラーが出てしまうという状況です。
gin

2016/09/18 14:56

ああ、なるほどタグがそのまま表示されてしまうということですね。 エスケープを使ってみるのはどうでしょう? title: '<i class=\"fa fa-picture-o\" aria-hidden=\"true\"><\/i>',
退会済みユーザー

退会済みユーザー

2016/09/18 15:03

そのまま <i class="fa fa-picture-o" aria-hidden="true"></i> と表示されてしまいました。。 本当にいろいろと申し訳ありません。
gin

2016/09/18 15:30

こちらこそ大した知識なく思いつきで実験をさせてしまってすみません。 いろいろ思いつくので環境があれば自分で試してみるのですが… 「<」「>」もエスケープしてみたです… title: '\x3ci class=\"fa fa-picture-o\" aria-hidden=\"true\"\x3e\x3c\/i\x3e', これがダメなら共通部分はhtml側に書いて変数的な部分だけを文字列で扱って挿入するくらいですね…
退会済みユーザー

退会済みユーザー

2016/09/18 16:18

エスケープしても結果は変わりませんでした。。 HTML側に書くことにします。 本当にいろいろとありがとうございました。
退会済みユーザー

退会済みユーザー

2016/09/19 15:08

昨日もたくさんご質問させていただいて、時間が経ってしまってしまってからまたご質問させていただく形で申し訳ございません。 HTML側に記述する方法で今晩いろいろ試してみたのですが、タブのコンテンツ側をうまく表示させることができなくて困っています。 上記質問の「HTML側に記述」以下に自分のコードを貼り付けているのですが、何がいけないかわかりますでしょうか? 現状、ロードした時点で、tab1のコンテンツも表示されない状況です。 また、toggleTab関数の方ではtab.refという変数がなくなってしまったために、どうやってタブを切り替えるのかもわからなくなってしまいました。。 もしわかることがありましたら、教えていただければと思います。
gin

2016/09/19 15:31

昨日と結構形変わってますね? 昨日のではダメだったんですか? <ul> <li each={ tab, i in tabs } class="tabItem { is-active: parent.isActiveTab(tab.ref) }" onclick={ parent.toggleTab }><span class="fa fa-picture-o" aria-hidden="true"></span>{tab.title}</li> </ul>
退会済みユーザー

退会済みユーザー

2016/09/19 15:39

はい。。 そのようにしてしまうと、タブのコンテンツに「テキスト入力エリア」や「画像アップロードボタン」など、タブのタイトルによって表示を切り替えることができなくなってしまうためです。 タブのタイトル毎にアイコンを変更するだけなら「fa-picture-o」の部分のために、tabsの中にclassプロパティを作ればいいと思ったのですが。
gin

2016/09/19 15:51 編集

そこまでコンテンツの中身がガッツリあるようであればコンテンツの中身は普通にHTMLで記述し、切り替えのみをJSで行えばいい気がします。 2つの組み合わせですね。 <ul> <li each={ tab, i in tabs } class="tabItem { is-active: parent.isActiveTab(tab.ref) }" onclick={ parent.toggleTab }><span class="fa fa-picture-o" aria-hidden="true"></span>{tab.title}</li> </ul> <div class="tabContent"> <div class="tabContent__item { is-active: parent.isActiveTab(tab1) }">(1) Lorem ispum dolor...</div> <div class="tabContent__item { is-active: parent.isActiveTab(tab2) }">(2) Lorem ispum dolor...</div> <div class="tabContent__item { is-active: parent.isActiveTab(tab3) }">(3) Lorem ispum dolor...</div> </div>
退会済みユーザー

退会済みユーザー

2016/09/19 16:04

二つを組み合わせると質問内容に追加した「2つの組み合わせ」のようになると思うのですが、これではタブの中のコンテンツが表示されなくて困っています。。 どこか間違っていますでしょうか?
gin

2016/09/19 16:23 編集

コンテンツの方に「is-active」が付かなくて表示されないということですね。 たしかに。 アクティブになったタブの位置を取得して同じ位置のコンテンツに「is-active」を付与するって形でしょうね。 RiotJSの書き方がちょっと分からないので、別立てで分かる方に聞いた方がいいかも知れないです…
退会済みユーザー

退会済みユーザー

2016/09/19 16:26

そうですよね。 わかりました。本当にいろいろとありがとうございました。
退会済みユーザー

退会済みユーザー

2016/09/19 16:39

parent.isActiveTab(tab1)の部分をisActiveTab('tab1')に変更したら無事にできました。 eachを回さないためparentでアクセスしなくていいことと、tab.refが変数だったのに対してtab1は文字列なので表記を変更することが必要でした。 いろいろな組み合わせを試していたのですが、この組み合わせが漏れてしまっていたようです。。 本当にいろいろとありがとうございました。
gin

2016/09/19 16:40

おー。よかったです。 形が全然違いますが参考にと思って拾って来たものとりあえず貼り付けておきます。 http://www.cyokodog.net/blog/riot/
退会済みユーザー

退会済みユーザー

2016/09/19 16:44

こちらも参考にさせていただきます。 最後までありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問