2017-04-07 105 views
0

想知道是否有方法可以渲染沒有構造函數的組件。使用onClick時的反應渲染

以下是我的onClick代碼。我的目標是在單擊按鈕時呈現,以便按鈕消失。 我不知道是否有辦法使這個不創建

constructor(props) { 
     super(props); 
     this.state = {} 
} 






<div> 
    <h1>Title: {post.title}</h1> 
    <h2>Pages: {post.pages}</h2> 
    <div>Reviews:</div> 
    <button 
     onClick={() => { this.props.addToMyPage(
       { 
        userId: user.user.user_id, 
        bookId: post.book_id 
       } 
     )}}> 
     Add this to my page 
    </button> 
</div> 
) 

d

import React, { Component } from 'react'; 
import { connect } from 'react-redux'; 
import { selectBook } from '../actions/index'; 
import { addToMyPage } from '../actions/index'; 
import { Link } from 'react-router'; 
import { selectUser } from '../actions/index.js'; 
import { getBooks } from '../actions/index'; 
import _ from 'lodash'; 

class BookDetails extends Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      show: true 
     }; 
    }  
    componentWillMount() { 
     this.props.selectBook(this.props.params.id) 
     if(this.props.user) { 
      this.props.selectUser(this.props.user.user.user_id); 
     } 
     else { 
      this.props.selectBook(this.props.params.id); 
     } 
    } 

    renderList() { 

     const elems = []; 
     const urlId = parseInt(this.props.params.id); 
     this.props.list.forEach((list) => { 
      console.log("list", list.book_id); 
      console.log("params", this.props.params.id) 
       if(list.book_id === urlId) { 
        console.log("true"); 
        elems.push({ 
         book: list.book_id 
        }) 
       } 
     }) 
     return elems; 
    } 
    render() { 
     const {post} = this.props; 
     const {user} = this.props; 
     const {list} = this.props; 
     const renderList = this.renderList(); 
     const urlId = parseInt(this.props.params.id); 

     if(!post) { 
      return <div>Loading...</div> 
     } 

     if(user && list) { 
      if(urlId === _.get(renderList, '[0].book')) { 
       return (
        <div> 
         <h1>Title: {post.title}</h1> 
         <h2>Pages: {post.pages}</h2> 
         <div>Reviews:</div> 
        </div> 
       ) 
      } 
      else { 
       return (
        <div> 
         <h1>Title: {post.title}</h1> 
         <h2>Pages: {post.pages}</h2> 
         <div>Reviews:</div> 
         {this.state.show && <button 
          onClick={() => { this.setState({show:false}, this.props.addToMyPage(
           { 
            userId: user.user.user_id, 
            bookId: post.book_id 
           } 
           ))}}> 
          Add this to my page 
         </button> 
        </div> 
       ) 
      } 
     } 
     else { 
      return (
       <div> 
        <h1>Title: {post.title}</h1> 
        <h2>Pages: {post.pages}</h2> 
        <div>Reviews:</div> 
       </div> 
      ) 
     } 
    } 
} 

function mapStateToProps(state) { 
    return { 
     post: state.books.post, 
     user: state.user.post, 
     list: state.list.all 

    } 
} 
export default connect(mapStateToProps, {selectBook, addToMyPage, getBooks, selectUser})(BookDetails); 

回答

1

您可以輕鬆地顯示該按鈕根據您的功能的狀態:

this.state = { 
    show: true 
}; 

====

<div> 
.... 
{this.state.show && <button 
    onClick={() => { this.props.addToMyPage(
      { 
       userId: user.user.user_id, 
       bookId: post.book_id 
      } 
    ); this.setState({show:false})}}> 
    Add this to my page 
</button> 
} 
... 
</div> 

點擊按鈕後 - 將狀態更改爲show: false,這將導致按鈕從DOM中刪除。

+0

我已經更新我的代碼似乎工作,但在控制檯有錯誤enqueueCallback(...)。不完全確定它爲什麼拋出這個錯誤。 – Yh1234

+0

當你運行它沒有setState你沒有得到錯誤?另一種選擇 - 你可以在'setState'調用之外調用'addToMyPage'函數,因爲我不確定這個函數究竟做了什麼(它可能會干擾當前對象) – Dekel

+0

是的,當我沒有做setState時,它沒有拋出錯誤。 對編碼抱歉很新,我不確定在setState之外調用addToMyPage函數是什麼意思。 – Yh1234