2016-06-13 4 views
0

私は数日前にReactを研究し始めたので、この質問が本当に馬鹿に聞こえたら私を許してください。Material-uiのGridListからプロパティを抽出

この作業割り当てでは、material-uiのGridListを使用して 'Like'システムを実装する必要があります。同じようなボタンをクリックすると、ユーザーが好きな写真が合計8枚表示されます。私の現在のコードでは、ユーザーは好きなボタンをクリックすることができますが、好きなボタンはすべて1つではなく影響を受けます。さらに、好き嫌いは増えない。

私の質問は、ユーザーが「好き」ボタンをクリックして1つのボタンだけが影響を受けることを確認したときの好き嫌いの数をどのように変更できますか?私は小道具やロダッシュを試しましたが、問題を理解できないようです。以下は私のGridList部分のコード全体です。どんな助けでも大歓迎です。

import _ from 'lodash'; 
import React from 'react'; 
import {GridList, GridTile} from 'material-ui/GridList'; 
import Subheader from 'material-ui/Subheader'; 
import baseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; 
import getMuiTheme from 'material-ui/styles/getMuiTheme'; 

//GridList style 
const styles = { 
    root: { 
    display: 'flex', 
    flexWrap: 'wrap', 
    justifyContent: 'space-around', 
    }, 
    gridList: { 
    width: 1000, 
    height: 500, 
    }, 
}; 

//data for the GridList 
var tilesData = [ 
    { 
    img: './images/image_01.jpg', 
    title: 'Breakfast', 
    likes: 0, 
    }, 
    { 
    img: './images/image_02.jpg', 
    title: 'Tasty burger', 
    likes: 0, 
    }, 
    { 
    img: './images/image_03.jpg', 
    title: 'Camera', 
    likes: 0, 
    }, 
    { 
    img: './images/image_04.jpg', 
    title: 'Morning', 
    likes: 0, 
    }, 
    { 
    img: './images/image_05.jpg', 
    title: 'Hats', 
    likes: 0, 
    }, 
    { 
    img: './images/image_06.jpg', 
    title: 'Honey', 
    likes: 0, 
    }, 
    { 
    img: './images/image_07.jpg', 
    title: 'Vegetables', 
    likes: 0, 
    }, 
    { 
    img: './images/image_08.jpg', 
    title: 'Water plant', 
    likes: 0, 
    }, 
]; 

export default class Grid extends React.Component { 
    constructor(props){ 
    super(props); 
    this.state = { 
     like: false, 
     likes: tilesData.likes, 
    }; 
    this.post = this.post.bind(this); 
    this.delete = this.delete.bind(this); 
    } 

    //if Like button is clicked 
    post(){ 
     this.setState({ like: true}); 
     let likes = this.state.likes; 
     likes++; 
     this.setState({likes: likes}); 
     //this.tilesData.likes = likes; 
    } 

    //if Like button is "unclicked" 
    delete(){ 
     this.setState({ like: false}); 
     let likes = this.state.likes; 
     likes--; 
     this.setState({likes: likes}); 
     //this.tilesData.likes = likes; 
    } 

    getChildContext() { 
    return { muiTheme: getMuiTheme(baseTheme) }; 
    } 

    render(){ 
    const likeBtn = this.state.like ? <img src="./images/icons/icon_2.png" onClick={this.delete} /> : <img src="./images/icons/icon_1.png" onClick={this.post} />; 
    return (
     <div style={styles.root}> 
     <GridList 
      cellHeight={200} 
      cols={4} 
      style={styles.gridList} 
     > 
     <Subheader>December</Subheader> 
     {tilesData.map((tile) => (
      <GridTile 
      key={tile.img} 
      title={tile.title} 
      subtitle={<span>Likes: <b>{tile.likes}</b></span>} 
      actionIcon={likeBtn} 
      > 
      <img src={tile.img} /> 
      </GridTile> 
     ))} 
     </GridList> 
     </div> 
    ); 
    } 
} 

Grid.childContextTypes = { 
    muiTheme: React.PropTypes.object.isRequired, 
} 

答えて

0

通報

ようなボタンの「状態」ループ外で定義されているのと同じ「状態」(すべての画像のために)全てGridTileコンポーネントと共有されることを意味します。

あなたは、あなたが グリッドある親コンポーネント内のボタンと同じ「状態」「のように」すべての のようなボタンに使用されたの「状態」を変更しているボタン「のような」をクリックしたとき。

だから、のようにすべてボタンに影響しています。

ソリューション

'状態' は、それぞれなどのボタンで個別に定義する必要があります。 投稿のメソッドは、GridTileのループ手段の中で定義する必要があります。

GridTileはmaterial-uiライブラリの一部ですので、このライブラリを変更する代わりに、GridTileコンポーネント上にラッパーを作成してください。 グリッドコンポーネントはコンポーネント内でループ内のGridTileCustomコンポーネントを呼び出します。

