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

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

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

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

React.js

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

Q&A

解決済

2回答

603閲覧

React 渡された値によって、違う表示形式のリストを表示したい。値の渡し方、比較の仕方が正しく理解できてない。

amedama

総合スコア37

Material-UI

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

React.js

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

0グッド

1クリップ

投稿2019/12/20 05:15

編集2019/12/20 05:19

Railsで、ランキング情報とタグの一覧情報を表示しようとしています。
Material-UIのListAPIのなかで良さそうなものがあったので、それを改良して利用しようとしていました。

Railsのビューのなかで、

Rails

1= react_component("List", { 2ranks: @ranks.as_json(only:[:title,:likes_count,:id]), 3tags: @tags.as_json(only: [:name,:id,:articles_count]) })

とし、

リストのデザインは共通で、リストの表示する中身は、ランキングとタグで
別々の物を表示しようと以下のようにしました。

List

1 2import React from "react" 3import VirtualizedList from "./VirtualizedList" 4 5class List extends React.Component{ 6 render() { 7 const tags = this.props.tags; 8 const ranks = this.props.ranks; 9 return( 10 <div> 11 <VirtualizedList items={tags} name={"tag"}># Tag List</VirtualizedList> 12 <VirtualizedList items={ranks} name={"rank"}># Ranking</VirtualizedList> 13 </div> 14 ); 15 } 16} 17 18export default List

VirtualizedList

1import React from 'react'; 2import PropTypes from 'prop-types'; 3import { makeStyles } from '@material-ui/core/styles'; 4import ListItem from '@material-ui/core/ListItem'; 5import ListItemText from '@material-ui/core/ListItemText'; 6import { FixedSizeList } from 'react-window'; 7 8const useStyles = makeStyles(theme => ({ 9 root: { 10 width: '100%', 11 height: 400, 12 maxWidth: 360, 13 backgroundColor: theme.palette.background.paper, 14 }, 15})); 16 17const TagListRow = (props) => 18 <ListItem button style={props.style} key={props.id}> 19 <ListItemText> 20 # {props.name} ({props.count}) 21 </ListItemText> 22 </ListItem>; 23 24const RankingRow = (props) => 25 <ListItem button style={props.style} key={props.id}> 26 <ListItemText> 27 {props.title} Like数:{props.count} 28 </ListItemText> 29 </ListItem>; 30 31 32function renderRow(props) { 33 const { data, index, style } = props; 34 const name = props.name; 35 if ( name == "rank" ) { 36 return <RankingRow style={style} id={data[index].id} title={data[index].title} count={data[index].likes_count}/>; 37 } else { 38 return <TagListRow style={style} id={data[index].id} name={data[index].name} count={data[index].articles_count} />; 39 } 40} 41 42 43export default function VirtualizedList(props) { 44 const classes = useStyles(); 45 const items = props.items; 46 const name = props.name; 47 return ( 48 <div> 49 <h3>{props.children}</h3> 50 <div className={classes.root}> 51 <FixedSizeList height={400} width={360} itemSize={46} itemCount={items.length} itemData={items} name={name} > 52 {renderRow} 53 </FixedSizeList> 54 </div> 55 </div> 56 ); 57}

1,Listクラスで、VirtualizedListコンポーネントににnameのプロパティ を渡し、
2,VirtualizedList内では、受け取ったnameをFixedSizeListに同じくnameとして渡し、
3,renderRowの部分で受け取ったnameの中身が"rank"であるかどうかで比較し、その結果に対応したViewを出そうという考えです。

しかし、実際はrenderRow内の if (name == "rank") の比較部分が上手くいっておらず、ランキングリストを表示しようとしてもタグリストとして評価されてしまいます。

値の渡し方が悪いのか、比較式の書き方が悪いのか、解決策が思いつかず、詰まりました。

どなたかご教授よろしくお願いします。

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

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

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

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

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

guest

回答2

0

{renderRow} となっているところ、{renderRow(name)} ではないですか?

投稿2019/12/22 05:31

kit494way

総合スコア317

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

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

amedama

2019/12/23 09:17

kit49wayコメントありがとうございます。 react-windowのFixedSizeList固有のデータの渡し方などがあり、それに乗っ取ったデータの取り扱い方がちゃんと理解できていませんでした。 itemCountで表示する個数を指定、itemDataで表示する配列渡す....など kit494wayさんのアドバイスのどおりに、renderRow(name)とするとnameは渡せましたが、data,index,styleなどがrenderRowに渡らなかったので一階層上でnameの処理をすることにしました。正直なぜdata、indexなどが渡せなくなったのかまでは理解することができませんでした。 直接解決ではありまんが、kit494wayさんのアドバイスのおかげで違う角度から考えることができました。ありがとうございます。 自分の表現したいコードは書けましたので、参考になればと思い、コードを載せておきます。
guest

0

自己解決

表示したいrenderコンポーネントを種類別に用意します。(renderRowTag,renderRowRank)

VirtualizedList内で、受け取ったnameに応じて、用意したrenderコンポーネントを表示します。

List

1import React from "react" 2import VirtualizedList from "./VirtualizedList" 3 4class List extends React.Component{ 5 render() { 6 const tags = this.props.tags; 7 const ranks = this.props.ranks; 8 return( 9 <div> 10 <VirtualizedList items={tags} name={"tag"}># Tag List</VirtualizedList> 11 <VirtualizedList items={ranks} name={"rank"}># Ranking</VirtualizedList> 12 </div> 13 ); 14 } 15} 16 17export default List

VirtualizedList

1----import文省略--- 2 3const useStyles = makeStyles(theme => ({ 4 root: { 5 width: '100%', 6 height: 400, 7 maxWidth: 360, 8 backgroundColor: theme.palette.background.paper, 9 }, 10})); 11 12function renderRowRank(props) { 13 const { data, index, style } = props; 14 console.log(data.rank[index].title); 15 return ( 16 <ListItem button style={style} key={index} > 17 <ListItemText primary={"No" + (index + 1) + data.rank[index].title + data.rank[index].likes_count} /> 18 </ListItem> 19 ); 20} 21 22function renderRowTag(props) { 23 const { data, index, style } = props; 24 console.log(data.tag[index].name); 25 return ( 26 <ListItem button style={style} key={index}> 27 <ListItemText primary={"# " + data.tag[index].name} /> 28 </ListItem> 29 ); 30} 31 32export default function VirtualizedList(props) { 33 const classes = useStyles(); 34 const items = props.items; 35 const name = props.name; 36 const render = (name === "rank") ? renderRowRank : renderRowTag; 37 const count = (name === "rank") ? items.rank.length : items.tag.length; 38 return ( 39 <div className={classes.root}> 40 <h4>{props.children}</h4> 41 <FixedSizeList height={400} width={360} itemSize={46} itemCount={count} itemData={items} > 42 {render} 43 </FixedSizeList> 44 </div> 45 ); 46} 47

投稿2019/12/23 09:25

amedama

総合スコア37

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問