对所有项目和所选项目进行反应触发事件

时间:2019-06-15 18:35:34

标签: reactjs

我正在尝试为我单击的项目触发onClick事件。并非所有项目。

<Button onClick = {this.writeComment} varient="outlined" component="span" color="primary">
    {!this.state.isComment ? "Write Comment": "Close"}
</Button> 

{this.state.isComment ? <Comment onSubmit={this.commentSubmit} commentBody={this.state.comment_body} commentChange={this.handleCommentChange}/> : null}

writeComment函数

writeComment = (e)  => {
    e.preventDefault();
    this.setState({
        isComment:!this.state.isComment
    })   
}

这仅应为该项目而不是所有项目提供评论表单。这是在map循环内。

{this.state.images.length > 0 ? (
        this.state.images.map( (img, i) => (     
            <Grid item sm={12} md={12} key={i} style={{ margin: '30px 0px'}}>
                    <Paper style={{padding:'20px 20px'}}>
                        {/* // empty image_title */}
                        <Typography style={{ padding: '30px 5px', letterSpacing:'8px', textTransform:'uppercase'}} variant="h4" align="center">{img.image_title}</Typography> 
                        <Divider style={{ width: '150px', margin:'10px auto', backgroundColor:'#000000'}} variant="middle" />
                    <Image image_url={img.img_url} />   
                    <Typography variant="h6" align="center">{img.user.username}</Typography> 
                    <Typography variant="h6" align="center">{moment(img.created_at).calendar()}</Typography> 
                    <Button onClick = {this.writeComment} varient="outlined" component="span" color="primary">
                        {!this.state.isComment ? "Write Comment": "Close"}
                    </Button>

                    {this.state.isComment ? <Comment onSubmit={this.commentSubmit} commentBody={this.state.comment_body} commentChange={this.handleCommentChange}/> : null}


                    <Button onClick={() => this.deleteImg(img.id)} variant="outlined" component="span" color="primary">
                        Delete
                    </Button>
                </Paper>                              
            </Grid>
        ))
    ) : (
        <div>
            <Grid item md={8}>
                <Typography>No Images yet</Typography>
            </Grid>
        </div>
    )}
</Grid>
{/* Images  */}
</Grid>

完整代码

import React, { Component } from "react";
import Button from '@material-ui/core/Button';
import TextField from '@material-ui/core/TextField';
import Grid from '@material-ui/core/Grid';
import Typography from '@material-ui/core/Typography';
import Paper from '@material-ui/core/Paper';
import ImageUploader from 'react-images-upload';
import Divider from '@material-ui/core/Divider';
import Axios from '../Axios';
import Image from './Image';
import moment from 'moment';
import Comment from './Comment';
class Dashboard extends Component{
    constructor(props){
        super(props);
        this.state = {
            image_url: 'http://www.conservewildlifenj.org/images/artmax_1001.jpg', 
            images: [], 
            description:'',
            upload:false,
            isComment:false,
            comment_body:''
        }
    }
    handleUpload =  file =>  {
        const data = new FormData()
        const image = file[0]
        // console.log(this.state.description)
        // data.append('ourImage', this.state.description)
        data.append('ourImage',image, this.state.description )
        Axios.post('/images/upload', data).then((response) => {
            const newImage = {...response.data}
            console.log(newImage);
            //update component-state
            this.setState({
                description:'',   // resets title after upload
                images: [
                  {
                    id: newImage[0].id,
                    user:{
                        username: newImage[0].user.username
                    },

                    image_title: newImage[0].image_title,
                    img_url: newImage[0].img_url,
                    created_at: new Date().toLocaleString().replace(',', ''),
                    updated_at: new Date().toLocaleString().replace(',', '')
                  },
                  ...this.state.images
                ]
              })

        });
    }
    handleChange = (e) => {
        // e.preventDefault();
        this.setState({
            [e.target.name]: e.target.value
        })
        // console.log(this.state.description)
    }