インサイドGridTileCustomコンポーネントを使用するには、だからあなたの最終的なコードが

import React from 'react'; 
    import {GridList, GridTile} from 'material-ui/GridList'; 
    import Subheader from 'material-ui/Subheader'; 
    import baseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'; 
    import getMuiTheme from 'material-ui/styles/getMuiTheme'; 
    import IconButton from 'material-ui/IconButton'; 

    const thumbsIcon = "glyphicon glyphicon-thumbs-up"; 

    const styles = { 
    root: { 
    display: 'flex', 
    flexWrap: 'wrap', 
    justifyContent: 'space-around', 
    }, 
    gridList: { 
    width: 1000, 
    height: 500, 
    }, 
    }; 

    var tilesData = [ 
    { 
    img: './images/image_01.jpg', 
    title: 'Breakfast', 
    likes: 0, 
    icon: './images/icons/icon_1.png', 
    }, 
    { 
    img: './images/image_02.jpg', 
    title: 'Tasty burger', 
    likes: 0, 
    icon: './images/icons/icon_1.png', 
    }, 
    { 
    img: './images/image_03.jpg', 
    title: 'Camera', 
    likes: 0, 
    icon: './images/icons/icon_1.png', 
    }, 
    { 
    img: './images/image_04.jpg', 
    title: 'Morning', 
    likes: 0, 
    icon: './images/icons/icon_1.png', 
    }, 
    { 
    img: './images/image_05.jpg', 
    title: 'Hats', 
    likes: 0, 
    icon: './images/icons/icon_1.png', 
    }, 
    { 
    img: './images/image_06.jpg', 
    title: 'Honey', 
    likes: 0, 
    icon: './images/icons/icon_1.png', 
    }, 
    { 
    img: './images/image_07.jpg', 
    title: 'Vegetables', 
    likes: 0, 
    icon: './images/icons/icon_1.png', 
    }, 
    { 
    img: './images/image_08.jpg', 
    title: 'Water plant', 
    likes: 0, 
    icon: './images/icons/icon_1.png', 
    }, 
    ]; 

    export default class Grid extends React.Component { 
    constructor(props){ 
    super(props); 
    this.state = { 
     like: false, 
     likes: tilesData.likes, 
    }; 
    // this.post = this.post.bind(this); 
    // this.delete = this.delete.bind(this); 
    } 

    // post(){ 
    //  this.setState({ like: true}); 
    //  let likes = this.state.likes; 
    //  likes++; 
    //  this.setState({likes: likes}); 
    //  //this.tilesData.likes = likes; 
    // } 

    // delete(){ 
    //  this.setState({ like: false}); 
    //  let likes = this.state.likes; 
    //  likes--; 
    //  this.setState({likes: likes}); 
    //  //this.tilesData.likes = likes; 
    // } 

    getChildContext() { 
    return { muiTheme: getMuiTheme(baseTheme) }; 
    } 

    render(){ 
    return (
     <div style={styles.root}> 
     <GridList 
      cellHeight={200} 
      cols={4} 
      style={styles.gridList} 
     > 
     <Subheader>December</Subheader> 
     {tilesData.map((tile) => (
      <GridTileInternal 
      key={tile.img} 
      img={tile.img} 
      title={tile.title} 
      subtitle={tile.likes} 
      // actionIcon={likeBtn} 
      > 
      </GridTileInternal> 
     ))} 
     </GridList> 
     </div> 
    ); 
    } 
    } 

    class GridTileInternal extends React.Component { 
    constructor(props){ 
    super(props); 
    this.state = { 
     like: false, 
     likes: tilesData.likes, 
    }; 
    this.post = this.post.bind(this); 
    this.delete = this.delete.bind(this); 
    } 

    post(){ 
     this.setState({ like: true}); 
     let likes = this.state.likes; 
     likes++; 
     this.setState({likes: likes}); 
     //this.tilesData.likes = likes; 
    } 

    delete(){ 
     this.setState({ like: false}); 
     let likes = this.state.likes; 
     likes--; 
     this.setState({likes: likes}); 
     //this.tilesData.likes = likes; 
    } 


    render(){ 
    const likeBtn = this.state.like ? <img src="./images/icons/icon_2.png" onClick={this.delete} /> : <img src="./images/icons/icon_1.png" onClick={this.post} />; 
    return (
      <GridTile 
      key={this.props.img} 
      title={this.props.title} 
      subtitle={<span>Likes: <b>{this.props.subtitle}</b></span>} 
      actionIcon={likeBtn} 
      > 
      <img src={this.props.img} /> 
      </GridTile> 
    ); 
    } 
    } 

    Grid.childContextTypes = { 
    muiTheme: React.PropTypes.object.isRequired, 
    } 
ようになります ポストにあなたが「オンクリック」イベント をで使用している方法を削除定義する必要があります
関連する問題