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") の比較部分が上手くいっておらず、ランキングリストを表示しようとしてもタグリストとして評価されてしまいます。
値の渡し方が悪いのか、比較式の書き方が悪いのか、解決策が思いつかず、詰まりました。
どなたかご教授よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/23 09:17