    handleCommentChange = (e) => {
        this.setState({
            comment_body: e.target.value
        })
    }
    componentWillMount(){
        Axios.get('/images/uploads').then( (response) => {
            // let img;
            // let imgTitle;
            Object.keys(response.data).forEach( (key) => {
                console.log(response.data[key]);
                this.setState({
                    images:[ ...this.state.images, response.data[key]]
                })
                console.log(this.state.images);
            });
        })
    }
    componentDidUpdate(prevProps, prevState) {
        if (this.state.images.length !== prevState.images.length) {
            console.log(this.state.images);
        }
        // debugger;
    }
    onUploadClick = (e) => {
        e.preventDefault();
        this.setState({
            upload: !this.state.upload
        })
    }
    deleteImg = (id) => {
        Axios.post(`/images/delete/${id}`).then( () => {
           this.setState({
               images: [ ...this.state.images.filter(img => img.id !== id)]
           })
        })
    }
    writeComment = (e)  => {
        e.preventDefault();
        this.setState({
            isComment:!this.state.isComment
        })   
    }
    commentSubmit = (e) => {
        e.preventDefault();
        console.log(this.state.comment_body);
        // Axios.post('/images/newComment', this.state.comment_body).then( (response )=> {
        //     const newComment = { ...response.data};
        //     console.log(newComment);
        //     this.setState({
        //         comment_body: ''
        //     })
        // })
    }
    render(){
        const uploader = ( 
            <ImageUploader
                withIcon={true}
                withPreview={true}
                onChange={this.handleUpload}
                singleImage={true}
                buttonText='Upload an image'
                imgExtension={['.jpg', '.gif', '.png', '.gif']}
                maxFileSize={5242880}
            />
        )
        return(
            <div>
            <Grid container justify="center" spacing={16}>
                <Grid item sm={8} md={6} style={{ margin: '40px 0px', padding: '0px 30px'}}>
                    <Typography align="center" variant="h6">
                        Welcome to the Dashboard
                    </Typography>
                        <Button onClick={this.onUploadClick} variant="outlined" component="span" color="primary">
                            {/* toggle between Upload or Close
                                Will be upload by default, else if upload is clicked, close will show.
                            */}
                            {!this.state.upload ? "Upload": "Close"}

                        </Button>
                        <br></br>
                        <br></br>
                        {this.state.upload ? (
                            <div>
                             <TextField
                                 id="outlined-name"
                                 label="Image Title"
                                 name="description"
                                 type="text"
                                 required={true}
                                 fullWidth
                                 style={{ borderRadius: '0px'}}
                                 className=""
                                 value={this.state.description}
                                 onChange={this.handleChange}
                                 margin="normal"
                               />
                                <br></br>
                                <br></br>
                                {/* so here what we are saying, if this text field is FILLED show the uploader component 
                                else hide it.
                                */}
                                {this.state.description ? uploader : null}

                            </div>
                        ):(
                            null
                        )}
                    {this.state.images.length > 0 ? (
                        this.state.images.map( (img, i) => (     
                            <Grid item sm={12} md={12} key={i} style={{ margin: '30px 0px'}}>
                                    <Paper style={{padding:'20px 20px'}}>
                                        {/* // empty image_title */}
                                        <Typography style={{ padding: '30px 5px', letterSpacing:'8px', textTransform:'uppercase'}} variant="h4" align="center">{img.image_title}</Typography> 
                                        <Divider style={{ width: '150px', margin:'10px auto', backgroundColor:'#000000'}} variant="middle" />
                                    <Image image_url={img.img_url} />   
                                    <Typography variant="h6" align="center">{img.user.username}</Typography> 
                                    <Typography variant="h6" align="center">{moment(img.created_at).calendar()}</Typography> 
                                    <Button onClick = {this.writeComment} varient="outlined" component="span" color="primary">
                                        {!this.state.isComment ? "Write Comment": "Close"}
                                    </Button>

                                    {this.state.isComment ? <Comment onSubmit={this.commentSubmit} commentBody={this.state.comment_body} commentChange={this.handleCommentChange}/> : null}


                                    <Button onClick={() => this.deleteImg(img.id)} variant="outlined" component="span" color="primary">
                                        Delete
                                    </Button>
                                </Paper>                              
                            </Grid>
                        ))
                    ) : (
                        <div>
                            <Grid item md={8}>
                                <Typography>No Images yet</Typography>
                            </Grid>
                        </div>
                    )}
                </Grid>
                {/* Images  */}
                </Grid>
            </div>
        )
    }
}
export default Dashboard;

1 个答案:

答案 0 :(得分:1)

 onClick ={() => this.writeComment(image.id)} //id of your item

writeComment = (id)  => {
        this.setState({
            isComment: this.state.isComment ? '' : id // check if you state is filled to toggle on/off comment
        })   
    }
 {this.state.isComment === image.id ? <Comment onSubmit={this.commentSubmit} commentBody={this.state.comment_body} commentChange={this.handleCommentChange}/> : null}