2016-06-13 3 views
0

며칠 전에 React를 공부하기 시작 했으므로이 질문이 정말로 어리 석다면 용서해주십시오.material-ui의 GridList에서 속성 추출하기

이 작업 할당에서 material-ui의 GridList를 사용하여 'Like'시스템을 구현해야합니다. 거기에 같은 버튼을 클릭하여 사용자가 그들을 좋아할 수있는 총 8 개의 사진이있을 것입니다. 현재 코드에서 사용자는 같은 버튼을 클릭 할 수 있지만 같은 버튼은 모두 하나의 버튼 대신 영향을받습니다. 또한, 좋아하는 사람의 수가 증가하지 않습니다.

내 질문은 사용자가 '좋아요'버튼을 클릭 할 때 좋아하는 수를 어떻게 바꿀 수 있으며 하나의 버튼 만 영향을 받는지 확인하는 것입니다. 나는 소도구와 심지어 lodash를 시도했지만 나는 그 문제를 알아낼 수없는 것 같습니다. 아래는 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 구성 요소에 래퍼를 만듭니다. Grid 구성 요소는 구성 요소를 호출하여 루프 내부에 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, 
    } 
모양을 후 당신이 '온 클릭'이벤트 을에서 사용하는 방법을 삭제 정의해야